SlideShare ist ein Scribd-Unternehmen logo
1 von 56
PROJECTIONS
EXPLAINED
{ YVES REYNHOUT }
AGENDA
Meet the domain
Projections
Terminology
Designing
Authoring
Testing
WELCOME @
BEAUFORMA (FR)
YOU ARE THE PRODUCT
ON THE OUTSIDE
ON THE INSIDE
THAT IS ...
IF YOU CAN AFFORD US
;-)
Projections explained
Projections explained
CHALLENGES
CONTEXT MAP
REWARD
WHAT'S NOT TO LIKE ABOUT
BEAUFORMA?
BUT, DUDE ... WE'RE
HERE FOR
PROJECTIONS,
REMEMBER?
TERMINOLOGY
Event: a fact, something that happened, a message, a
datastructure
Stream: a sequence of events, partitioned by something
Event store: a collection of streams (simplified)
Disclaimer: not authoritive, just my take
Projections explained
Projections explained
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
open System 
type GuestStartedShopping = {  
  SubsidiaryId : Guid; 
  FeelGoodCartId : Guid;  
  GuestId : Guid; 
  StartDateAndTime : DateTime; 
} 
type GuestCheckedOutCart = {  
  FeelGoodPackageId : Guid; 
  FeelGoodCartId : Guid;  
  GuestId : Guid; 
  Items : Guid array; 
} 
type GuestAbandonedCart = {  
  FeelGoodCartId : Guid;  
  GuestId : Guid; 
  LastSeenDateAndTime : DateTime; 
} 
1:
2:
3:
4:
5:
6:
7:
8:
type ItemWasAddedToCart = {  
  FeelGoodCartId : Guid;  
  ItemId : Guid; 
} 
type ItemWasRemovedFromCart = {  
  FeelGoodCartId : Guid;  
  ItemId : Guid; 
} 
VANILLA CQRS+ES
TERMINOLOGY
ProjectionHandler: a function that projects an event
Projection: a collection of handlers that form a unit
Projector: a function that dispatches an event or a batch
of events to the matching handler(s)
[Optional] ProjectionHandlerResolver: a function that
returns the handlers that match an event
Disclaimer: not authoritive, just my take
Projections explained
Projections explained
Projections explained
EXAMPLE
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
open StackExchange.Redis 
let inline (!>) (x:^a) : ^b =  
  ((^a or ^b) : (static member op_Implicit : ^a ­> ^b) x)  
let activeShoppersProjection (connection:IDatabase, message:Object) = 
  match message with 
  | :? GuestStartedShopping ­>  
    connection.StringIncrement(!> "ActiveShoppers", 1L) |> ignore 
  | :? GuestAbandonedCart ­>  
    connection.StringDecrement(!> "ActiveShoppers", 1L) |> ignore 
  | :? GuestCheckedOutCart ­>  
    connection.StringDecrement(!> "ActiveShoppers", 1L) |> ignore 
  | _ ­> () 
EXAMPLE
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
public class ActiveShoppersProjection : ConnectedProjection<IDatabase> 
{ 
  public ActiveShoppersProjection() 
  { 
    When<GuestStartedShopping>((connection, message) =>  
      connection.StringIncrementAsync("ActiveShoppers")); 
    When<GuestAbandonedCart>((connection, message) =>  
      connection.StringDecrementAsync("ActiveShoppers")); 
    When<GuestCheckedOutCart>((connection, message) =>  
      connection.StringDecrementAsync("ActiveShoppers")); 
  } 
} 
EXAMPLE
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
public interface IHandler<TMessage> 
{ 
  void Handle(IDatabase connection, TMessage message); 
} 
public class ActiveShoppersProjection : IHandler<GuestStartedShopping>, 
  IHandler<GuestAbandonedCart>, IHandler<GuestCheckedOutCart>  
{ 
  public void Handle(IDatabase connection, GuestStartedShopping message) 
  { 
    connection.StringIncrement("ActiveShoppers"); 
  } 
  public void Handle(IDatabase connection, GuestAbandonedCart message) 
  { 
    connection.StringDecrement("ActiveShoppers"); 
  } 
  public void Handle(IDatabase connection, GuestCheckedOutCart message) 
  { 
    connection.StringDecrement("ActiveShoppers"); 
  } 
} 
VANILLA CQRS+ES
VANILLA DDD
DESIGNING
PROJECTIONS
consumer driven (by screen, api, model, ...)
affected by the choice of store (e.g. required querying
capabilities, non-functional requirements, ...)
Projections explained
DATASTRUCTURES
Projections explained
EXERCISE
Define a datastructure for this widget
POSSIBLE SOLUTION
1:
2:
3:
4:
5:
6:
7:
8:
type GuestsArrivingRecord = {  
  RecordId: string; 
  SubsidairyId: Guid; 
  Date: DateTime; 
  AppointmentId : Guid; 
  GuestName : string;  
  AppointmentDateAndTime : DateTime  
} 
POSSIBLE SOLUTION
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type GuestsArrivingDocument = {  
  DocumentId: string; 
  SubsidairyId: Guid; 
  Date: DateTime; 
  Appointments : Appointment array 
} 
type Appointment = { 
  AppointmentId : Guid; 
  GuestName : string;  
  AppointmentDateAndTime : DateTime  
} 
EVENTS
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type GuestBookedAppointment = {  
  AppointmentId : Guid;  
  GuestId : Guid; 
  AppointmentDateAndTime : DateTime;  
  FeelGoodPackageId : Guid;  
  SubsidiaryId : Guid  
} 
type GuestRescheduledAppointment = {  
  AppointmentId : Guid;  
  GuestId : Guid;  
  AppointmentDateAndTime : DateTime;  
  FeelGoodPackageId : Guid;  
  SubsidiaryId : Guid  
} 
type GuestSwappedAppointmentFeelGoodPackage = {  
  AppointmentId : Guid;  
  GuestId : Guid;  
  FeelGoodPackageId : Guid;  
  SubsidiaryId : Guid  
} 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type GuestCancelledAppointment = {  
  AppointmentId : Guid; 
  GuestId : Guid; 
  Reason : string;  
  SubsidiaryId : Guid  
} 
type SubsidiaryCancelledAppointment = {  
  AppointmentId : Guid; 
  GuestId : Guid; 
  Reason : string;  
  SubsidiaryId : Guid  
} 
EXERCISE
Fill your datastructure using these events
- booking.fshttps://goo.gl/BTBTfi
OBSERVATIONS
Not all events are useful,
Information might be missing from events,
Not all data is for viewing
Events challenge the datastructure
What about your observations?
Projections explained
Projections explained
OBSERVATIONS
Not all data comes from one projection,
Not all data is owned by one model
ONE EXTRA EVENT TO TAKE INTO ACCOUNT
1:
2:
3:
4:
5:
type GuestRegistered = {  
  GuestId : Guid; 
  FullName : string; 
  DateOfRegistration: DateTime; 
} 
EXERCISE
Extend your projection with the event
- booking|guests.fshttps://goo.gl/BTBTfi
POSSIBLE SOLUTION
1:
2:
3:
4:
5:
type GuestDocument = {  
  DocumentId: string; 
  GuestId: Guid; 
  FullName: string; 
} 
AUTHORING
PROJECTIONS
EXERCISE
Express the projection in your language and store of choice
- booking|guests.fshttps://goo.gl/BTBTfi
RECIPE?
define message types in code (for statically typed
languages)
define and implement projection handlers for each
message type
define and implement a dispatcher to those projection
handlers
test drive in the program's main
NOT CHALLENGING ENOUGH?
EVENTSTORE
IP Address: 178.62.229.196
Http Port: 2113
Tcp Port: 1113
Login: admin
Password: changeit
REDIS
IP Address: 178.62.229.196
Port: 6379
ELASTICSEARCH
IP Address: 178.62.229.196
Port: 9200
POSTGRES
IP Address: 46.101.161.64
Port: 5432
Login: dddeu16
Password: dddeu16
Database: dddeu16
SslMode: required
Server Certificate: see online environment file
- online-
environment.md
https://goo.gl/BTBTfi
TESTING PROJECTIONS
Projections explained
EXAMPLE
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
public class ActiveShoppersProjectionScenarios 
{ 
  public Task when_multiple_active_shoppers() 
  { 
    return MemoryCacheProjection.For(new ActiveShoppersProjection()) 
      .Given( 
        new GuestStartedShopping {  
          SubsidiaryId = BonifacioId,  
          FeelGoodCartId = RandomCartId(), 
          GuestId = OliverMartinezId, 
          StartDateAndTime = Today.At(6.PM()) 
        },
        new GuestStartedShopping {  
          SubsidiaryId = BonifacioId,  
          FeelGoodCartId = RandomCartId(), 
          GuestId = RodriguezId, 
          StartDateAndTime = Today.At(4.PM()) 
        })
      .Expect(new CacheItem("ActiveShoppersCount", 2)); 
  } 
} 

Weitere ähnliche Inhalte

Andere mochten auch

Get Soaked - An In Depth Look At PHP Streams
Get Soaked - An In Depth Look At PHP StreamsGet Soaked - An In Depth Look At PHP Streams
Get Soaked - An In Depth Look At PHP StreamsDavey Shafik
 
Techniques d'accélération des pages web
Techniques d'accélération des pages webTechniques d'accélération des pages web
Techniques d'accélération des pages webJean-Pierre Vincent
 
Automation using-phing
Automation using-phingAutomation using-phing
Automation using-phingRajat Pandit
 
Electrify your code with PHP Generators
Electrify your code with PHP GeneratorsElectrify your code with PHP Generators
Electrify your code with PHP GeneratorsMark Baker
 
The quest for global design principles (SymfonyLive Berlin 2015)
The quest for global design principles (SymfonyLive Berlin 2015)The quest for global design principles (SymfonyLive Berlin 2015)
The quest for global design principles (SymfonyLive Berlin 2015)Matthias Noback
 
Top tips my_sql_performance
Top tips my_sql_performanceTop tips my_sql_performance
Top tips my_sql_performanceafup Paris
 
Understanding Craftsmanship SwanseaCon2015
Understanding Craftsmanship SwanseaCon2015Understanding Craftsmanship SwanseaCon2015
Understanding Craftsmanship SwanseaCon2015Marcello Duarte
 
Why elasticsearch rocks!
Why elasticsearch rocks!Why elasticsearch rocks!
Why elasticsearch rocks!tlrx
 
Writing infinite scalability web applications with PHP and PostgreSQL
Writing infinite scalability web applications with PHP and PostgreSQLWriting infinite scalability web applications with PHP and PostgreSQL
Writing infinite scalability web applications with PHP and PostgreSQLGabriele Bartolini
 
Si le tdd est mort alors pratiquons une autopsie mix-it 2015
Si le tdd est mort alors pratiquons une autopsie mix-it 2015Si le tdd est mort alors pratiquons une autopsie mix-it 2015
Si le tdd est mort alors pratiquons une autopsie mix-it 2015Bruno Boucard
 
L'ABC du BDD (Behavior Driven Development)
L'ABC du BDD (Behavior Driven Development)L'ABC du BDD (Behavior Driven Development)
L'ABC du BDD (Behavior Driven Development)Arnauld Loyer
 
TDD with PhpSpec - Lone Star PHP 2016
TDD with PhpSpec - Lone Star PHP 2016TDD with PhpSpec - Lone Star PHP 2016
TDD with PhpSpec - Lone Star PHP 2016CiaranMcNulty
 
Performance serveur et apache
Performance serveur et apachePerformance serveur et apache
Performance serveur et apacheafup Paris
 
The Wonderful World of Symfony Components
The Wonderful World of Symfony ComponentsThe Wonderful World of Symfony Components
The Wonderful World of Symfony ComponentsRyan Weaver
 
PHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4DevelopersPHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4DevelopersKacper Gunia
 
Design how your objects talk through mocking
Design how your objects talk through mockingDesign how your objects talk through mocking
Design how your objects talk through mockingKonstantin Kudryashov
 

Andere mochten auch (20)

Get Soaked - An In Depth Look At PHP Streams
Get Soaked - An In Depth Look At PHP StreamsGet Soaked - An In Depth Look At PHP Streams
Get Soaked - An In Depth Look At PHP Streams
 
Techniques d'accélération des pages web
Techniques d'accélération des pages webTechniques d'accélération des pages web
Techniques d'accélération des pages web
 
Automation using-phing
Automation using-phingAutomation using-phing
Automation using-phing
 
PHP5.5 is Here
PHP5.5 is HerePHP5.5 is Here
PHP5.5 is Here
 
Electrify your code with PHP Generators
Electrify your code with PHP GeneratorsElectrify your code with PHP Generators
Electrify your code with PHP Generators
 
The quest for global design principles (SymfonyLive Berlin 2015)
The quest for global design principles (SymfonyLive Berlin 2015)The quest for global design principles (SymfonyLive Berlin 2015)
The quest for global design principles (SymfonyLive Berlin 2015)
 
Top tips my_sql_performance
Top tips my_sql_performanceTop tips my_sql_performance
Top tips my_sql_performance
 
Mocking Demystified
Mocking DemystifiedMocking Demystified
Mocking Demystified
 
Understanding Craftsmanship SwanseaCon2015
Understanding Craftsmanship SwanseaCon2015Understanding Craftsmanship SwanseaCon2015
Understanding Craftsmanship SwanseaCon2015
 
Why elasticsearch rocks!
Why elasticsearch rocks!Why elasticsearch rocks!
Why elasticsearch rocks!
 
Writing infinite scalability web applications with PHP and PostgreSQL
Writing infinite scalability web applications with PHP and PostgreSQLWriting infinite scalability web applications with PHP and PostgreSQL
Writing infinite scalability web applications with PHP and PostgreSQL
 
Si le tdd est mort alors pratiquons une autopsie mix-it 2015
Si le tdd est mort alors pratiquons une autopsie mix-it 2015Si le tdd est mort alors pratiquons une autopsie mix-it 2015
Si le tdd est mort alors pratiquons une autopsie mix-it 2015
 
L'ABC du BDD (Behavior Driven Development)
L'ABC du BDD (Behavior Driven Development)L'ABC du BDD (Behavior Driven Development)
L'ABC du BDD (Behavior Driven Development)
 
Behat 3.0 meetup (March)
Behat 3.0 meetup (March)Behat 3.0 meetup (March)
Behat 3.0 meetup (March)
 
TDD with PhpSpec - Lone Star PHP 2016
TDD with PhpSpec - Lone Star PHP 2016TDD with PhpSpec - Lone Star PHP 2016
TDD with PhpSpec - Lone Star PHP 2016
 
Caching on the Edge
Caching on the EdgeCaching on the Edge
Caching on the Edge
 
Performance serveur et apache
Performance serveur et apachePerformance serveur et apache
Performance serveur et apache
 
The Wonderful World of Symfony Components
The Wonderful World of Symfony ComponentsThe Wonderful World of Symfony Components
The Wonderful World of Symfony Components
 
PHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4DevelopersPHPSpec - the only Design Tool you need - 4Developers
PHPSpec - the only Design Tool you need - 4Developers
 
Design how your objects talk through mocking
Design how your objects talk through mockingDesign how your objects talk through mocking
Design how your objects talk through mocking
 

Kürzlich hochgeladen

Leveraging DxSherpa's Generative AI Services to Unlock Human-Machine Harmony
Leveraging DxSherpa's Generative AI Services to Unlock Human-Machine HarmonyLeveraging DxSherpa's Generative AI Services to Unlock Human-Machine Harmony
Leveraging DxSherpa's Generative AI Services to Unlock Human-Machine Harmonyelliciumsolutionspun
 
online pdf editor software solutions.pdf
online pdf editor software solutions.pdfonline pdf editor software solutions.pdf
online pdf editor software solutions.pdfMeon Technology
 
JS-Experts - Cybersecurity for Generative AI
JS-Experts - Cybersecurity for Generative AIJS-Experts - Cybersecurity for Generative AI
JS-Experts - Cybersecurity for Generative AIIvo Andreev
 
Big Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/ML
Big Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/MLBig Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/ML
Big Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/MLAlluxio, Inc.
 
Mastering Kubernetes - Basics and Advanced Concepts using Example Project
Mastering Kubernetes - Basics and Advanced Concepts using Example ProjectMastering Kubernetes - Basics and Advanced Concepts using Example Project
Mastering Kubernetes - Basics and Advanced Concepts using Example Projectwajrcs
 
Kubernetes go-live checklist for your microservices.pptx
Kubernetes go-live checklist for your microservices.pptxKubernetes go-live checklist for your microservices.pptx
Kubernetes go-live checklist for your microservices.pptxPrakarsh -
 
20240330_고급진 코드를 위한 exception 다루기
20240330_고급진 코드를 위한 exception 다루기20240330_고급진 코드를 위한 exception 다루기
20240330_고급진 코드를 위한 exception 다루기Chiwon Song
 
OpenChain Webinar: Universal CVSS Calculator
OpenChain Webinar: Universal CVSS CalculatorOpenChain Webinar: Universal CVSS Calculator
OpenChain Webinar: Universal CVSS CalculatorShane Coughlan
 
ERP For Electrical and Electronics manufecturing.pptx
ERP For Electrical and Electronics manufecturing.pptxERP For Electrical and Electronics manufecturing.pptx
ERP For Electrical and Electronics manufecturing.pptxAutus Cyber Tech
 
Growing Oxen: channel operators and retries
Growing Oxen: channel operators and retriesGrowing Oxen: channel operators and retries
Growing Oxen: channel operators and retriesSoftwareMill
 
eAuditor Audits & Inspections - conduct field inspections
eAuditor Audits & Inspections - conduct field inspectionseAuditor Audits & Inspections - conduct field inspections
eAuditor Audits & Inspections - conduct field inspectionsNirav Modi
 
Introduction-to-Software-Development-Outsourcing.pptx
Introduction-to-Software-Development-Outsourcing.pptxIntroduction-to-Software-Development-Outsourcing.pptx
Introduction-to-Software-Development-Outsourcing.pptxIntelliSource Technologies
 
Kawika Technologies pvt ltd Software Development Company in Trivandrum
Kawika Technologies pvt ltd Software Development Company in TrivandrumKawika Technologies pvt ltd Software Development Company in Trivandrum
Kawika Technologies pvt ltd Software Development Company in TrivandrumKawika Technologies
 
Deep Learning for Images with PyTorch - Datacamp
Deep Learning for Images with PyTorch - DatacampDeep Learning for Images with PyTorch - Datacamp
Deep Learning for Images with PyTorch - DatacampVICTOR MAESTRE RAMIREZ
 
Cybersecurity Challenges with Generative AI - for Good and Bad
Cybersecurity Challenges with Generative AI - for Good and BadCybersecurity Challenges with Generative AI - for Good and Bad
Cybersecurity Challenges with Generative AI - for Good and BadIvo Andreev
 
About .NET 8 and a first glimpse into .NET9
About .NET 8 and a first glimpse into .NET9About .NET 8 and a first glimpse into .NET9
About .NET 8 and a first glimpse into .NET9Jürgen Gutsch
 
Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...
Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...
Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...Jaydeep Chhasatia
 
Top Software Development Trends in 2024
Top Software Development Trends in  2024Top Software Development Trends in  2024
Top Software Development Trends in 2024Mind IT Systems
 
Watermarking in Source Code: Applications and Security Challenges
Watermarking in Source Code: Applications and Security ChallengesWatermarking in Source Code: Applications and Security Challenges
Watermarking in Source Code: Applications and Security ChallengesShyamsundar Das
 

Kürzlich hochgeladen (20)

Leveraging DxSherpa's Generative AI Services to Unlock Human-Machine Harmony
Leveraging DxSherpa's Generative AI Services to Unlock Human-Machine HarmonyLeveraging DxSherpa's Generative AI Services to Unlock Human-Machine Harmony
Leveraging DxSherpa's Generative AI Services to Unlock Human-Machine Harmony
 
online pdf editor software solutions.pdf
online pdf editor software solutions.pdfonline pdf editor software solutions.pdf
online pdf editor software solutions.pdf
 
JS-Experts - Cybersecurity for Generative AI
JS-Experts - Cybersecurity for Generative AIJS-Experts - Cybersecurity for Generative AI
JS-Experts - Cybersecurity for Generative AI
 
Big Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/ML
Big Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/MLBig Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/ML
Big Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/ML
 
Mastering Kubernetes - Basics and Advanced Concepts using Example Project
Mastering Kubernetes - Basics and Advanced Concepts using Example ProjectMastering Kubernetes - Basics and Advanced Concepts using Example Project
Mastering Kubernetes - Basics and Advanced Concepts using Example Project
 
Kubernetes go-live checklist for your microservices.pptx
Kubernetes go-live checklist for your microservices.pptxKubernetes go-live checklist for your microservices.pptx
Kubernetes go-live checklist for your microservices.pptx
 
20240330_고급진 코드를 위한 exception 다루기
20240330_고급진 코드를 위한 exception 다루기20240330_고급진 코드를 위한 exception 다루기
20240330_고급진 코드를 위한 exception 다루기
 
OpenChain Webinar: Universal CVSS Calculator
OpenChain Webinar: Universal CVSS CalculatorOpenChain Webinar: Universal CVSS Calculator
OpenChain Webinar: Universal CVSS Calculator
 
ERP For Electrical and Electronics manufecturing.pptx
ERP For Electrical and Electronics manufecturing.pptxERP For Electrical and Electronics manufecturing.pptx
ERP For Electrical and Electronics manufecturing.pptx
 
Growing Oxen: channel operators and retries
Growing Oxen: channel operators and retriesGrowing Oxen: channel operators and retries
Growing Oxen: channel operators and retries
 
eAuditor Audits & Inspections - conduct field inspections
eAuditor Audits & Inspections - conduct field inspectionseAuditor Audits & Inspections - conduct field inspections
eAuditor Audits & Inspections - conduct field inspections
 
Introduction-to-Software-Development-Outsourcing.pptx
Introduction-to-Software-Development-Outsourcing.pptxIntroduction-to-Software-Development-Outsourcing.pptx
Introduction-to-Software-Development-Outsourcing.pptx
 
Kawika Technologies pvt ltd Software Development Company in Trivandrum
Kawika Technologies pvt ltd Software Development Company in TrivandrumKawika Technologies pvt ltd Software Development Company in Trivandrum
Kawika Technologies pvt ltd Software Development Company in Trivandrum
 
Deep Learning for Images with PyTorch - Datacamp
Deep Learning for Images with PyTorch - DatacampDeep Learning for Images with PyTorch - Datacamp
Deep Learning for Images with PyTorch - Datacamp
 
Sustainable Web Design - Claire Thornewill
Sustainable Web Design - Claire ThornewillSustainable Web Design - Claire Thornewill
Sustainable Web Design - Claire Thornewill
 
Cybersecurity Challenges with Generative AI - for Good and Bad
Cybersecurity Challenges with Generative AI - for Good and BadCybersecurity Challenges with Generative AI - for Good and Bad
Cybersecurity Challenges with Generative AI - for Good and Bad
 
About .NET 8 and a first glimpse into .NET9
About .NET 8 and a first glimpse into .NET9About .NET 8 and a first glimpse into .NET9
About .NET 8 and a first glimpse into .NET9
 
Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...
Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...
Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...
 
Top Software Development Trends in 2024
Top Software Development Trends in  2024Top Software Development Trends in  2024
Top Software Development Trends in 2024
 
Watermarking in Source Code: Applications and Security Challenges
Watermarking in Source Code: Applications and Security ChallengesWatermarking in Source Code: Applications and Security Challenges
Watermarking in Source Code: Applications and Security Challenges
 

Projections explained