<?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: abhay-j</title>
    <description>The latest articles on DEV Community by abhay-j (@abhayj).</description>
    <link>https://dev.to/abhayj</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%2F1253834%2F52827b36-f103-453b-9ad3-54795b1798a5.png</url>
      <title>DEV Community: abhay-j</title>
      <link>https://dev.to/abhayj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhayj"/>
    <language>en</language>
    <item>
      <title>lecture 5 (HTMLLMS):</title>
      <dc:creator>abhay-j</dc:creator>
      <pubDate>Tue, 01 Apr 2025 19:52:12 +0000</pubDate>
      <link>https://dev.to/abhayj/lecture-5-htmllms-1d29</link>
      <guid>https://dev.to/abhayj/lecture-5-htmllms-1d29</guid>
      <description>&lt;h2&gt;
  
  
  Points
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;GPT models are trained on huge amounts of data. The sources of data include common crawl, Wikipedia, books, news articles, scientific journals, reddit posts etc. &lt;/li&gt;
&lt;li&gt;GPT models are just scaled up version of the classical transformer architecture. scaled up = shit loads of parameters (hundereds of billions) and many more layers of transformers. &lt;strong&gt;GPT-3 has 96 transformer layers and 175 billion parameters&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;GPT models do not have an encoder, unlike the classical Transformer architecture. &lt;/li&gt;
&lt;li&gt;The pre-training for these models is done in an un-supervised way, meaning, there is no output label. Or you could say the output label is already present in the input sentence. 

&lt;ul&gt;
&lt;li&gt;Example : Input: Big Brains.&lt;/li&gt;
&lt;li&gt;Input is broken down into "Big", "Brains" &lt;/li&gt;
&lt;li&gt;"Big" -&amp;gt; input to the model -&amp;gt; model tries to predict "Brains"&lt;/li&gt;
&lt;li&gt;Obviously the model fails, we calculate the loss and use 
backpropogation to update the weights of the transformer archthiture using SGD
&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%2Fixu4mpyfkvwiabv8lo0o.png" alt="Image description" width="800" height="379"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The models are auto-regressive, meaning, the output of the previous iteration is added to the input in the next iteration. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why We Code</title>
      <dc:creator>abhay-j</dc:creator>
      <pubDate>Wed, 08 Jan 2025 20:16:26 +0000</pubDate>
      <link>https://dev.to/abhayj/why-we-code-36hp</link>
      <guid>https://dev.to/abhayj/why-we-code-36hp</guid>
      <description>&lt;p&gt;What sets humans apart from other animals is our ability to build tools and use them to fulfill our goals and desires. These tools often compensate for the limitations of our senses and physical capabilities.&lt;/p&gt;

&lt;p&gt;For example, early humans threw stones at animals or fruits hanging from trees to make up for their short limbs or limited speed. They crafted pointy objects to replace the claws and fangs they lacked. As we began to understand the world around us, we discovered the need for counting, computation, and storing information. These innovations freed up time to make more abstract observations and further explore our environment.&lt;/p&gt;

&lt;p&gt;Just as physical tools extended our bodily capabilities, computational tools have extended our mental capabilities. By leveraging computation, we can focus on the finer aspects of the problems we aim to solve.&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%2F5netcqjqnzxbhlkvehvx.jpeg" 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%2F5netcqjqnzxbhlkvehvx.jpeg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Types of Problems
&lt;/h2&gt;

&lt;p&gt;I like to categorize the problems humans solve into two types:&lt;/p&gt;

&lt;p&gt;Problems that do not require dimensional shifts in consciousness or understanding of the universe.&lt;br&gt;
Problems that do require dimensional shifts in our understanding of the universe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linear Progress (Same-Dimensional Evolution)
&lt;/h2&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%2F4gpl491zkkc9zcog0v2z.jpeg" 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%2F4gpl491zkkc9zcog0v2z.jpeg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we solve problems within the same dimension, we achieve linear progress. This involves making things faster, more efficient, or slightly better. Examples include the progression from a horse cart to an automobile to a faster automobile, or from classroom teaching to online video lectures to interactive online courses.&lt;/p&gt;

&lt;p&gt;In computing, the evolution from the abacus to a calculator illustrates linear improvement in computation. These innovations enhance efficiency while staying within the same conceptual framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dimensional Shifts
&lt;/h2&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%2Fcavymbpqgge7gdua1ct3.jpeg" 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%2Fcavymbpqgge7gdua1ct3.jpeg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When problems require dimensional shifts, they necessitate a fundamental transformation in consciousness to comprehend the solution space. For example, the transition from hunting and gathering to agriculture was not merely a matter of better tools for finding food. It required humans to develop a new understanding of their relationship with nature, time, and sustenance, encompassing concepts like seasons, plant cycles, and long-term planning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples from Computing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Same-Dimensional Evolution&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Abacus (circa 2400 BC)&lt;/strong&gt;: Enhanced arithmetic calculations by streamlining manual counting methods. While efficient, it remained within the existing numerical framework.&lt;br&gt;
&lt;strong&gt;Tally Sticks and Clay Tokens&lt;/strong&gt;: Improved record-keeping by offering tangible methods to track quantities and transactions without altering the principles of data recording.&lt;br&gt;
&lt;strong&gt;Charles Babbage's Difference Engine (1822)&lt;/strong&gt;: Mechanized mathematical calculations, increasing speed and accuracy but maintaining the existing paradigm of mathematical computation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dimensional Shifts&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Antikythera Mechanism (circa 100-150 BC)&lt;/strong&gt;: Mechanized the prediction of astronomical positions and eclipses, shifting from viewing celestial events as unpredictable to understanding them as calculable phenomena. This integration of mechanical engineering and astronomy represented a transformative approach.&lt;br&gt;
&lt;strong&gt;Jacquard Loom (1804)&lt;/strong&gt;: Introduced punched cards to control weaving patterns, demonstrating that instructions could be encoded and executed by machines. This innovation laid the foundation for modern computing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Current Challenge
&lt;/h2&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%2Fzg4pwk6scr5p8ydsvk1w.jpeg" 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%2Fzg4pwk6scr5p8ydsvk1w.jpeg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
Today, we often solve the same issues repeatedly, focusing on incremental improvements to existing systems. While efficiency is important, one-dimensional thinking limits us from exploring the full potential of modern machines. As we develop higher computational power, programming languages with simpler syntax, and generative AI for software creation, we must address problems that require dimensional shifts.&lt;/p&gt;

&lt;p&gt;For example, while artificial intelligence excels at automating processes, its potential in solving existential issues like climate change remains underexplored. To unlock this potential, we must step back and ask, Why does this problem exist? Addressing the 'why' can uncover deeper, underlying issues and lead to transformative solutions.&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%2Fqwf620iqwtqusxztkrv6.jpeg" 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%2Fqwf620iqwtqusxztkrv6.jpeg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future of Computing
&lt;/h2&gt;

&lt;p&gt;The future of computing lies not in merely accelerating familiar processes but in understanding why things are the way they are and creating meaningful improvements. Just as humanity redefined itself through agriculture and programmable machines, we must now pursue the next dimensional shift.&lt;/p&gt;

&lt;p&gt;The tools we build should go beyond enhancing current capabilities. They should challenge our assumptions, expand our consciousness, and open new frontiers of understanding. By doing so, we can create solutions that are not only efficient but also profoundly impactful.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Datadog vs AWS Native Tools: Choosing the Right Monitoring Solution</title>
      <dc:creator>abhay-j</dc:creator>
      <pubDate>Sun, 06 Oct 2024 20:05:09 +0000</pubDate>
      <link>https://dev.to/abhayj/datadog-vs-aws-native-tools-choosing-the-right-monitoring-solution-505l</link>
      <guid>https://dev.to/abhayj/datadog-vs-aws-native-tools-choosing-the-right-monitoring-solution-505l</guid>
      <description>&lt;p&gt;As cloud infrastructure becomes increasingly complex, choosing the right monitoring and optimization tools is crucial. In this post, we'll compare Datadog's offerings (Cloud Cost management, Continuous Profiler and Network Performance Monitoring)  with AWS native tools to help you decide which solution best fits your needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloud Cost Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Datadog Cloud Cost Management (CCM)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Multi-cloud support (AWS, Azure, GCP, and others)&lt;/li&gt;
&lt;li&gt;Integration with performance metrics and application data&lt;/li&gt;
&lt;li&gt;Detailed cost breakdowns by teams, services, and usage types&lt;/li&gt;
&lt;li&gt;Advanced, customizable dashboards and reports&lt;/li&gt;
&lt;li&gt;AI-driven cost optimization suggestions&lt;/li&gt;
&lt;li&gt;Near real-time cost updates&lt;/li&gt;
&lt;li&gt;Custom metrics for tracking unit economics&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AWS Cost Explorer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS-specific focus&lt;/li&gt;
&lt;li&gt;Native integration with AWS services&lt;/li&gt;
&lt;li&gt;Basic cost forecasting capabilities&lt;/li&gt;
&lt;li&gt;Budgeting and alerting features&lt;/li&gt;
&lt;li&gt;Reserved Instance recommendations&lt;/li&gt;
&lt;li&gt;Daily data updates with some real-time features&lt;/li&gt;
&lt;li&gt;Standard graphs and reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to use Datadog CCM:&lt;/strong&gt; Multi-cloud environments or when deeper cost insights correlated with performance data are needed.&lt;br&gt;
&lt;strong&gt;When to use AWS Cost Explorer:&lt;/strong&gt; AWS-only environments or when basic cost tracking is sufficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Profiling
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Datadog Continuous Profiler
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Supports multiple languages (Java, Python, Go, Ruby, Node.js)&lt;/li&gt;
&lt;li&gt;Continuous operation in production with minimal overhead&lt;/li&gt;
&lt;li&gt;Flamegraph visualizations&lt;/li&gt;
&lt;li&gt;Integration with other Datadog products&lt;/li&gt;
&lt;li&gt;Code-level insights for CPU and memory usage&lt;/li&gt;
&lt;li&gt;Thread Timeline feature for analyzing thread activity&lt;/li&gt;
&lt;li&gt;Multi-cloud support&lt;/li&gt;
&lt;li&gt;Garbage collection analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AWS Profiling Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AWS X-Ray: Tracing for distributed applications, basic profiling for Lambda functions&lt;/li&gt;
&lt;li&gt;Amazon CodeGuru Profiler: Continuous profiling for Java and Python, cost optimization recommendations&lt;/li&gt;
&lt;li&gt;AWS CloudWatch: Basic performance monitoring and metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Differences:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scope: Datadog is multi-cloud, AWS tools are AWS-specific&lt;/li&gt;
&lt;li&gt;Language support: Datadog supports more languages&lt;/li&gt;
&lt;li&gt;Visualization: Datadog offers more advanced flamegraphs&lt;/li&gt;
&lt;li&gt;Integration: AWS tools integrate natively with AWS, Datadog integrates across platforms&lt;/li&gt;
&lt;li&gt;Depth of analysis: Datadog provides more granular, code-level insights&lt;/li&gt;
&lt;li&gt;Ease of use: AWS tools may be simpler to set up for AWS users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to use Datadog Continuous Profiler:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-cloud or hybrid environments&lt;/li&gt;
&lt;li&gt;Need for detailed, code-level insights&lt;/li&gt;
&lt;li&gt;Profiling applications in languages not supported by AWS CodeGuru&lt;/li&gt;
&lt;li&gt;Advanced thread analysis requirements&lt;/li&gt;
&lt;li&gt;Already using other Datadog products&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to use AWS Native Profiling Tools:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS-only environments&lt;/li&gt;
&lt;li&gt;Profiling Java or Python applications (CodeGuru)&lt;/li&gt;
&lt;li&gt;Tight integration with AWS services is required&lt;/li&gt;
&lt;li&gt;Basic tracing and profiling of Lambda functions (X-Ray)&lt;/li&gt;
&lt;li&gt;Preference for native AWS tooling&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Network Monitoring
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Datadog Network Performance Monitoring (NPM)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Visibility into traffic between services, containers, and availability zones across clouds&lt;/li&gt;
&lt;li&gt;Detailed network maps and traffic flow visualizations&lt;/li&gt;
&lt;li&gt;Near real-time insights&lt;/li&gt;
&lt;li&gt;Service-level insights correlated with application performance&lt;/li&gt;
&lt;li&gt;Cross-AZ traffic analysis&lt;/li&gt;
&lt;li&gt;Integration with other Datadog products&lt;/li&gt;
&lt;li&gt;Deep packet inspection for application-layer protocols&lt;/li&gt;
&lt;li&gt;Custom network performance metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Amazon VPC Flow Logs &amp;amp; CloudWatch
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;VPC Flow Logs: Captures IP traffic data for network interfaces in VPC&lt;/li&gt;
&lt;li&gt;CloudWatch: Basic network metrics for AWS resources, alerting, and custom dashboards&lt;/li&gt;
&lt;li&gt;Native integration with AWS services&lt;/li&gt;
&lt;li&gt;Basic log analysis with CloudWatch Logs Insights&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Differences:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scope: NPM is multi-cloud, VPC Flow Logs are AWS-specific&lt;/li&gt;
&lt;li&gt;Granularity: NPM provides more detailed, service-level insights&lt;/li&gt;
&lt;li&gt;Visualization: NPM offers more advanced network visualizations&lt;/li&gt;
&lt;li&gt;Real-time analysis: NPM provides near real-time insights&lt;/li&gt;
&lt;li&gt;Application-layer visibility: NPM offers deeper protocol analysis&lt;/li&gt;
&lt;li&gt;Ease of use: VPC Flow Logs with CloudWatch may be simpler for AWS users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to use Datadog NPM:&lt;/strong&gt; For comprehensive network insights, especially in multi-cloud or hybrid environments.&lt;br&gt;
&lt;strong&gt;When to use AWS VPC Flow Logs:&lt;/strong&gt; For basic network monitoring in AWS-only environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Datadog offers more comprehensive, detailed, and cross-platform insights.&lt;/li&gt;
&lt;li&gt;AWS native tools provide solid monitoring capabilities for AWS environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose Datadog when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Operating in a multi-cloud or hybrid environment&lt;/li&gt;
&lt;li&gt;Deep, code-level performance insights are needed&lt;/li&gt;
&lt;li&gt;Correlation of cost, performance, and network data in a single platform is desired&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose AWS native tools when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exclusively using AWS services&lt;/li&gt;
&lt;li&gt;Basic monitoring and cost management are sufficient&lt;/li&gt;
&lt;li&gt;Native integration with AWS services is preferred&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The choice depends on specific needs, infrastructure complexity, and budget. Many organizations use a combination of both to get the best of both worlds.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Reverse Engineering Architectural Decisions</title>
      <dc:creator>abhay-j</dc:creator>
      <pubDate>Sun, 28 Jan 2024 23:59:03 +0000</pubDate>
      <link>https://dev.to/abhayj/reverse-engineering-architectural-decisions-1boc</link>
      <guid>https://dev.to/abhayj/reverse-engineering-architectural-decisions-1boc</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;System:&lt;/strong&gt; Eclipse
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Design Pattern 1:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Plugin Pattern &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Eclipse system and plugin is used for modular development. It  is a complex and flexible integrated development environment (IDE) used for a variety of programming languages and development jobs. It is difficult to create a monolithic application using Eclipse while remaining simple to maintain and upgrade. Also, if customers want to customize functionality then that is not provided by the IDE.&lt;/p&gt;

&lt;p&gt;In order to tackle the problems addressed above the following approaches can be followed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The complexity of constructing a monolithic program can be reduced by splitting development tasks down into smaller, modular parts enabled by plugins. This modular approach to development simplifies development while also boosting maintainability and upgradeability.&lt;/li&gt;
&lt;li&gt;Furthermore, the extensibility feature allows users to personalize their integrated development environment (IDE) by adding or removing plugins, hence providing a better experience that aligns with their needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Various elements (e.g., classes, files, data structures) involved and what is their&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;responsibility:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The different elements are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eclipse Core&lt;/strong&gt;: It contains the basic design and functionality containing classes to manage the user interface, workspace, and vital services such as management of projects and code writing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin&lt;/strong&gt;: It is an independent block of operation made up of Java classes, XML configuration files, resources (such icons or templates), and extension points. Its main goal is to establish, execute, and add features to Eclipse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extension Points&lt;/strong&gt;: The Eclipse core defines Extension Points, which determine where plugins can provide functionality in the system are usually defined in XML files and show what kinds of extensions they expect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensions&lt;/strong&gt;: These are described in XML and specify how a plugin's functionality should be integrated into the Eclipse core and are contributed by plugins to extension points.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Constraints&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The constraints are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Development Guidelines&lt;/strong&gt;: Eclipse has specified development principles that plugin developers must adhere to. These recommendations cover things like naming conventions, version control, packaging requirements, and license terms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constraint on Core Modification:&lt;/strong&gt; Plugins should not modify or make changes in the Eclipse core directly. This can cause problems with compatibility and instability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean and Stable API&lt;/strong&gt;: Plugins must provide a well-defined and stable API via which other plugins can interact. This promotes reusability and modularity, allowing plugins to communicate effectively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency Management&lt;/strong&gt;: Dependencies between plugins are possible and therefore it is critical to carefully manage these dependencies, suggesting which versions of other plugins are essential, to ensure that the system operates correctly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;References and relationships between elements are as follows:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Required References and Relationships:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Plugins should reference and contribute to the extension points created by the Eclipse core which is necessary for plugins to integrate their functionality into the Eclipse system.&lt;/li&gt;
&lt;li&gt;Extensions for plugins must specify how their functionality will be incorporated into the Eclipse core.&lt;/li&gt;
&lt;li&gt;Sometimes plugins rely on modifications and changes based on other plugins, leading to interdependencies that augments the system's functionality.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prohibited Relationships:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Plugins should avoid directly changing or modifying the inner workings of the Eclipse core which can result in compatibility problems and system crashes. Instead, plugins must expand their functionalities through designated extension points for a smoother and more reliable integration.&lt;/li&gt;
&lt;li&gt;Furthermore, plugins should not form tight coupling with other plugins. This could create complications for the system's flexibility and ease of maintenance. Therefore plugins should communicate through well-defined, clean Application Programming Interfaces (APIs), which simplifies the process.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Consequences: Advantages and Disadvantages that adopting this particular design pattern has on the system&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The consequences are as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modularity:&lt;/strong&gt; This paradigm imposes a modular structure, making it easier for developers to work independently on and maintain specific plugins. They may focus on their specific functionalities without having to deal with the full codebase. It speeds up the development and testing processes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensibility&lt;/strong&gt;: Eclipse users can modify their IDE by adding or uninstalling plugins based on their individual development requirements. This versatility is a key advantage because it allows the environment to be customized to each user's specific needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large Developer Ecosystem:&lt;/strong&gt; The plugin approach has aided in the development of a large ecosystem of Eclipse plugins, making it into a robust and versatile programming environment. This robust ecosystem provides developers with access to a diverse set of features and tools, enhancing their development experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Reusability&lt;/strong&gt;: The plugin structure encourages code reuse and sharing. This lowers redundancy and encourages collaborative resource sharing for development.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disadvantages:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complexity&lt;/strong&gt;: Problems like version compatibility, performance and conflicts gets created when there are a large number of plugins. Hence, careful version management and compatibility testing is essential.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin Quality Control&lt;/strong&gt;: Poor designed plugins with bugs can cause program crashes and are unstable. Therefore the quality of plugins matter the most.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin development&lt;/strong&gt;: Developing plugins for Eclipse might require a deep knowledge of the platform. Understanding Eclipse's plugin framework and following its guidelines can be challenging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency Management&lt;/strong&gt;: Creating Eclipse plugins is difficult and it is complex to make sure that the plugins logic and its functionalities does not affect the other plugins functionalities and dependencies.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;Design Pattern 2:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observer Pattern&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The main challenge within Eclipse is to maintain various aspects of the user interface (UI) in sync with the underlying data while quickly displaying any changes. When a developer, for example, updates a source code file in Eclipse, it's important that UI elements such as editor views, outline views, and issues views quickly reflect the most recent content and errors as they occur. The needed solution allows these UI components to sync with the data and react to changes without requiring constant human checks or refreshes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We can solve this problem by using the Observer Pattern. It's similar to setting up a communication system in which one entity (subject) keeps a list of others (observers) and notifies them whenever it changes. This pattern ensures that the various UI components act as observers in the Eclipse environment. They monitor things like source code documents and automatically update themselves when these documents change. This creative solution will allow the Eclipse IDE to maintain full sync with the underlying data, resulting in real-time updates in the UI components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elements (e.g., classes, files, data structures) involved and the responsibility of each:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The different elements are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Subject:&lt;/strong&gt; In Eclipse, the subject is a document or a resource, such as a source code document whose responsibility is to maintain a list of observers (UI components) and provide methods for registering, unregistering, and notifying observers of changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observer:&lt;/strong&gt; Observers are the various UI components in Eclipse, like editor views, outline views, and problems views whose responsibility is to update themselves based on the notifications received from the subject.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Constraints :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The subject should not be aware of its observers' existence. It communicates with observers through a common interface, which promotes loose coupling and flexibility.&lt;/p&gt;

&lt;p&gt;Observers should be able to subscribe (register) and unsubscribe (unregister) from subjects dynamically to accommodate changes in the UI layout or user preferences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References and relationships between the elemenets required or prohibited in order to achieve the goals of the design pattern&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In order to achieve the goals of the Observer Pattern in Eclipse, specific references and relationships between elements are required or prohibited:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Required Relationships:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subject-Observable Relationship:&lt;/strong&gt; It's essential to establish a one-to-many relationship between the subject (like a document or resource) and its observers (UI components). The subject keeps a list of observers, and when it undergoes changes, it lets all the registered observers know.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observer-Subject Interface:&lt;/strong&gt; Observers (UI components) are required to follow a common interface, often named IObserver or Observer. This interface defines the methods for receiving updates from the subject. This ensures that all observers behave consistently when reacting to changes in the subject.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registration and Unregistration:&lt;/strong&gt;The subject should offer methods for observers to sign up (subscribe) and opt-out (unsubscribe) dynamically. This allows observers to express their interest in changes and to stop observing when they're no longer interested. These registration and unregistration mechanisms are vital for the Observer Pattern to work effectively in Eclipse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prohibited Relationships:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tight Coupling:&lt;/strong&gt; The Observer Pattern strictly forbids strong connections between the subject and its observers. The subject shouldn't have detailed knowledge of the specific classes of its observers. This restriction means that Eclipse discourages direct dependencies between UI components and the subject, as such dependencies can make the system less adaptable and more challenging to maintain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct Method Calls:&lt;/strong&gt; Observers should avoid directly calling methods on the subject to check for changes and therefore they should rely on the subject to notify them when changes occur. This rule will ensure that observers remain passive and don't actively check the subject for updates, which could be inefficient.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex Dependencies:&lt;/strong&gt; The goal is to avoid complex dependencies among observers. Each observer should keep a straightforward, direct relationship with the subject of interest. This rule is consistent with Eclipse's objective of keeping its element relationship simple and readily apparent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Advantages and disadvantages that adopting this particular design pattern has on the system:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Promotion of Loose Coupling&lt;/strong&gt;: The Observer Pattern promotes loose coupling which ensures that Eclipse's UI components do not need a detailed understanding of the subject's inner workings. This flexibility streamlines system maintenance and the addition of new elements without disrupting existing components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time Updates&lt;/strong&gt;: Within Eclipse, the Observer Pattern guarantees that UI components remain in sync with underlying data in real-time. Whenever a document or resource changes, relevant UI components update automatically. This real-time synchronization ensures a responsive and user-friendly experience, enhancing developer efficiency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced Extensibility&lt;/strong&gt;: The Observer Pattern helps with easy integration of new UI components as observers without changing existing subjects. This extensibility is especially valuable in Eclipse's dynamic environment, facilitating the continuous integration of fresh features and tools without extensive modifications to existing components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficient Resource Management&lt;/strong&gt;: The Observer Pattern contributes to efficient resource management. UI components can dynamically register and unregister themselves as observers, ensuring resource allocation to components as needed. This dynamic process prevents resource wastage and optimizes resource utilization.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disadvantages:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Additional Workload:&lt;/strong&gt; Applying the Observer Pattern may result in increased processing, particularly when a subject has numerous observers. Notifying and updating multiple observers can consume system resources but Eclipse is well-equipped to handle this extra workload efficiently. This potential impact on performance is generally well managed in today's computing environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk of Memory Leaks&lt;/strong&gt;: Failure to correctly unregister observers when they are no longer needed might result in Eclipse memory leaks. The subject keeps track of its observers, and failing to unregister them may prevent the garbage collector from releasing resources associated with these observers. To avoid memory-related difficulties, developers must be attentive in managing the registration and unregistration of observers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Added Complexity&lt;/strong&gt;: Implementing the Observer Pattern can add complexity to the Eclipse codebase. Developers must thoroughly understand the interactions between subjects and observers, as well as guarantee that observers function properly. In a large and complex system like Eclipse, managing these interactions can be difficult. As a result, careful design and documentation are critical to avoiding unforeseen effects such as circular dependencies or performance concerns.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;Design Pattern 3:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Singleton Pattern&lt;/p&gt;

&lt;p&gt;In Eclipse IDE, there is a need for a consistent way to access unique instance of a certain class, ensuring that there is only one instance of the class throughout the application. For example, applications often need to create and manage database sessions, which are a means to connect to a database. Manually creating and managing these sessions is cumbersome and error-prone especially when the application needs to ensure that there is only one instance of session per configuration. The Session manager automates this process, ensuring that sessions are correctly instantiated and managed throughout the application’s lifecycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Session Manager itself is implemented as Singleton, which means it is a globally accessible object that ensures there is only one instance of itself. The singleton pattern is used here to ensure that the Session manager and the Cached sessions can be accessed from any part of the application without creating multiple instances, which could lead to inconsistent states or overconsumption of resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The participants:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elements (e.g., classes, files, data structures) involved and the responsibility of each:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Eclipselink Session manager has several elements that work together to manage database sessions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Session Manager&lt;/strong&gt;: This is a static utility class that acts as a central point for managing sessions in EclipseLink. It is responsible for:

&lt;ul&gt;
&lt;li&gt;Load sessions from a configuration file (sessions.xml).&lt;/li&gt;
&lt;li&gt;Caching these sessions to prevent unnecessary information.&lt;/li&gt;
&lt;li&gt;Providing a global access point to these sessions.&lt;/li&gt;
&lt;li&gt;Ensuring that only one instance of each session exists.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;xml&lt;/strong&gt;: This is a configuration file that describes the sessions that the Session Manager should manage. It contains the session names and their corresponding details such as database connections and settings. Its responsibilities include:

&lt;ul&gt;
&lt;li&gt;Defining the session configuration.&lt;/li&gt;
&lt;li&gt;Specifying the session type (e.g., ServerSession, DatabaseSession, SessionBroker)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;ServerSession&lt;/strong&gt;: This is a class that represents a session intended for server-side use. It is responsible for:

&lt;ul&gt;
&lt;li&gt;Managing connections to the database.&lt;/li&gt;
&lt;li&gt;Serving as a factory for other sessions, like client sessions and unit of work&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;SessionBroker&lt;/strong&gt;: This is a class that acts as a broker to manage multiple DatabaseSession instances. Its responsibilities are:

&lt;ul&gt;
&lt;li&gt;Allowing an application to use multiple DatabaseSession instances as if they were a single session.&lt;/li&gt;
&lt;li&gt;Facilitating transactions that span multiple databases.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;DatabaseSession&lt;/strong&gt;: This is a class that represents a session specifically for database operations. It is responsible for:

&lt;ul&gt;
&lt;li&gt;Direct database connectivity and operations.&lt;/li&gt;
&lt;li&gt;Transaction management.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;ClientSession&lt;/strong&gt;: Although not mentioned in the initial explanation, a ClientSession would typically be a session derived from a ServerSession for client-specific operations in a multi-tiered application. It is responsible for:

&lt;ul&gt;
&lt;li&gt;Handling client requests.&lt;/li&gt;
&lt;li&gt;Isolating client work from other clients.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Unit of Work&lt;/strong&gt;: This is a data structure that represents a transactional context for a set of database operations. It is responsible for:

&lt;ul&gt;
&lt;li&gt;Transaction management and isolation.&lt;/li&gt;
&lt;li&gt;Change tracking and persistence.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Constraints :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Singleton Constrain on Session Manager:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There can only be one Session Manager in the application to maintain the integrity of the session management.&lt;/li&gt;
&lt;li&gt;The Session Manager must be accessible from any point in the application without multiple instantiations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration Constraint on Session Manager:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;The Sessions.xml file must be well-formed and valid according to the EclipseLink schema for session Configurations.&lt;/li&gt;
&lt;li&gt;It must be located in one of the expected paths (either the root of the classpath or within the META-INF directory)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Uniqueness Constraint on Sessions:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Each session managed by Session Manager must have a unique name that serves as an identifier.&lt;/li&gt;
&lt;li&gt;Only one instance of each named session can exist within the application to prevent resource conflicts and ensure consistency.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;References and relationships between elements either required or prohibited in order to achieve the goals of the design pattern:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Required References and Relationships:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reference to Configuration&lt;/strong&gt;: For the purpose of creating and managing session instances, the Session Manager has to be able to refer to the sessions.xml file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name-based Mapping&lt;/strong&gt;: The session instances that the Session Manager creates and manages must be directly related to the session names specified in the sessions.xml file. As a result, session instances can be retrieved using only their names.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inheritance and Interface Implementation&lt;/strong&gt;: Session classes, including ServerSession, DatabaseSession, and SessionBroker, are required to implement a single interface or derive from a common base class that defines the session contract. This is necessary for polymorphism so that all sessions can be handled equally by the Session Manager.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lifecycle Hooks&lt;/strong&gt;: To make sure that resources are handled properly, hooks or callbacks should be used to manage the lifecycle of sessions, including initialization and disposal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prohibited References and Relationships:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct Instantiation&lt;/strong&gt;: Direct instantiation of the Singleton Session Manager from outside the manager itself is prohibited. All requests for session instances must go through the Session Manager's access point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple References to Singleton Instance&lt;/strong&gt;: Multiple references to the Session Manager's Singleton instance should be avoided as this could result in multiple paths for initialization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ad-hoc Session Creation&lt;/strong&gt;: It is usually forbidden to create sessions that are not under the control of the Session Manager because doing so would evade the management and caching techniques and might result in inconsistent states or resource leaks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Session References&lt;/strong&gt;: Direct references between sessions should be avoided as this may lead to difficult-to-manage dependencies that compromise scalability and maintainability. Rather, they ought to converse via the Session Manager or via shared resources under its supervision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static References to Session Instances&lt;/strong&gt;: Since they violate the controlled access concept of the Singleton pattern and may result in memory leaks, static or global references to session objects are forbidden.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Consequences: what are the advantages and disadvantages of this design pattern has on the system&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controlled Instance Creation&lt;/strong&gt;: Multiple instantiation of the Session Manager can be avoided by making sure that only one instance is produced. This helps prevent problems like inconsistent setups or excessive resource utilization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global Access&lt;/strong&gt;: It is simpler to access and manage sessions from anywhere in the application when there is a single, globally accessible point for that purpose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Memory Footprint&lt;/strong&gt;: Compared to having several instances of the class, the memory footprint is smaller since there is only one instance of the Session Manager.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced Data Integrity&lt;/strong&gt;: The Singleton pattern facilitates data integrity by centralizing session management, which makes transactions easier to handle by directing all database interactions through a single point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ease of Configuration&lt;/strong&gt;: Configuring and modifying session properties becomes simpler when there is only one session management point because changes can be made there.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disadvantages:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single Point of Failure&lt;/strong&gt;: Within the program, the Session Manager turns into a single point of failure. The entire application may be impacted by problems with the session manager.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing Difficulties&lt;/strong&gt;: Because they frequently do not adhere to the dependency injection principle, singletons might be difficult to mock or stub during unit testing, which makes the tests less independent and more difficult to create.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability Concerns&lt;/strong&gt;: Singleton objects have the potential to be a bottleneck in the system, particularly in applications with many threads that require simultaneous access to the session manager.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inflexibility&lt;/strong&gt;: Since the Singleton paradigm imposes the use of a single instance, it might result in inflexibility as it becomes more difficult to extend or modify the Session Manager when application demands change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tight Coupling&lt;/strong&gt;: Singleton-using system components are closely linked to the particular singleton class implementation, which might complicate system modifications and compromise maintainability.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Contributions:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rushil Desetty&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mohnish Hitendrabhai Raval&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Abhay Joshi&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Microservices Architecture for George Mason University’s Course Registration System</title>
      <dc:creator>abhay-j</dc:creator>
      <pubDate>Sun, 28 Jan 2024 23:57:49 +0000</pubDate>
      <link>https://dev.to/abhayj/microservices-architecture-for-george-mason-universitys-course-registration-system-21b0</link>
      <guid>https://dev.to/abhayj/microservices-architecture-for-george-mason-universitys-course-registration-system-21b0</guid>
      <description>&lt;h3&gt;
  
  
  Appropriate Architecture Pattern/Style: Microservices
&lt;/h3&gt;

&lt;p&gt;George Mason University's course registration system faces fluctuating traffic throughout the academic year. Adopting a Microservices architecture provides the ability to dynamically scale up services based on demand. For instance, during peak course registration periods, scaling up user management and registration services becomes essential to efficiently handle increased traffic.&lt;/p&gt;

&lt;p&gt;The increased modularity inherent in Microservices architecture offers several advantages. It facilitates easier maintenance and debugging while enabling faster rollout of updates. This is achievable as development teams can concurrently work on multiple modules. Additionally, the system gains enhanced fault tolerance due to increased modularity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Non-Functional Requirements/Quality Attributes:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scalability:&lt;/strong&gt; The system must horizontally scale to accommodate peak registration periods and a growing user base over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Availability:&lt;/strong&gt; Given the anticipated surge in traffic during peak registration periods, maintaining high availability and minimizing downtime is crucial for uninterrupted service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Robust security measures, including two-factor authentication, must be implemented to safeguard sensitive user data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance:&lt;/strong&gt; Rapid course filling necessitates a high-performance system to ensure swift and responsive user interactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability:&lt;/strong&gt; Each microservice should demonstrate reliability and resilience. Implementing proper error handling, logging, and monitoring is imperative to swiftly identify and address issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interoperability:&lt;/strong&gt; Microservices should effectively communicate through well-defined APIs and protocols to ensure seamless integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Management:&lt;/strong&gt; A robust data management strategy is essential, covering aspects such as data consistency, backup procedures, and disaster recovery plans.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance:&lt;/strong&gt; Ensuring compliance with relevant data protection regulations and standards, such as GDPR or FERPA, is imperative based on the jurisdiction and nature of the handled data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In summary, adopting a Microservices architecture not only addresses the dynamic nature of George Mason's course registration system but also aligns with key non-functional requirements, enhancing scalability, availability, security, performance, reliability, interoperability, data management, and compliance.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>REQUIREMENT MANAGEMENT MINI PAPER.</title>
      <dc:creator>abhay-j</dc:creator>
      <pubDate>Sun, 28 Jan 2024 23:54:49 +0000</pubDate>
      <link>https://dev.to/abhayj/requirement-management-mini-paper-24p6</link>
      <guid>https://dev.to/abhayj/requirement-management-mini-paper-24p6</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;ABSTRACT&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In the complex world of software development and system design, requirement management plays a crucial role in guiding projects towards stakeholder satisfaction and system alignment. This paper dives into the essence of Requirement Management, highlighting its importance in harmonizing stakeholder expectations with deliverables. Further exploration made into industry-leading tools such as JIRA, IBM DOORS, and Helix RM, emphasizing their capabilities in capturing, traceability, versioning of requirements and team collaboration. By comparing these tools, this study offers insights into their unique strengths and alignments with various project needs. Overall, the paper highlights the importance of effective Requirement Management in fostering project clarity, consistency, and successful outcomes.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;INTRODUCTION&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Requirement management(RM) is the process of evaluating, tracking, and prioritizing requirement change. It is a methodical way of gathering, compiling, and describing the system requirements as well as achieving and sustaining agreement between client and project team on the evolving system requirements.&lt;br&gt;
Requirement management is important because it ensures that an organization documents, verifies and meets the needs of the customers and internal or external stakeholders. The role of Requirement management includes: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensuring alignment between the needs of stakeholders and the system's capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It helps in maintaining consistency across the project’s scope which helps in ensuring the&lt;/p&gt;

&lt;p&gt;project delivers what it promises.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;RM minimizes the chance of project scope creep, which avoids the project going over&lt;br&gt;
budget and overtime.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;RM makes sure that the company is working on the right projects and the projects are&lt;br&gt;
being executed correctly.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To manage requirements we use requirement management tools. These tools help us to capture,&lt;br&gt;
track and manage requirements throughout the project development life cycle. These tools help&lt;br&gt;
the organization achieve their requirement management goals. The tools we are going to look at&lt;br&gt;
in this paper are &lt;strong&gt;JIRA, IBM DOORS and HELIX RM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JIRA:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;JIRA allows project teams to create user stories or requirements often tied to a project backlog.&lt;br&gt;
Through customization of fields and workflows, JIRA can adapt to the specific requirements of&lt;br&gt;
the project team seamlessly. JIRA also allows the teams to link user stories to tasks, bugs and test&lt;br&gt;
cases to ensure that the requirements are always met consistently throughout the development&lt;br&gt;
and testing phases. JIRA also keeps track of changes made to requirements which helps the&lt;br&gt;
teams to refer back to previous versions of requirements. JIRA has a version control system&lt;br&gt;
which keeps track of the changes to version. Team collaborations are at the center of JIRAs&lt;br&gt;
workflow by leveraging features such as comments, mentions and shared dashboards. JIRA&lt;br&gt;
integrates with various popular tools, thereby ensuring a seamless flow of information across&lt;br&gt;
platforms.&lt;/p&gt;

&lt;p&gt;In agile project management JIRA stands as a powerhouse. Its features are meticulously designed&lt;br&gt;
to bridge the gap between deliverables and requirements while maintaining collaboration. JIRA&lt;br&gt;
enables team to work more cohesively, ensuring that the final product is in line with the expected&lt;br&gt;
requirements&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IBM DOORS:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IBM DOORS empowers project teams to document detailed requirements with structures&lt;br&gt;
hierarchies. DOORS caters uniquely to nuanced intricacies of the project by leveraging its&lt;br&gt;
specialized modules and attributes. DOORS also provides high traceability by linking high-level&lt;br&gt;
needs to system requirements which ensures the alignment from conceptual validation. DOORS&lt;br&gt;
also, like other tools, maintains archives of user stories to refer back to. Features like comment&lt;br&gt;
reviews and detailed visual traceability aid in team collaboration.&lt;/p&gt;

&lt;p&gt;IBM DOORS is a solution designed to bring clarity and structure to complex projects not just a&lt;br&gt;
requirements management tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Helix RM:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HELIX RM is mainly used in capturing and organizing requirements which are often associated&lt;br&gt;
with project milestones. Like other tools, HELIX RM can be customized to suit the distinctive&lt;br&gt;
demands of project teams. HELIX RM demonstrates extensive traceability by allowing&lt;br&gt;
connections between requirements and their corresponding design or test elements, guaranteeing&lt;br&gt;
alignment throughout the product life cycle. It also maintains an audit trail of all requirement&lt;br&gt;
modifications, allowing teams to refer to historic data. Features like review approvals,&lt;br&gt;
annotations and integrated visual reports help teams collaborate better. The tool ensures deep&lt;br&gt;
connection between requirements and their design or testing elements. HelixRm is the most&lt;br&gt;
efficient tool with its adaptability and comprehensive customization options.&lt;/p&gt;

&lt;p&gt;In conclusion, HELIX RM is more than just a requirements management tool. It’s a complete&lt;br&gt;
solution that addresses the multifaceted needs of project teams, ensuring clarity, coherence, and&lt;br&gt;
collaboration at every step of the product life cycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;COMPARISON OF CAPABILITIES OF THESE TOOLS :&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature/Capability&lt;/th&gt;
&lt;th&gt;JIRA&lt;/th&gt;
&lt;th&gt;IBM DOORS&lt;/th&gt;
&lt;th&gt;Helix RM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Requirements Capture&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traceability&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes (enhanced view)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versioning&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Collaboration&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impact Analysis&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Electronic Signatures&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;CITATIONS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1)  Atlassian. (2017). "JIRA Software Documentation." Atlassian Official Documentation.&lt;br&gt;
[Online]. Available: &lt;a href="https://www.atlassian.com/software/jira/docs" rel="noopener noreferrer"&gt;https://www.atlassian.com/software/jira/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2)  IBM Corporation. (2023). "IBM Engineering Requirements Management DOORS&lt;br&gt;
Family." IBM Official Documentation. [Online]. Available:&lt;br&gt;
&lt;a href="https://www.ibm.com/support/pages/ibm-doors-documentation-library" rel="noopener noreferrer"&gt;https://www.ibm.com/support/pages/ibm-doors-documentation-library&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3)  Perforce Software, Inc. (2023). "Helix RM: Requirements Management Tool." Perforce&lt;br&gt;
OfficialDocumentation. [Online]. Available:&lt;a href="https://www.perforce.com/customers" rel="noopener noreferrer"&gt;https://www.perforce.com/customers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CONTRIBUTIONS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rushil Desetty(G01383984)(GMU)&lt;br&gt;
Mohnish Hitendrabhai Raval(G01373613)(GMU) &lt;br&gt;
Abhay Joshi(G01394679)(GMU)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Reflecting on Agile Manifesto.</title>
      <dc:creator>abhay-j</dc:creator>
      <pubDate>Sun, 28 Jan 2024 23:53:21 +0000</pubDate>
      <link>https://dev.to/abhayj/reflecting-on-agile-manifesto-20fe</link>
      <guid>https://dev.to/abhayj/reflecting-on-agile-manifesto-20fe</guid>
      <description>&lt;p&gt;The Agile Manifesto was written in 2001 and comprises several principles and values that are&lt;/p&gt;

&lt;p&gt;guidelines for building software. After two decades, when the pandemic hit, the software shifted&lt;/p&gt;

&lt;p&gt;to the telecommuting modality. One could question the validity of Agile Manifesto principles&lt;/p&gt;

&lt;p&gt;and values if they uphold modern Software Engineering.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Agile Manifesto focuses on four core principles:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Individuals and interactions over processes and tools.&lt;/li&gt;
&lt;li&gt;Working software over comprehensive documentation.&lt;/li&gt;
&lt;li&gt;Customer collaboration over contract negotiation.&lt;/li&gt;
&lt;li&gt;Responding to change over following a plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The shift to telecommunicating puts a challenge on Individuals and Interactions. The critical&lt;/p&gt;

&lt;p&gt;criteria of this value is to improve the quality of interactions and emphasize the individuals.&lt;/p&gt;

&lt;p&gt;Modern Technology tools such as Zoom and Microsoft Teams yielded virtual meetings and pair&lt;/p&gt;

&lt;p&gt;programming sessions, allowing teams to collaborate closely. The working software remains apt&lt;/p&gt;

&lt;p&gt;in the telecommuting world. Having team members distributed worldwide and having a working&lt;/p&gt;

&lt;p&gt;product that converges all the team members to a single point of direction is crucial. With the&lt;/p&gt;

&lt;p&gt;rise of telecommuting, many business companies have become more virtual. This was mainly&lt;/p&gt;

&lt;p&gt;due to the fact that customer's active and continuous feedback through online communication&lt;/p&gt;

&lt;p&gt;tools. In a telecommuting world, developers and customers are accessing products in the digital&lt;/p&gt;

&lt;p&gt;environment such that the developers are aligned with the needs of the users, which allows for&lt;/p&gt;

&lt;p&gt;making iterative development more responsive. The change to telecommuting obviously imposes&lt;/p&gt;

&lt;p&gt;a challenge. Having distributed teams, varying time zones, and changing home-work&lt;/p&gt;

&lt;p&gt;environments can be a hindrance to communication, cohesion, and productivity. This could&lt;/p&gt;

&lt;p&gt;contradict the Agile’s rapid, immediate, and rich communication. This suggests that Agile should&lt;/p&gt;

&lt;p&gt;not always stick to the predefined plan but respond to change by updating its principles or&lt;/p&gt;

&lt;p&gt;introducing new ones. Focusing on the predefined plan for all the challenges that software is&lt;/p&gt;

&lt;p&gt;facing now or the challenges it will face in the future, will obviously lead to peril.&lt;/p&gt;

&lt;p&gt;Even though the values and principles of the Agile Manifesto seem to abide by modern Software&lt;/p&gt;

&lt;p&gt;Engineering, there is always room for improvement. The Agile Manifesto can improve its&lt;/p&gt;

&lt;p&gt;principles by enforcing some changes in its methodology.&lt;/p&gt;

&lt;p&gt;The Agile Methodologies should emphasize using the telecommuting and collaboration tools&lt;/p&gt;

&lt;p&gt;effectively. The teams should maximize the efficacy of the communication tools while&lt;/p&gt;

&lt;p&gt;improving in Software Engineering. Telecommunication involves synchronous (virtual meetings,&lt;/p&gt;

&lt;p&gt;live sessions, etc.) and asynchronous (email, message threads, pull requests, etc.). The Agile&lt;/p&gt;

&lt;p&gt;Manifesto should also focus on both types by facing and solving the challenges imposed by&lt;/p&gt;

&lt;p&gt;them. The Manifesto does not mention about cyber security or virtual communication but&lt;/p&gt;

&lt;p&gt;leverages them hoping to maintain product security. The increased usage of telecommunication&lt;/p&gt;

&lt;p&gt;has made it prone to cybersecurity attacks. Organizations are at high risk if they have low-level&lt;/p&gt;

&lt;p&gt;security over their communication channels. Agile should involve means to enforce strong&lt;/p&gt;

&lt;p&gt;cybersecurity practices as a part of their regular processes. In the future, the software industry&lt;/p&gt;

&lt;p&gt;will face more challenges in the future, undergo change/evolution, The advent of quantum&lt;/p&gt;

&lt;p&gt;computing could change the dynamics of global software structure, and the strengthening of&lt;/p&gt;

&lt;p&gt;artificial intelligence may bring out new challenges. By continuously updating and adapting its&lt;/p&gt;

&lt;p&gt;practices of Agile Manifesto it ensures that the software development is future-proofed against&lt;/p&gt;

&lt;p&gt;unexpected shifts.&lt;/p&gt;

&lt;p&gt;In conclusion, the Agile Manifesto, at its essence, remains highly relevant in the era of&lt;/p&gt;

&lt;p&gt;telecommuting. The core values the Agile Manifesto comprises offer guidance even when there&lt;/p&gt;

&lt;p&gt;is continuous evolution in software engineering. Even though modern technology imposes new&lt;/p&gt;

&lt;p&gt;challenges, which might be hard for Agile methods, they are not insurmountable. By adapting&lt;/p&gt;

&lt;p&gt;the tools and practices of today and updating some of the Agile principles, Agile can continue to&lt;/p&gt;

&lt;p&gt;guide software development for a couple of years.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Generative AI: Crafting Data with Algorithms.</title>
      <dc:creator>abhay-j</dc:creator>
      <pubDate>Sun, 28 Jan 2024 19:50:47 +0000</pubDate>
      <link>https://dev.to/abhayj/generative-ai-crafting-data-with-algorithms-3fjj</link>
      <guid>https://dev.to/abhayj/generative-ai-crafting-data-with-algorithms-3fjj</guid>
      <description>&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%2Fl3430e43b30fh99yx3hd.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%2Fl3430e43b30fh99yx3hd.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;br&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%2Ff4zqej3rannpqt0ceqp1.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%2Ff4zqej3rannpqt0ceqp1.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;br&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%2F5nus9o6wizhyotf8qdul.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%2F5nus9o6wizhyotf8qdul.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;br&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%2Fdmi3g2ienbu2mzq0uoc5.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%2Fdmi3g2ienbu2mzq0uoc5.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;br&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%2Fqgsth62yd2yh0ebc89yn.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%2Fqgsth62yd2yh0ebc89yn.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;br&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%2Fmhkdh385zn2sqtxsfdz3.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%2Fmhkdh385zn2sqtxsfdz3.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;br&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%2F6n12rw20u0e1s0mxojj9.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%2F6n12rw20u0e1s0mxojj9.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

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