Project IO - TS-Conf 2019

Federico Feroldi
Federico FeroldiDigital Transformation leadership & CTO
FEDERICO FEROLDI ● TS-CONF 2019
Project IO - TS-Conf 2019
PASSIVE
GOVERNMENT
PROACTIVE
GOVERNMENT
LEARN MORE AT IO.ITALIA.IT
60+K

LINES OF CODE
30+

CONTRIBUTORS
1700+

PULL REQUESTS
100%

OPEN SOURCE
APP BACKEND PLATFORM API
EMAIL
HIGH LEVEL
ARCHITECTURE
PUBLIC

ADMINISTRATION
BANK OR
PAYMENT PROCESSOR
WHY TYPESCRIPT?
FULLSTACK
MOBILE

REACT-NATIVE
WEB

REACT
BACKEND

NODEJS, EXPRESS, AZURE FUNCTIONS
TOOLING

NODEJS
– nobody ever
“I love when we discover
bugs in production.”
LESS BUGS
SELF DOCUMENTING
IO-APP

REACT-NATIVE
IO-ONBOARDING

REACT
IO-BACKEND

NODEJS, EXPRESS
IO-FUNCTIONS

AZURE FUNCTIONS
IO-FUNCTIONS-COMMONS

SHARED FUNCTIONS CODE
IO-TS-COMMONS

SPECIALIZED TYPES, TYPE SAFE REQUEST/RESPONSES, RETRIABLE TASKS, POT DATA
IO-SPID-COMMONS

SHARED SPID CODE
IO-PAGOPA-COMMONS

SHARED SPID CODE
IO-TS

RUNTIME AND COMPILE TIME TYPES
FP-TS

OPTION, EITHER, ETC…
ARCHITECTURE
TYPESAFE REST
CLIENT/SERVER
TYPESAFE REQUESTS
AND RESPONSES
+ OPENAPI SPECSgen-api-models
IO-TS MODELS + REQUEST TYPES
TYPED CLIENT TYPED SERVER
GENERATES
TYPESCRIPT CODE
RUNTIME INSTANCES
PAYLOAD
(SWAGGER)
CreatedMessageWithContent:
  type: object
  properties:
    id:
      type: string
    fiscal_code:
      $ref: "#/FiscalCode"
    time_to_live:
      $ref: "#/TimeToLiveSeconds"
    created_at:
      $ref: "#/Timestamp"
    content:
      $ref: "#/MessageContent"
    sender_service_id:
      type: string
  required:
    - id
    - fiscal_code
    - created_at
}PROP TYPES
}REQUIRED PROPS
import { FiscalCode } from "./FiscalCode";
import { TimeToLiveSeconds } from "./TimeToLiveSeconds";
import { Timestamp } from "./Timestamp";
import { MessageContent } from "./MessageContent";
import * as t from "io-ts";
// required attributes
const CreatedMessageWithContentR = t.interface({
  id: t.string, fiscal_code: FiscalCode, created_at: Timestamp,
  content: MessageContent, sender_service_id: t.string
});
// optional attributes
const CreatedMessageWithContentO = t.partial({ time_to_live: TimeToLiveSeconds
});
export const CreatedMessageWithContent = t.exact(
  t.intersection([CreatedMessageWithContentR, CreatedMessageWithContentO],
    "CreatedMessageWithContent"));
export type CreatedMessageWithContent = t.TypeOf<
  typeof CreatedMessageWithContent
>;
PAYLOAD

(IO-TS)
}TYPE
DEPENDENCIES
RUNTIME
TYPE
COMPILE TIME TYPE
OPERATION
(SWAGGER)
  "/messages/{id}":
    parameters:
      - name: id
        in: path
        type: string
        required: true
    get:
      operationId: getUserMessage
      responses:
        "200":
          schema:
            $ref: "#/definitions/CreatedMessageWithContent"
        "400":
          schema:
            $ref: "#/definitions/ProblemJson"
        "404":
          schema:
            $ref: "#/definitions/ProblemJson"
        "429":
}PATH PARAMETER
}RESPONSES
OPERATION NAME
OPERATION
(SERVER)
  public readonly getMessage = (
    req: express.Request
  ): Promise<
    | IResponseErrorInternal
    | IResponseErrorValidation
    | IResponseErrorNotFound
    | IResponseErrorTooManyRequests
    | IResponseSuccessJson<CreatedMessageWithContent>
  >
}RESPONSES
STATUS AND
PAYLOAD TYPE
interface IResponse<T> {
    readonly kind: T;
    readonly apply: (response: express.Response) => void;
    readonly detail?: string;
}
DISCRIMINATES RESPONSE
TYPE (STATUS)
GENERATES EXPRESS

HTTP RESPONSE
EXTRA INFO FOR LOGGING
OPERATION
(SERVER)
function toExpressHandler<T>(
  handler: (req: express.Request) => Promise<IResponse<T>>
): (req: express.Request, res: express.Response) => void {
  return (req, res) =>
    handler(req).then(response => response.apply(res));
}
TYPE SAFE
CONTROLLER
RUNS CONTROLLER FOR
HTTP REQUEST
APPLIES IResponse TO
HTTP RESPONSE
GENERIC 

OPERATION
(CLIENT)
interface IBaseApiRequestType<
M extends RequestMethod,
P,
H extends RequestHeaderKey,
Q extends string,
R> {
    readonly method: M;
    readonly url: (params: P) => string;
    readonly query: (params: P) => RequestQuery<Q>;
    readonly headers: RequestHeaderProducer<P, H>;
    readonly response_decoder: ResponseDecoder<R>;
}
“GET” | “POST” | “PUT” | “DELETE”
INPUT PARAMETERS
DECODES RAW HTTP RESPONSE
GENERIC

RESPONSE

DECODER
(CLIENT)
type ResponseDecoder<R> = (response: Response) => 
Promise<t.Validation<R> | undefined>;
COMPILE TIME DESCRIPTION
OF A RESPONSE
interface IResponseType<S extends number, T> {
    readonly status: S;
    readonly value: T;
}
IO-TS VALIDATION RESULT OF DECODING
RAW HTTP RESPONSE
OPERATION
(CLIENT)
// Request type definition
export type GetUserMessageT = r.IGetApiRequestType<
  { readonly id: string; readonly Bearer: string },
  "Authorization",
  never,
  | r.IResponseType<200, CreatedMessageWithContent>
  | r.IResponseType<400, ProblemJson>
  | r.IResponseType<401, undefined>
  | r.IResponseType<404, ProblemJson>
  | r.IResponseType<429, ProblemJson>
  | r.IResponseType<500, ProblemJson>
>;
INPUT PARAMS
OPERATION NAME
}RESPONSES
STATUS AND
PAYLOAD TYPE
REQUIRED

HEADERS
RESPONSE
DECODER
(CLIENT)
DECODES RAW HTTP
RESPONSE, RETURNS
UNION OF RESPONSE

STATUS AND PAYLOADS
OPERATION

DEFINITION

(CLIENT)
DYNAMIC URL FROM
TYPED INPUT PARAMS
MUST TYPE CHECK
AGAINST REQUEST
TYPE
  const getMessageT: GetUserMessageT = {
    method: "get",
    url: params => `/api/v1/messages/${params.id}`,
    query: _ => ({}),
    headers: tokenHeaderProducer,
    response_decoder: getUserMessageDefaultDecoder()
  };
DEFAULT RUNTIME
RESPONSE DECODER
USED TO GENERATE
CLIENT METHOD AT
RUNTIME
OPERATION
CLIENT
CREATES CLIENT FROM RUNTIME DEFINITION
TYPED INPUT
PARAMS IO-TS VALIDATION
ERRORS
UNION OF RESPONSE
TYPES AND PAYLOADS
TYPE REFINEMENTBY
FILTERING ON
RESPONSE STATUS
DISCRIMINTED UNION
ON STATUS
TYPE === ProblemJson
TYPE === CreatedMessageWithContent
• SERVER AND CLIENT FROM SAME OPENAPI SPEC
• ENCODER AND DECODER FROM SINGLE IO-TS TYPE
• TYPE CHECKED RESPONSES IN SERVER
• TYPE CHECKED REQUEST PARAMETERS IN CLIENT
• RICH RESPONSE TYPE WITH ALL STATUS AND PAYLOADS
• TYPE REFINEMENT BY FILTERING ON RESPONSE STATUS
BENEFITS
HANDLING STATES
OF REMOTE DATA
None NoneLoading Some<T>
NoneError<E>NoneUpdating<T>
SomeLoading<T>
SomeError<T, E>SomeUpdating<T>
OPTIONAL VALUE WITH

LOADING STATES
type Pot<T, E> =
None | NoneLoading | NoneUpdating<T> | NoneError<E> | 
Some<T> | SomeLoading<T> | SomeUpdating<T> | SomeError<T, E>;
CONTAINED
VALUE
ERROR
toLoading toLoading
toLoading
toLoading
toUpdating
toUpdating
toUpdating toUpdating
toError toError
toError
toError
EXAMPLE
REACT
type State = {
  calendars: pot.Pot<ReadonlyArray<Calendar>, ResourceError>;
};
<Content style={styles.content}>
  {pot.isLoading(calendars) && <Text>Loading...</Text>}
  {pot.isError(calendars) && <Text>{calendars.error}</Text>}
  {pot.isSome(calendars) && (
    {calendars.value.map(calendar => (
      <CalendarItem
        key={calendar.id}
        calendar={calendar} 
      />
    ))}
LOADING STATE, NO DATA
ERROR STATE
LOADED STATE, DATA AVAILABLE
• ENCAPSULATES STATES OF REMOTE DATA
• SENSIBLE STATE TRANSITIONS
• USEFUL FOR HANDLING STATES IN UI (isLoading, isUpdating, …)
• HELPERS: MAP, FOLD, TOOPTION, TOUNDEFINED
• STORES PREVIOUS VALUE IN CASE OF ERROR (ROLLBACK)
BENEFITS
TAGGED IO-TS TYPES
type Tagged<T, A, O = A, I = t.mixed> = t.Type<A & T, O & T, I>;
const tag = <T>() => <A, O = A, I = t.mixed>(
  type: t.Type<A, O, I>
): Tagged<T, A, O, I> => type as any;
TAG BASE TYPE
interface IPatternStringTag<P extends string> {
  readonly pattern: P;
  readonly kind: "IPatternStringTag";
}
const PatternString = <P extends string, T extends IPatternStringTag<P>>(
  p: P
): Tagged<T, string> =>
  tag<T>()(
    t.refinement(
      t.string,
      s => s.match(p) !== null,
      `string that matches the pattern "${p}"`
    )
  );
type PatternString<P extends string> = string & IPatternStringTag<P>;
TYPED STRING
PATTERN
TYPED STRING
PATTERN
const FiscalCode = PatternString(
  "^[A-Z]{6}[0-9LMNPQRSTUV]{2}[ABCDEHLMPRST][0-9LMNPQRSTUV]{2}[A-Z]
[0-9LMNPQRSTUV]{3}[A-Z]$"
);
export type FiscalCode = t.TypeOf<typeof FiscalCode>;
interface IWithinRangeNumberTag<L extends number, 

H extends number> {
  readonly lower: L;
  readonly higher: H;
  readonly kind: "IWithinRangeNumberTag";
}
const WithinRangeNumber = <L extends number, H extends number,
  T extends IWithinRangeNumberTag<L, H>
>(
  l: L,
  h: H
): Tagged<T, number> =>
  tag<T>()(
    t.refinement(t.number, s => s >= l && s < h, `number >= ${l} and < ${h}`)
  );
type WithinRangeNumber<L extends number, H extends number> = number &
  IWithinRangeNumberTag<L, H>;
TYPED NUMBER
IN RANGE
LINTING
SHARED TSLINT RULES PACKAGE (IO-TSLINT-RULES)
TSLINT

SHARED RULES
{
    "defaultSeverity": "error",
    "extends": [
      "italia-tslint-rules/strong"
    ]
}
TSLINT

CUSTOM RULES
1) TYPE CHECK ON YIELD RETURN VALUE
TSLINT WILL CHECK THAT THESE TWO
TYPES ARE COMPATIBLE
2) ERROR ON TSLINT-DISABLE
LEARNING / GOTCHAS
• DEVELOPERS WILL FALL BACK TO “ANY”
• DEVELOPERS WILL DISABLE TSLINT (SEE CUSTOM RULE)
• @TYPES VERSION MISMATCH (WILL HAVE CORRECT TYPES?)
• LONG BUILD TIMES (TSLINT + TSC + JEST)
• INTEROP WITH PURESCRIPT?
TYPESCRIPT
• AWESOME FOUNDATION
• QUICK WINS (OPTION, EITHER)
• HARD TO MASTER FUNCTIONAL PARADIGMS (BETTER INTRO?)
• DO NOT MIX VERSIONS!!! (USE yarn-deduplicate)
IO-TS / FP-TS
THANK YOU
• FOLLOW US @TEAMDIGITALEIT @PAGOPA #PROGETTOIO
• EXPLORE GITHUB.COM/TEAMDIGITALE
• PRs WELCOME! (DOCUMENTATION, TESTS, FP IDIOMS)
• WE ARE HIRING: PAGOPA.GOV.IT
1 of 43

Recommended

apidays LIVE Jakarta - E5 ways to make your integration more resilient by Je... by
apidays LIVE Jakarta - E5 ways to make your integration more resilient  by Je...apidays LIVE Jakarta - E5 ways to make your integration more resilient  by Je...
apidays LIVE Jakarta - E5 ways to make your integration more resilient by Je...apidays
129 views37 slides
Losant craig baldwin cwin18_toulouse by
Losant craig baldwin cwin18_toulouseLosant craig baldwin cwin18_toulouse
Losant craig baldwin cwin18_toulouseCapgemini
113 views30 slides
AWS Stripe Meetup - Powering UK Startup Economy by
AWS Stripe Meetup - Powering UK Startup EconomyAWS Stripe Meetup - Powering UK Startup Economy
AWS Stripe Meetup - Powering UK Startup EconomyAmazon Web Services
650 views59 slides
Virtual enterprise synthesys by
 Virtual enterprise synthesys Virtual enterprise synthesys
Virtual enterprise synthesysVictor Romanov
672 views19 slides
Craft Conference 2015 - Evolution of the PayPal API: Platform & Culture by
Craft Conference 2015 - Evolution of the PayPal API: Platform & CultureCraft Conference 2015 - Evolution of the PayPal API: Platform & Culture
Craft Conference 2015 - Evolution of the PayPal API: Platform & CultureDeepak Nadig
1.9K views24 slides
Enhancing Enterprise Architecture with Artificial Intelligence by
Enhancing Enterprise Architecture with Artificial IntelligenceEnhancing Enterprise Architecture with Artificial Intelligence
Enhancing Enterprise Architecture with Artificial IntelligencePatrice Kerremans
405 views80 slides

More Related Content

Similar to Project IO - TS-Conf 2019

App to AppExchange - A Journey from Idea to Market for Salesforce Developers by
App to AppExchange - A Journey from Idea to Market for Salesforce DevelopersApp to AppExchange - A Journey from Idea to Market for Salesforce Developers
App to AppExchange - A Journey from Idea to Market for Salesforce DevelopersEric Shupps
52 views24 slides
Lightweight Business Intelligence with MongoDB by
Lightweight Business Intelligence with MongoDBLightweight Business Intelligence with MongoDB
Lightweight Business Intelligence with MongoDBMongoDB
2.4K views42 slides
Lightweight Business Intelligence with MongoDB by
Lightweight Business Intelligence with MongoDBLightweight Business Intelligence with MongoDB
Lightweight Business Intelligence with MongoDBMongoDB
2.8K views42 slides
Evolving big microservice architectures by
Evolving big microservice architecturesEvolving big microservice architectures
Evolving big microservice architecturesNikolay Stoitsev
122 views95 slides
Lunch and Learn: Recognising the Good Guys by
Lunch and Learn: Recognising the Good GuysLunch and Learn: Recognising the Good Guys
Lunch and Learn: Recognising the Good GuysTransUnion
88 views29 slides
Hello istio by
Hello istioHello istio
Hello istioJooho Lee
230 views25 slides

Similar to Project IO - TS-Conf 2019(20)

App to AppExchange - A Journey from Idea to Market for Salesforce Developers by Eric Shupps
App to AppExchange - A Journey from Idea to Market for Salesforce DevelopersApp to AppExchange - A Journey from Idea to Market for Salesforce Developers
App to AppExchange - A Journey from Idea to Market for Salesforce Developers
Eric Shupps52 views
Lightweight Business Intelligence with MongoDB by MongoDB
Lightweight Business Intelligence with MongoDBLightweight Business Intelligence with MongoDB
Lightweight Business Intelligence with MongoDB
MongoDB2.4K views
Lightweight Business Intelligence with MongoDB by MongoDB
Lightweight Business Intelligence with MongoDBLightweight Business Intelligence with MongoDB
Lightweight Business Intelligence with MongoDB
MongoDB2.8K views
Evolving big microservice architectures by Nikolay Stoitsev
Evolving big microservice architecturesEvolving big microservice architectures
Evolving big microservice architectures
Nikolay Stoitsev122 views
Lunch and Learn: Recognising the Good Guys by TransUnion
Lunch and Learn: Recognising the Good GuysLunch and Learn: Recognising the Good Guys
Lunch and Learn: Recognising the Good Guys
TransUnion88 views
Hello istio by Jooho Lee
Hello istioHello istio
Hello istio
Jooho Lee230 views
"Fintech inside of a SaaS powered by 2000+ Microservices", Volodymyr Malyk by Fwdays
"Fintech inside of a SaaS powered by 2000+ Microservices", Volodymyr Malyk"Fintech inside of a SaaS powered by 2000+ Microservices", Volodymyr Malyk
"Fintech inside of a SaaS powered by 2000+ Microservices", Volodymyr Malyk
Fwdays439 views
José Antonio Ruiz Santiago | JModern processes and workflows orchestration in... by Codemotion
José Antonio Ruiz Santiago | JModern processes and workflows orchestration in...José Antonio Ruiz Santiago | JModern processes and workflows orchestration in...
José Antonio Ruiz Santiago | JModern processes and workflows orchestration in...
Codemotion139 views
Am i doing deployments right v2 by Matteo Emili
Am i doing deployments right v2Am i doing deployments right v2
Am i doing deployments right v2
Matteo Emili93 views
Plataforma distribuída de Microserviços ou, como a Olist funciona by Osvaldo Santana Neto
Plataforma distribuída de Microserviços ou, como a Olist funcionaPlataforma distribuída de Microserviços ou, como a Olist funciona
Plataforma distribuída de Microserviços ou, como a Olist funciona
Is Technical Debt the right metaphor for Continuous Update - AllDayDevOps 2022 by Giulio Vian
Is Technical Debt the right metaphor for Continuous Update - AllDayDevOps 2022Is Technical Debt the right metaphor for Continuous Update - AllDayDevOps 2022
Is Technical Debt the right metaphor for Continuous Update - AllDayDevOps 2022
Giulio Vian33 views
Twilio Contact Center Overview by Twilio Inc
Twilio Contact Center OverviewTwilio Contact Center Overview
Twilio Contact Center Overview
Twilio Inc2.9K views
AWS Sydney Summit 2013 - Continuous Deployment Practices, with Production, Te... by Amazon Web Services
AWS Sydney Summit 2013 - Continuous Deployment Practices, with Production, Te...AWS Sydney Summit 2013 - Continuous Deployment Practices, with Production, Te...
AWS Sydney Summit 2013 - Continuous Deployment Practices, with Production, Te...
Amazon Web Services3.9K views
Appboy: Operating in the Cloud for 850 Million Monthly Active Users, FutureSt... by New Relic
Appboy: Operating in the Cloud for 850 Million Monthly Active Users, FutureSt...Appboy: Operating in the Cloud for 850 Million Monthly Active Users, FutureSt...
Appboy: Operating in the Cloud for 850 Million Monthly Active Users, FutureSt...
New Relic394 views
Evolution of the PayPal API Platform Enabling the future of Money at QCon San... by Deepak Nadig
Evolution of the PayPal API Platform Enabling the future of Money at QCon San...Evolution of the PayPal API Platform Enabling the future of Money at QCon San...
Evolution of the PayPal API Platform Enabling the future of Money at QCon San...
Deepak Nadig1.6K views
APIdays Paris 2019 - Adopting Service Mesh by Marco Palladino , Kong by apidays
APIdays Paris 2019 - Adopting Service Mesh by Marco Palladino , KongAPIdays Paris 2019 - Adopting Service Mesh by Marco Palladino , Kong
APIdays Paris 2019 - Adopting Service Mesh by Marco Palladino , Kong
apidays42 views

More from Federico Feroldi

Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C... by
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...Federico Feroldi
494 views33 slides
From 1 to infinity: how to scale your tech organization, build a great cultur... by
From 1 to infinity: how to scale your tech organization, build a great cultur...From 1 to infinity: how to scale your tech organization, build a great cultur...
From 1 to infinity: how to scale your tech organization, build a great cultur...Federico Feroldi
573 views27 slides
A Blueprint for Scala Microservices by
A Blueprint for Scala MicroservicesA Blueprint for Scala Microservices
A Blueprint for Scala MicroservicesFederico Feroldi
4.1K views46 slides
From Startup to Exit in 18 months by
From Startup to Exit in 18 monthsFrom Startup to Exit in 18 months
From Startup to Exit in 18 monthsFederico Feroldi
1.3K views9 slides
Design and development of an Online Social Network crawler by
Design and development of an Online Social Network crawlerDesign and development of an Online Social Network crawler
Design and development of an Online Social Network crawlerFederico Feroldi
1.2K views86 slides
Scaling web application in the Cloud by
Scaling web application in the CloudScaling web application in the Cloud
Scaling web application in the CloudFederico Feroldi
2.8K views34 slides

More from Federico Feroldi(12)

Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C... by Federico Feroldi
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
Federico Feroldi494 views
From 1 to infinity: how to scale your tech organization, build a great cultur... by Federico Feroldi
From 1 to infinity: how to scale your tech organization, build a great cultur...From 1 to infinity: how to scale your tech organization, build a great cultur...
From 1 to infinity: how to scale your tech organization, build a great cultur...
Federico Feroldi573 views
A Blueprint for Scala Microservices by Federico Feroldi
A Blueprint for Scala MicroservicesA Blueprint for Scala Microservices
A Blueprint for Scala Microservices
Federico Feroldi4.1K views
From Startup to Exit in 18 months by Federico Feroldi
From Startup to Exit in 18 monthsFrom Startup to Exit in 18 months
From Startup to Exit in 18 months
Federico Feroldi1.3K views
Design and development of an Online Social Network crawler by Federico Feroldi
Design and development of an Online Social Network crawlerDesign and development of an Online Social Network crawler
Design and development of an Online Social Network crawler
Federico Feroldi1.2K views
Scaling web application in the Cloud by Federico Feroldi
Scaling web application in the CloudScaling web application in the Cloud
Scaling web application in the Cloud
Federico Feroldi2.8K views
Innovate, optimize and profit with cloud computing by Federico Feroldi
Innovate, optimize and profit with cloud computingInnovate, optimize and profit with cloud computing
Innovate, optimize and profit with cloud computing
Federico Feroldi521 views
Crawling the web for fun and profit by Federico Feroldi
Crawling the web for fun and profitCrawling the web for fun and profit
Crawling the web for fun and profit
Federico Feroldi8.5K views
Cloudify your applications with Amazon Web Services by Federico Feroldi
Cloudify your applications with Amazon Web ServicesCloudify your applications with Amazon Web Services
Cloudify your applications with Amazon Web Services
Federico Feroldi2.3K views

Recently uploaded

Melek BEN MAHMOUD.pdf by
Melek BEN MAHMOUD.pdfMelek BEN MAHMOUD.pdf
Melek BEN MAHMOUD.pdfMelekBenMahmoud
14 views1 slide
STKI Israeli Market Study 2023 corrected forecast 2023_24 v3.pdf by
STKI Israeli Market Study 2023   corrected forecast 2023_24 v3.pdfSTKI Israeli Market Study 2023   corrected forecast 2023_24 v3.pdf
STKI Israeli Market Study 2023 corrected forecast 2023_24 v3.pdfDr. Jimmy Schwarzkopf
19 views29 slides
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive by
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLiveAutomating a World-Class Technology Conference; Behind the Scenes of CiscoLive
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLiveNetwork Automation Forum
31 views35 slides
Microsoft Power Platform.pptx by
Microsoft Power Platform.pptxMicrosoft Power Platform.pptx
Microsoft Power Platform.pptxUni Systems S.M.S.A.
53 views38 slides
The Research Portal of Catalonia: Growing more (information) & more (services) by
The Research Portal of Catalonia: Growing more (information) & more (services)The Research Portal of Catalonia: Growing more (information) & more (services)
The Research Portal of Catalonia: Growing more (information) & more (services)CSUC - Consorci de Serveis Universitaris de Catalunya
80 views25 slides
SUPPLIER SOURCING.pptx by
SUPPLIER SOURCING.pptxSUPPLIER SOURCING.pptx
SUPPLIER SOURCING.pptxangelicacueva6
15 views1 slide

Recently uploaded(20)

STKI Israeli Market Study 2023 corrected forecast 2023_24 v3.pdf by Dr. Jimmy Schwarzkopf
STKI Israeli Market Study 2023   corrected forecast 2023_24 v3.pdfSTKI Israeli Market Study 2023   corrected forecast 2023_24 v3.pdf
STKI Israeli Market Study 2023 corrected forecast 2023_24 v3.pdf
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive by Network Automation Forum
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLiveAutomating a World-Class Technology Conference; Behind the Scenes of CiscoLive
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive
Igniting Next Level Productivity with AI-Infused Data Integration Workflows by Safe Software
Igniting Next Level Productivity with AI-Infused Data Integration Workflows Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Safe Software263 views
SAP Automation Using Bar Code and FIORI.pdf by Virendra Rai, PMP
SAP Automation Using Bar Code and FIORI.pdfSAP Automation Using Bar Code and FIORI.pdf
SAP Automation Using Bar Code and FIORI.pdf
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f... by TrustArc
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc Webinar - Managing Online Tracking Technology Vendors_ A Checklist f...
TrustArc10 views
Future of AR - Facebook Presentation by ssuserb54b561
Future of AR - Facebook PresentationFuture of AR - Facebook Presentation
Future of AR - Facebook Presentation
ssuserb54b56114 views
Piloting & Scaling Successfully With Microsoft Viva by Richard Harbridge
Piloting & Scaling Successfully With Microsoft VivaPiloting & Scaling Successfully With Microsoft Viva
Piloting & Scaling Successfully With Microsoft Viva
6g - REPORT.pdf by Liveplex
6g - REPORT.pdf6g - REPORT.pdf
6g - REPORT.pdf
Liveplex10 views
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N... by James Anderson
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...
James Anderson85 views

Project IO - TS-Conf 2019