SlideShare a Scribd company logo
1 of 43
Download to read offline
FEDERICO FEROLDI ● 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

More Related Content

Similar to Project IO - TS-Conf 2019

App to AppExchange - A Journey from Idea to Market for Salesforce Developers
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
 
Lightweight Business Intelligence with MongoDB
Lightweight Business Intelligence with MongoDBLightweight Business Intelligence with MongoDB
Lightweight Business Intelligence with MongoDBMongoDB
 
Lightweight Business Intelligence with MongoDB
Lightweight Business Intelligence with MongoDBLightweight Business Intelligence with MongoDB
Lightweight Business Intelligence with MongoDBMongoDB
 
Evolving big microservice architectures
Evolving big microservice architecturesEvolving big microservice architectures
Evolving big microservice architecturesNikolay Stoitsev
 
Lunch and Learn: Recognising the Good Guys
Lunch and Learn: Recognising the Good GuysLunch and Learn: Recognising the Good Guys
Lunch and Learn: Recognising the Good GuysTransUnion
 
"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
"Fintech inside of a SaaS powered by 2000+ Microservices", Volodymyr MalykFwdays
 
Cloud iot-new-software-requirements
Cloud iot-new-software-requirementsCloud iot-new-software-requirements
Cloud iot-new-software-requirementsRoberto C. Mayer
 
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...
José Antonio Ruiz Santiago | JModern processes and workflows orchestration in...Codemotion
 
(Micro?)services architecture in practice
(Micro?)services architecture in practice(Micro?)services architecture in practice
(Micro?)services architecture in practiceThe Software House
 
Am i doing deployments right v2
Am i doing deployments right v2Am i doing deployments right v2
Am i doing deployments right v2Matteo Emili
 
Plataforma distribuída de Microserviços ou, como a Olist funciona
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 funcionaOsvaldo Santana Neto
 
Is Technical Debt the right metaphor for Continuous Update - AllDayDevOps 2022
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 2022Giulio Vian
 
Twilio Contact Center Overview
Twilio Contact Center OverviewTwilio Contact Center Overview
Twilio Contact Center OverviewTwilio Inc
 
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...
AWS Sydney Summit 2013 - Continuous Deployment Practices, with Production, Te...Amazon Web Services
 
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...
Appboy: Operating in the Cloud for 850 Million Monthly Active Users, FutureSt...New Relic
 
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...
Evolution of the PayPal API Platform Enabling the future of Money at QCon San...Deepak Nadig
 
APIdays Paris 2019 - Adopting Service Mesh by Marco Palladino , Kong
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 , Kongapidays
 

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

App to AppExchange - A Journey from Idea to Market for Salesforce Developers
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
 
Lightweight Business Intelligence with MongoDB
Lightweight Business Intelligence with MongoDBLightweight Business Intelligence with MongoDB
Lightweight Business Intelligence with MongoDB
 
Lightweight Business Intelligence with MongoDB
Lightweight Business Intelligence with MongoDBLightweight Business Intelligence with MongoDB
Lightweight Business Intelligence with MongoDB
 
Evolving big microservice architectures
Evolving big microservice architecturesEvolving big microservice architectures
Evolving big microservice architectures
 
Lunch and Learn: Recognising the Good Guys
Lunch and Learn: Recognising the Good GuysLunch and Learn: Recognising the Good Guys
Lunch and Learn: Recognising the Good Guys
 
Hello istio
Hello istioHello istio
Hello istio
 
"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
"Fintech inside of a SaaS powered by 2000+ Microservices", Volodymyr Malyk
 
Cloud iot-new-software-requirements
Cloud iot-new-software-requirementsCloud iot-new-software-requirements
Cloud iot-new-software-requirements
 
No Refresh Needed
No Refresh NeededNo Refresh Needed
No Refresh Needed
 
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...
José Antonio Ruiz Santiago | JModern processes and workflows orchestration in...
 
(Micro?)services architecture in practice
(Micro?)services architecture in practice(Micro?)services architecture in practice
(Micro?)services architecture in practice
 
Am i doing deployments right v2
Am i doing deployments right v2Am i doing deployments right v2
Am i doing deployments right v2
 
Plataforma distribuída de Microserviços ou, como a Olist funciona
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
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
 
Twilio Contact Center Overview
Twilio Contact Center OverviewTwilio Contact Center Overview
Twilio Contact Center Overview
 
Web Advantages
Web AdvantagesWeb Advantages
Web Advantages
 
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...
AWS Sydney Summit 2013 - Continuous Deployment Practices, with Production, Te...
 
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...
Appboy: Operating in the Cloud for 850 Million Monthly Active Users, FutureSt...
 
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...
Evolution of the PayPal API Platform Enabling the future of Money at QCon San...
 
APIdays Paris 2019 - Adopting Service Mesh by Marco Palladino , Kong
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
 

More from 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...
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...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...
From 1 to infinity: how to scale your tech organization, build a great cultur...Federico Feroldi
 
A Blueprint for Scala Microservices
A Blueprint for Scala MicroservicesA Blueprint for Scala Microservices
A Blueprint for Scala MicroservicesFederico Feroldi
 
From Startup to Exit in 18 months
From Startup to Exit in 18 monthsFrom Startup to Exit in 18 months
From Startup to Exit in 18 monthsFederico Feroldi
 
Design and development of an Online Social Network crawler
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
 
Scaling web application in the Cloud
Scaling web application in the CloudScaling web application in the Cloud
Scaling web application in the CloudFederico Feroldi
 
Innovate, optimize and profit with cloud computing
Innovate, optimize and profit with cloud computingInnovate, optimize and profit with cloud computing
Innovate, optimize and profit with cloud computingFederico Feroldi
 
Crawling the web for fun and profit
Crawling the web for fun and profitCrawling the web for fun and profit
Crawling the web for fun and profitFederico Feroldi
 
Cloudify your applications with Amazon Web Services
Cloudify your applications with Amazon Web ServicesCloudify your applications with Amazon Web Services
Cloudify your applications with Amazon Web ServicesFederico Feroldi
 
Cloudify - Scalability On Demand
Cloudify - Scalability On DemandCloudify - Scalability On Demand
Cloudify - Scalability On DemandFederico Feroldi
 
Federico Feroldi Php In Yahoo
Federico Feroldi Php In YahooFederico Feroldi Php In Yahoo
Federico Feroldi Php In YahooFederico Feroldi
 

More from Federico Feroldi (12)

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...
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - C...
 
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...
From 1 to infinity: how to scale your tech organization, build a great cultur...
 
A Blueprint for Scala Microservices
A Blueprint for Scala MicroservicesA Blueprint for Scala Microservices
A Blueprint for Scala Microservices
 
From Startup to Exit in 18 months
From Startup to Exit in 18 monthsFrom Startup to Exit in 18 months
From Startup to Exit in 18 months
 
Design and development of an Online Social Network crawler
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
 
Scaling web application in the Cloud
Scaling web application in the CloudScaling web application in the Cloud
Scaling web application in the Cloud
 
Innovate, optimize and profit with cloud computing
Innovate, optimize and profit with cloud computingInnovate, optimize and profit with cloud computing
Innovate, optimize and profit with cloud computing
 
Crawling the web for fun and profit
Crawling the web for fun and profitCrawling the web for fun and profit
Crawling the web for fun and profit
 
Cloudify your applications with Amazon Web Services
Cloudify your applications with Amazon Web ServicesCloudify your applications with Amazon Web Services
Cloudify your applications with Amazon Web Services
 
the Picmix experiment
the Picmix experimentthe Picmix experiment
the Picmix experiment
 
Cloudify - Scalability On Demand
Cloudify - Scalability On DemandCloudify - Scalability On Demand
Cloudify - Scalability On Demand
 
Federico Feroldi Php In Yahoo
Federico Feroldi Php In YahooFederico Feroldi Php In Yahoo
Federico Feroldi Php In Yahoo
 

Recently uploaded

04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 

Recently uploaded (20)

04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 

Project IO - TS-Conf 2019