Search This Blog

Tuesday, July 13, 2021

Angular: Component Data Transfer

Scenario : Let say you want to populate the dropdown on component 2 when there is a change in value of dropdown present in component 1 

==============================================================================
First of all we have to check the relation between different components
1. Parent (component 1) > Child (Component 2) - Sharing data via @input
2. Child (component 1) > Parent (Component 2) -Sharing Data via Output() and EventEmitter
3. Siblings with common parent. Child 1(component 1) > Child 2 (Component 2) -- use of both @output and @input together
4. Totally unrelated components  -- Sharing data with service, Sharing data with Route, NgRX


==============================================================================

1. Parent > Child 
Sharing data via @input decorator. 
parent.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'parent-component',
  template: `
    <child-component [childProperty]="parentProperty"></child-component>
  `,
  styleUrls: ['./parent.component.css']
})
export class ParentComponent{
  parentProperty = "I come from parent"
  constructor() { }
}

child.component.ts

import { Component, Input } from '@angular/core';

@Component({
  selector: 'child-component',
  template: `
      Hi {{ childProperty }}
  `,
  styleUrls: ['./child.component.css']
})
export class ChildComponent {

  @Input() childProperty: string;

  constructor() { }

}


==============================================================================
2. Child > Parent
Sharing Data via Output() and EventEmitter
parent.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'parent-component',
  template: `
    Message: {{message}}
    <child-component (messageEvent)="receiveMessage($event)"></child-component>
  `,
  styleUrls: ['./parent.component.css']
})
export class ParentComponent {

  constructor() { }

  message:string;

  receiveMessage($event) {
    this.message = $event
  }
}

 

child.component.ts

import { Component, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'child-component',
  template: `
      <button (click)="sendMessage()">Send Message</button>
  `,
  styleUrls: ['./child.component.css']
})
export class ChildComponent {

  message: string = "Hello!"

  @Output() messageEvent = new EventEmitter<string>();

  constructor() { }

  sendMessage() {
    this.messageEvent.emit(this.message)
  }
}

==============================================================================
3. Siblings with common parent. Child 1(component 1) > Child 2 (Component 2)


parent.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'parent-component',
  template: `
    Message: {{message}}
    <child-one-component (messageEvent)="receiveMessage($event)"></child1-component>
    <child-two-component [childMessage]="message"></child2-component>
  `,
  styleUrls: ['./parent.component.css']
})
export class ParentComponent {

  constructor() { }

  message: string;

  receiveMessage($event) {
    this.message = $event
  }
}

child-one.component.ts

import { Component, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'child-one-component',
  template: `
      <button (click)="sendMessage()">Send Message</button>
  `,
  styleUrls: ['./child-one.component.css']
})
export class ChildOneComponent {

  message: string = "Hello!"

  @Output() messageEvent = new EventEmitter<string>();

  constructor() { }

  sendMessage() {
    this.messageEvent.emit(this.message)
  }
}

child-two.component.ts

import { Component, Input } from '@angular/core';

@Component({
  selector: 'child-two-component',
  template: `
       {{ message }}
  `,
  styleUrls: ['./child-two.component.css']
})
export class ChildTwoComponent {

  @Input() childMessage: string;

  constructor() { }

}
==============================================================================
4. Totally unrelated components
Sharing Data with a Service

When passing data between components that lack a direct connection, such as siblings, grandchildren, etc, you should be using a shared service. When you have data that should always be in sync, I find the RxJS BehaviorSubject very useful in this situation.

data.service.ts

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

@Injectable()
export class DataService {

  private messageSource = new BehaviorSubject('default message');
  currentMessage = this.messageSource.asObservable();

  constructor() { }

  changeMessage(message: string) {
    this.messageSource.next(message)
  }

}

 

first.component.ts
import { Component, OnInit } from '@angular/core';
import { DataService } from "../data.service";

@Component({
  selector: 'first-componennt',
  template: `
    {{message}}
  `,
  styleUrls: ['./first.component.css']
})
export class FirstComponent implements OnInit {

  message:string;

  constructor(private data: DataService) {
      // The approach in Angular 6 is to declare in constructor
      this.data.currentMessage.subscribe(message => this.message = message);
  }

  ngOnInit() {
    this.data.currentMessage.subscribe(message => this.message = message)
  }

}

 

second.component.ts
import { Component, OnInit } from '@angular/core';
import { DataService } from "../data.service";

@Component({
  selector: 'second-component',
  template: `
    {{message}}
    <button (click)="newMessage()">New Message</button>
  `,
  styleUrls: ['./second.component.css']
})
export class SecondComponent implements OnInit {

  message:string;

  constructor(private data: DataService) { }

  ngOnInit() {
    this.data.currentMessage.subscribe(message => this.message = message)
  }

  newMessage() {
    this.data.changeMessage("Hello from Second Component")
  }

}
==============================================================================







Wednesday, July 7, 2021

Azure: Devops

What is DevOPS:
It is a set of practices followed by development team and operations team from committing a change to taking it to the production. 

Azure Devops
  • It is a tool which gives us an integrated environment to use different tools. 
  • We have different stages for code to move into production
    • Development – Visual Studio, Visual Studio Code, Eclipse…
    • Code check in – TFS, GIT, …
    • Build code/ build servers – .net compilers, Maven, Gradle, pipelines  ..
    • Testing – Selenium, Junits….
    • Release – Jenkins, Bamboo
    • Deployment – Docker, AWS, Azure … 
    • Operations – Kubernetes, Redhat Openshift, 
    • Monitoring – Splunk..

Sunday, July 4, 2021

CSharp: JWT Authentication

Q: How we can do JWT Authentication in case of .net Core application?
------------------------------------------------------------------------------------------------------------------------------------------

Step 1:
Create a Login Controller and on top of that controller give attribute [authorize], this attribute will ensure that all actions inside this controller will be authenticated first. 

Step 2:
Create a action method "authenticate" in above controller and give attribute [AllowAnonymous] to it. This will make sure to bypass the authentication on it. 
>> We have two important input parameters to this method. username and password. 
>> This is the entry point to our application where we will check if entered username and password are correct or not. (usually database we use to check)
>> If username and password are correct we will use it to generate token and return the JWT token value. 
>> UI application can use this JWT token and send it with its further calls

Step 3:
Inside above authenticate method, create another method generateJWTToken(). Call this method on successfull validation of username and password. 

Step4:
>> Inside generateJWTToken method pass a secret key. This secret key can be maintained in config file or in database. 
>> In above method using secret key, algo type and some other thigns generate token. 
>> We might have to install few packages from nuget at thsi stage. 
>> Once the key is generated return it to the main function/ 

Step 5:
Startup.ConfigureService. Add service service.AddAuthentication in startup.ConfigureService method. We have to add few more properties here. 

Step 6:
Add app.UseAuthenticate in Startup.Configure method as a middleware. 

Now when we call any other method authentication logic will be in picture and it will check for jwt token is present in the call or not. if it is present that code will check for its validity. 



Saturday, July 3, 2021

Csharp: Factory Pattern


>> Main() method also known as client side method. So the tradational approach of calling a method of a particular class is to create an object of class with the help of new keyword and then call the required method of this class. 





============================================================================== Quick Revision

Below is the final version with factory pattern implemented. 

 interface Igetdetails
    {
        void getname();
        void getfathername();
    }

    class Teacher : Igetdetails
    {
        public void getname()
        {
            Console.WriteLine("Teacher name");
        }

        public void getfathername()
        {
            Console.WriteLine("Teacher Father name");
        }

    }

    class Student : Igetdetails
    {
        public void getname()
        {
            Console.WriteLine("Student name");
        }

        public void getfathername()
        {
            Console.WriteLine("Student Father name");
        }
    }

    class factory
    {
        public static Igetdetails createobject(string type)
        {
            Igetdetails obj = null;
            if (type.ToLower() == "teacher")
            {
                obj = new Teacher();
            }
            else
            {
                obj = new Student();
            }
            return obj;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var clientobj = factory.createobject("student");
            clientobj.getfathername();

            Console.ReadKey();
        }
    }

==============================================================================

Wednesday, June 30, 2021

Csharp: Garbage Collector

Confusing Terms:
  1. IDispose -- unmanaged, user can call
  2. Difference between Close and Dispose
  3. GC.Collect -- managed, user can call
  4. Finalize -- unamanged, user can not call
  5. Destructor
  6. SupressFinalize
  7. Close
================================================================================
IDispose : 
  • Used for disposing unmanaged resources 
  • When we implement IDispose interface, Dispose is the method where we dispose the umanged resource. 
  • In some objects we have two options 1. dispose and 2. Close. For file streaming both options are same. 
Void dispose()
{
this.close();
Dispose(true);
GC.SupressFinalize(this);
}
===============================================================================
Difference between Close and Dispose

Close
1. Disconnected with DB
2. Release resources.
3. SQL Connection object not released, it is just close and can be open again. 

Dispose
1. Disconnected with DB
2. Release resources.
3. Release SQL connection object as well. 

Example: 
try 
    
        string constring = "Server=(local);Database=my; User Id=sa; Password=sa";                             SqlConnection sqlcon = new SqlConnection(constring); 
        sqlcon.Open(); // here connection is open 
        // some code here which will be execute 
    
catch // code will be execute when error occurred in try block } 
finally 
    
        sqlcon.Close(); // close the connection 
        sqlcon.Dispose(); // desroy the connection object 
    }

===============================================================================
GC.Collect:

1. this method is used to clear manged resources. 
2. Unlike Finalize which can not be called by user, GC.Collect can be called by user. 
3. Also GC.Collect is to work on managed resrouce while GC.Finalize is for unmanaged resources. 
4. It will force the GC generations to start. 

===============================================================================
Finalize():

1. This method is used to clear the unmanaged resource like IDispose. 
2. This method can only be called by GC as a part of destructor. 
3. We can not call it explicitly. We have to implemetn IDispose instead, if we want to take care of un managead resource. 

===============================================================================
Destructor:

1. Finalize also called as destructor of the class. Finalize()
2. It can not be explicitly called except for the destructor calling itself behind the scene. 
3. Finalize can be used to clean unmanged resource in C# with the help of GC. 

~myclass()
{
this.Dispose(); // behind the scene finalize would also be called
}

===============================================================================
SupressFinalize()

1. This method is to tell the CLR that we have already taken care of releasing unmanged resources and GC need not to act on it. 

===============================================================================

Tuesday, June 29, 2021

Ctor: Base class, Child class

  class baseclass
    {
        public baseclass()
        {
            Console.WriteLine("--base class ctor--");
        }
    }

    class childclass1 : baseclass
    {
        public childclass1()
        {
            Console.WriteLine("--Child class ctor--");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            childclass1 c = new childclass1();
            baseclass b = new childclass1();
            Console.ReadKey();
        }

    }

output of above both lines will be same. below o/p will be printed twice. 
--base class ctor--
--Child class ctor--

Base class Child Class relation

Case 1
    class baseclass
    {
        public void basemethod()
        {
            Console.WriteLine("--base method--");
        }
    }

    class childclass1 : baseclass
    {
        public void childmethod1()
        {
            Console.WriteLine("--Child Method1--");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            childclass1 c = new childclass1();
            c.childmethod1();
            c.basemethod(); // is this possible? error, warning, nothing?

            Console.ReadKey();
        }

    }

c.childmethod1() -- output would be "--Child Method1--"
c.basemethod(); -- No error, no warning, o/p would be "--base method--". Child class has access to its parent public and protected members. 

----------------------------------------------------------------------------------------------------------------------------------------
Case 2

    class baseclass
    {
        public virtual void basemethod()
        {
            Console.WriteLine("--base method--");
        }
    }

    class childclass1 : baseclass
    {
        public void childmethod1()
        {
            Console.WriteLine("--Child Method1--");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            childclass1 c = new childclass1();
            c.basemethod(); // is this possible? error, warning, nothing?

            Console.ReadKey();
        }

    }

c.basemethod(); -- No error, no warning, o/p would be "--base method--" as nothing is override in child method. and code flow is from parent to child as waterfall. So parent method will be called. 
----------------------------------------------------------------------------------------------------------------------------------------
Case 3:

class baseclass
    {
        public virtual void basemethod()
        {
            Console.WriteLine("--base method--");
        }
    }

    class childclass1 : baseclass
    {
        public void childmethod1()
        {
            Console.WriteLine("--Child Method1--");
        }

        public new / <<space>> / virtual / override void basemethod()
        {
            Console.WriteLine("--base method from child--");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            childclass1 c = new childclass1();
            c.basemethod(); // is this possible? error, warning, nothing?

            Console.ReadKey();
        }

    }
c.basemethod(); -- No error, no warning, o/p would be "--base method from child--" as object is pure form of child class.it wont simply look at parent method. 
----------------------------------------------------------------------------------------------------------------------------------------
Case 4:

class baseclass
    {
        public virtual void basemethod()
        {
            Console.WriteLine("--base method--");
        }
    }

    class childclass1 : baseclass
    {
        public void childmethod1()
        {
            Console.WriteLine("--Child Method1--");
        }

        public new / <<space>> / virtual void basemethod()
        {
            Console.WriteLine("--base method from child--");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            baseclass b = new childclass1();
            b.basemethod();

            Console.ReadKey();
        }

    }
c.basemethod(); -- o/p would be "--base method--" now method will be from parent to child as waterfall. Since there is no override keyword. basemethod of parent will be called in above case. 
Even if parent doent have virtual keyword then still only parent method would have called. 

----------------------------------------------------------------------------------------------------------------------------------------
Case 5:

 class baseclass
    {
        public virtual void basemethod()
        {
            Console.WriteLine("--base method--");
        }
    }

    class childclass1 : baseclass
    {
        public void childmethod1()
        {
            Console.WriteLine("--Child Method1--");
        }

        public override void basemethod()
        {
            Console.WriteLine("--base method from child--");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            baseclass b = new childclass1();
            b.basemethod();

            Console.ReadKey();
        }

    }

c.basemethod(); -- o/p would be "--base method from child--" here method will be called from parent to child. since parent has virtual keyword and child has override keyword, method of child would be called. 

----------------------------------------------------------------------------------------------------------------------------------------
Case 6:

 class baseclass
    {
        public void basemethod()
        {
            Console.WriteLine("--base method--");
        }
    }

    class childclass1 : baseclass
    {
        public override void childmethod1()
        {
            Console.WriteLine("--Child Method1--");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            childclass1 c = new childclass1();
            c.basemethod(); // is this possible? error, warning, nothing?

            Console.ReadKey();
        }

    }

Compile time error: Override can not exists without virtual/abstract keyword. While virtual can exists without override. 

----------------------------------------------------------------------------------------------------------------------------------------





----------------------------------------------------------------------------------------------------------------------------------------





----------------------------------------------------------------------------------------------------------------------------------------

Thursday, June 17, 2021

Host ASP.NET Core on azure Linux with Nginx

 This can be done in two ways 1) with out creating docker image 2) creating docker image from the published folder
3) create image and download it from azure container registry

Approach 1: Without creating Docker image

 Basic steps to host a .net core application on azure linux mahince with nginx
1. Create a resource group
2. Create a Linux virtual machine on azure. (may be ubutu server). Make sure port:80 is open as we are going to use it for http request. 
3. Login to Linux virtual machine using PUTTY. 
4. Install Docker
sudo apt install docker-ce

5. download nginx docker image
docker pull nginx:1.17.0

6. check if new downloaded image is avalible or not
docker images

7. Run default page of nginx. This will launch the default page of welcome to docker 
docker run -d -p 80:80 nginx:1.17.0

--- from here approach 2 can be used ---------
8. install .net core SDK on linux vm
9. publish the .net core code from Visual studio locally and copy the publish folder from local to VM using WINSCP tool 
10. run application on linum vm using .net core. it will run kestral web server by default. 
dotnet projectfile.dll

11. Now we have to configure nginx configuration file to transafer all request to kestral server and we will hit nginx port to access application. 

Approach 2: creating docker image from the published folder

1. create a docker file and write below content into it. 

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 -- this tell the default image to take reference
WORKDIR /app -- working directory for ur application
COPY  . .  -- copy from publish folder to working directory
ENV ASPNETCORE_URLS http://*:5000 -- open the port 
EXPOSE 5000
ENTRYPOINT ["dotnet", "coreproj.dll"] -- dotnet application with applicpation name as 'coreproj'

2. Run following command. this command will run the above file 
sudo docker build -t dotnetapp .

3. Run the application 
sudo docker run -d -p 5000:5000 dotnetapp

Since here we are mentioning 5000 we have to open inbound port for 5000 as well. 

4. Stop the application 
sudo docker stop dotnetapp

Wednesday, June 16, 2021

Kubernetes

Kafka: Introduction

 KAFKA

  • Kafka can be used to send and receive messages in microservices. 
  • It is a middleware and can handle millions of messages. 
  • Azure service bus and Rabbit MQ are substitute messaging service to Kafka. 
  • Kafka work on Topic- Subscription model of messages not on queues. 
  • Kafka was created by Linked in. 
  • Kafka has concept of publisher, Broker, Consumer
    • Broker - Kafka cluster and kafka ecosystem. 
    • Publisher, Consumer - Microservices 
  • We also have to up and run zookeeper and its main purpose is
    • Maintain list of topics and messages 
    • Track status of nodes in distributed system
    • Manage Kafka brokers on distributed system. 
=================================================================================

How to work with KAFKA and use it to communicate between .net core microservices. 

Step1. Install Java if not already install on server. check by java -version
Step2. Download Kafka and unzip it. let say folderA
Step3. Download Zookeeper and unzip it. let say Folder B
Step4. Start Zookeeper. Go to bin and double click on exe file. We can start it with cmd also. 
Step5. Start Kafka. with CMD which will act as a broker. 
Step6. Create a Topic
Step7. Create a publisher. it could be console application or a Microservice
Step8. Create a subscriber.  it could be console application or a Microservice


===============================================================================
.net Microservice to create a publisher and a subscriber  

Publisher
Step1. Install nuget pakcage "Confluent.kafka" in api project created on .net core. which we will treat as microservice. 
Step2. In appsettings.json create producer by mentioning bootstrap server.
    value of bootstrap server like below :
BootstrapServers = "localhost:9092"
Step3. Add above producer in Starup.configureservice method. .

Step4. Create an API controller do some coding like below:
                await producer.Produce.Async(topic, message); 
Where message is json serialized object. 

Step5. now if you send something from postman then that thing must come in above api method. 

Post:
http://localhost/api/producer/send?topic=temp-topic
{"id":1,"name":"test"}

Subscriber
1. Create a microservice and install the above nuget package. 
2. in main.cs subscribe to the same topic mentioned above. 
=============================================================================

Monday, May 31, 2021

Others: Agile 2

Roles:
  • Product Owner
    • Take responsibility of product backlog
    • Writes user stories. 
    • Release planning
  • Scrum Master-
    • Make sure scrum is enact and stable
    • provide service to team, product owner n organization
    • work life balance. 
    • check team performance 
  • Development Team
    • size = 3-9 total members
    • Planning and estimation = 2 hours / week
    • Estimates complexity
    • Refine stories

Sprint - A sprint is a short, time-boxed period when a scrum team works to complete a set amount of work. Sprints are at the very heart of scrum and agile methodologies
  • 2 weeks
Sprint planning(Call)
  • Create list of work for next sprint. no additional work will be added
  • Decompose user stories into tasks
  • Attendee: PO, Scrum master, team
Sprint Refinement (Call)
  • Explain the usage of sprint
  • Between BA and Dev. 
Daily Scrum(Call)
  • 15mins
  • Discuss only blocker/ no blocker words
  • Not a status meeting
  • For whole team to know what is done. 
Sprint review (Call) - 
  • Over 2 hours in a sprint. 
  • What we achieve in story points. 
  • Only completed story points. 
Sprint retrospective (Call): 
  • 1 hour
  • Team voice on what is going right and what is not. 
  • formal opportunity for adaptation. 
Product backlog-
  • A list of all desired work in project
  • prioritize by product owner and its PO accountably to maintain it. 
Spill over item - Item which not solved in sprint. To be picked in next iteration. 

Sprint backlog:
  • Owned by development team. 
  • Emerges during the sprint. 
  • Estimates in hours, not in story points. 
Story points
3 = 1 day
5 = 3 days
8 = 5 days

Backlog items = user stories + features

BurnDown chart - Graphical representation to see how much work and time is left to complete a task.  A burndown chart is a graphic representation of how quickly the team is working through a customer’s user stories, an agile tool that is used to capture a description of a feature from an end-user perspective. The burndown chart shows the total effort against the amount of work for each iteration.

Burning Hours- burn minimum 6 hours daily in different user stories, tasks

Characteristics of Agile
• Members must take ownership of sprint work. 

Others: Agile and Scrum

Agile and Scrum
1. What is the relation between Agile and Scrum>
2. Scrum Roles
3. Scrum Events
4. Scrum Artifacts
5. Symptoms of Waterfall + Agile
6. Scrum Process

-----------------------------------------------------------------------------------------------------------------------------
1. What is the relation between Agile and Scrum
Scrum is one of the strategy by which we can implement Agile methodology. 

Scrum: A framework within which people address complex adaptive problem to deliver product of its highest possible value. 
Sprint backlog items - Task 
Product Backlog items - Features/ User stories
-----------------------------------------------------------------------------------------------------------------------------
2. Scrum Roles
1. Product Owner  
2. Scrum Master
3. Development Team
Product Owner -
Sole responsible for managing product backlog and prioritize it. 
One person, not a group
Scrum Master - 
Ensure the scrum is understood and enacted. 
Provide service to Product Owner, Development Team and Organization. 
Supports transparency
Eliminates that can make team underperform. 
Development Team - 
Estimates the complexity and work estimates. 
2 hours per week for refine stories, planning and estimates. 
Manages Sprint backlog and tracks sprint progress. 
Include QA, UX, backend etc..
Ideal size 3-9
-----------------------------------------------------------------------------------------------------------------------------
3. Scrum Event
1. Sprint Planning 
2. Daily Scrum
3. Backlog Refinement
4. Sprint Review
5. Sprint Retrospective
6. Product Backlog
Sprint Planning
• Purpose:
– To create a list of work for the sprint where no additional items shall be
added to the list during the sprint
• Format of the meeting:
– Populate the sprint backlog for your team(s) from a prioritized product
backlog per team’s capacity
– Decompose the user stories into actionable tasks; seek clarifications and
more information from the PO, if required
– Finalize acceptance criteria for selected/picked user stories
• Outcome:
– Everyone on the Scrum team understands and agrees what the team is
going to work on during the sprint and deliver at the end; define a sprint goal
• Attendees:
– PO, Scrum Master, and team
• Time-box: 4 hours for 2-weeks sprint
Daily Scrum
Purpose:
– For the team to know what it has accomplished for the sprint goal – not a
status meeting
• Format of the meeting:
– Each team member says what they did the previous day, what they plan to
do today (towards the sprint goal), and if they have any impediments(obstacles)
– It is okay to say you could not accomplish anything towards the goal, you
plan to do nothing towards the goal today because you have a lot of
impediments (obstacles)!
• Outcome:
– Everyone on the team understands where the team is in terms of delivering
the sprint goal; Scrum Master can optionally populate impediments in a list
and get on to resolve them
• Attendees:
– Team, Scrum Master (optional)
• Time-box: 15 minutes
Backlog Refinement
Purpose:
– For PO to announce any changes or reprioritization to the product backlog
and have top-priority items ready for discussion in the next sprint planning
meeting
• Format of the meeting:
– Product Owner goes through the user stories required to be delivered in the
next sprint
– Team provides an estimate for those user stories – at this point, it is not a
commitment from the team to deliver all user stories estimated
– Current workflow and sprint are not changed – this meeting is to ensure that
we have an emergent product backlog
• Outcome:
– Updated, prioritized, and estimated product backlog
• Attendees:
– PO, team, Scrum Master
• Time-box: Not more than 10% of Development team’s capacity
Sprint Review
 Purpose:
– For Scrum team and stakeholders to collaborate on what was done during the sprint
• Format of the meeting:
– No presentation meeting
– Not exactly a “sign-off” meeting; presentation of the Increment is intended to elicit feedback and foster collaboration
• Outcome:
– PO and other stakeholders’ inputs on the work done during the sprint helps them determine next course of action to optimize value
• Attendees:
– PO, team, Scrum Master, other stakeholders, business owners
• Time-box: 2 hours for 2-weeks sprint
Sprint Retrospective
• Purpose:
– For team to voice their opinions on what is working, what is not working, and what they want to change – purely on people, relationships, process, and tools
• Format of the meeting:
– Every member gets to say what is working for them, what is not working, and what they want to change next sprint onwards
– Formal opportunity to inspect and adapt
• Outcome:
– List of improvements the team will start implementing next sprint onwards
• Attendees:
– PO, team, Scrum Master (as a member)
• Time-box: 1.5 hours for 2-weeks sprint
-----------------------------------------------------------------------------------------------------------------------------
4. Scrum Artifacts
Product Backlog
• A list of all desired work on the project
• Ideally expressed such that each item has value to the users or customers of the product
• Ordered/prioritized by the Product Owner
• Sole accountability lies with the Product Owner
• Can be changed anytime at the discretion of Product Owner

Sprint Backlog
• Owned by Development team
• Technical in nature
• Emerges during the sprint
• Estimated in hours, not Story Points
• Team members sign up for work and add in sprint backlog
• Work is never assigned
• Estimated work is updated daily
-----------------------------------------------------------------------------------------------------------------------------
5. Symptoms of Waterfall + Agile = Wagile
1. Your Scrum team consists of 20 people
2. Your sprints have “phases” such as Requirements or Design
3. Your project manager uses a Gannt Chart
4. Your team is assigned work and is asked for daily status rather than being allowed to
manage themselves
5. You never push back - “This is what the product owner wants in this sprint, so we have
to get it done”
6. Velocity is simply the speed you achieve when you are late to work
7. Your daily standups (if you have them) consist of Chickens, Pigs, Lions, Tigers and
Bears
8. You are still required to produce a large BRD to communicate requirements rather than
“just enough” to get the point across. This is managed in a tool with traceability and
simulation to help in the communication process
9. You are pulled off your current sprint to work on that ‘other project’ you used to be on
10. It’s 1:00am and you have a new release being implemented and the whole team isn’t
involved
-----------------------------------------------------------------------------------------------------------------------------
6. Scrum process





-----------------------------------------------------------------------------------------------------------------------------
Epic - Business came and want to deliver something. Here entry is made by product owner or product manager. Let say we want to create a Commercial website. 
Feature – Card functionality, product page, search engine, wallet etc. Will be created by product owner or the project managers. 
User Story – As a part of feature we will create stories. Like for search service, we can have 3 user stories. One for having data in DB. One for API layer which can fetch information from db and show it to users. 
Task – With in that user story we create tasks. 
EPIC
  |_ Feature 1 …
    |_ User story 1 …
      |_ Tasks …
        |_ Bug 1 …
e-FUTBall  (e-futball)

From <https://himanshugoel2018learninghabbit.blogspot.com/search/label/Agile%20and%20Scrum>