EN flag
Listino Supporto Partner Contatti 800 13.40.41

Articoli

Icona delle News


GCP: il cloud di Google

GCP il cloud di Google

02/07/20 CoreTech Blog

di Carlo Parodo

Una panoramica sulle funzionalità principali delle architetture in cloud con un’introduzione all’interpretazione che Google ne fa nella sua Google Cloud Platform (GCP).

Il cloud computing

Il Cloud computing è un insieme di servizi tecnologici che vengono forniti tramite un servizio Web. Permette di avere a disposizione sistemi software e hardware sotto forma di servizi distribuiti, flessibili e scalabili.

Nel Cloud, i server sono:

  • immediatamente espandibili (e continuano a funzionare);
  • possono funzionare da soli o in grandi gruppi (anche questi espandibili).

Il cloud è conveniente per 2 ragioni principali:

  • non è necessario disporre di un team di specialisti o essere esperti in molte aree IT
    (ad es. networking).
  • Il parametro Servizio + Sicurezza + Disponibilità di solito è meno costoso di quello “in locale”.

Object Storage

Una delle più grandi invenzioni del cloud è Object Storage. In Google Cloud Platform (GCP) è Cloud Storage, in Amazon Web Services (AWS) è S3, in Azure è Blob. Da essa derivano soluzioni come Dropbox, OneDrive e Google Drive.

Nota anche come archiviazione basata sugli oggetti, è un'architettura di archiviazione dei dati che gestisce i dati stessi come oggetti, al contrario di altre architetture di archiviazione come i file system che gestiscono i dati come una gerarchia di file o l'archiviazione a blocchi che gestisce i dati come blocchi all'interno di settori e tracce.

Permette di immagazzinare, condividere e archiviare file non eseguibili, in modo sicuro, ridondante, condiviso, con molte funzionalità, a un costo minimo.

Ogni oggetto in genere include i dati stessi, una quantità variabile di metadati e un identificatore univoco.

I sistemi di Object Storage consentono la conservazione di enormi quantità di dati non strutturati. Viene utilizzato ad es. per la memorizzazione di foto su Facebook, di brani musicali su Spotify o di file su Dropbox.

Banner

Database e analisi

Un altro concetto importante nel cloud è legato a database e analisi. Il cloud supporta in modo efficiente questi elementi dell’infrastruttura offrendo servizi con elevati standard di sicurezza, spazio illimitato e failover immediato.

Il failover è la tecnica che prevede, in caso di guasto o interruzione anomala nel funzionamento di un server, un componente hardware o una rete, la commutazione automatica a una struttura analoga ridondante o in standby, in modo che il nuovo dispositivo rimpiazzi immediatamente quello non più funzionante.

Nel cloud, i tempi di inattività in caso di guasti o interruzioni, possono essere estremamente ridotti, sino quasi ad annullarsi.

Cloud per developers

Dal punto di vista dello sviluppatore di applicazioni per il cloud, oltre agli elementi classici di buona programmazione (algoritmi efficienti, codice ben strutturato, etc.), è necessario rendere il codice veloce e scalabile 

La necessità è infatti quella di poter utilizzare il codice prodotto ovunque nel mondo e da milioni di utenti, senza perdere performance di velocità e disponibilità.

Questo si traduce in scalabilità.

Il valore del codice è misurato dal numero di utenti (attuali e potenziali). Per sopportare un numero enorme di potenziali utenti, il programma deve essere eseguito in molti casi contemporaneamente. Ciò significa che l'utente può parlare, nella stessa sessione di lavoro, con macchine virtuali diverse. Tutto senza errori o anomalie.

Pertanto, il codice deve essere sessionless, ovvero non deve archiviare i dati della sessione in memoria.

Server in cloud

Nel Cloud un Server (chiamato anche VM o Instance) è una qualcosa di virtuale, costituito da un insieme di risorse che possono essere aggregate e disaggregate dinamicamente. Il concetto monolitico di hardware diventa elastico (più gomma che ferro).

Si possono avere macchine virtuali minuscole o enormi e si possono modificare le loro dimensioni al volo. E nel mentre, tutto (comprese le app) continua a funzionare. Le VM vengono controllate frequentemente e in caso di guasti, non verranno riparate.

Verranno migrate su nuovo hardware, praticamente senza interruzioni del servizio (questo può variare a seconda della configurazione).

Migrazione in cloud

Abbiamo due possibilità per ospitare le nostre applicazioni su un server in cloud:

  • un programma da installare in modo classico, oppure
  • un pacchetto sigillato con le istruzioni di installazione (container).

È possibile semplificare ulteriormente, con maggior delega al Cloud Provider, senza alcuna infrastruttura (Server, rete, IP). Il modo principale per farlo è con un PaaS, ovvero la modalità classica di un sistema Serverless.

Platform as a service (PaaS) è infatti un'attività economica che consiste nel servizio di messa a disposizione di piattaforme di elaborazione (Computing platform) e di solution stack.

Banner

Gli elementi del PaaS permettono di sviluppare, sottoporre a test, implementare e gestire le applicazioni aziendali senza i costi e la complessità associati all'acquisto, alla configurazione, all'ottimizzazione e alla gestione dell'hardware e del software di base (oneri del server).

Il PaaS in GCP è App Engine e consente di caricare il solo codice (Standard Edition) o un container (Flexible Edition):

  • Standard Edition consente di caricare solo il codice, cosa apparentemente più semplice, che è tuttavia vincolata ad avere un ambiente condiviso con un numero limitato di runtime: Python, Java, Node.js, PHP, Ruby, Go. In questo caso l’app funziona in un sandbox (un meccanismo per eseguire applicazioni in uno spazio limitato e altamente controllato), quindi saranno operate delle restrizioni.
  • Flexible Edition permette di caricare un container, quindi l'ambiente è già creato (tempo di avvio più lungo) ma possiamo usare qualunque ambiente desideriamo. Quindi, alla fine, Flexible Edition risulta essere la soluzione più semplice.

App Engine è progettato appositamente per l'app con microservizi, gestisce le versioni e le distribuzioni speciali, che consentono di aggiornare l'app senza tempi di inattività.

Soluzioni GCP

Vediamo ora una panoramica dei prodotti GCP.

Le soluzioni di computing ci consentono di eseguire il codice che sviluppiamo. Troviamo:

  • Compute Engine
  • Kubernetes Engine
  • App Engine
  • Cloud Functions

Con le soluzioni per lo storage, andremo ad immagazzinare i nostri dati, i quali verranno direttamente o indirettamente utilizzati dalle nostre applicazioni. Abbiamo

  • Cloud Storage
  • Cloud Datastore
  • Cloud SQL
  • Cloud Spanner
  • Big Table

Infine troviamo tutte le soluzioni per i Big Data e il Machine Learning. Per i Big Data abbiamo:

  • BigQuery
  • Pub/Sub
  • Dataflow
  • Dataproc
  • Datalab

Per il Machine Learning abbiamo:

  • Natural Language API
  • Vision API
  • Machine Learning
  • Speech API
  • Translate API

Regioni e zone

Alla base di tutta l’infrastruttura GCP ci sono i data center. Le singole aree geografiche in cui Google è presente con i suoi data center vengono chiamate regioni. Le regioni sono lontane almeno 100 miglia (circa 160 Km) l'una dall'altra.

Ciascuna regione è poi suddivisa in zone. Le zone rappresentano i data center veri e propri, intesi come ambienti isolati, a volte addirittura edifici completamente separati, ma all'interno di una stessa area geografica.

Le zone all'interno di una stessa regione non condividono point of failure (point of failure è una parte del sistema, hardware o software, il cui malfunzionamento può portare ad anomalie o addirittura alla cessazione del servizio da parte del sistema). Sono cioè concepite affinché un guasto ad una zona non possa comprometterne un'altra.

In questo modo ci basterà eseguire la nostra applicazione in due o tre zone differenti nella stessa regione, per avere un'applicazione resiliente. Se una zona si ferma per qualche motivo, l'applicazione continuerà comunque a funzionare nelle altre due.

Se invece la nostra è un'applicazione globale, potremmo eseguirla contemporaneamente in diverse regioni. Saremo così più vicini ai nostri utenti, in modo da diminuire la latenza di rete e contemporaneamente essere al riparo dalla perdita di un'intera regione (disaster recovery, cioè l'abilità di far fronte a disastri naturali o altri eventi catastrofici).

Virtual Private Cloud

Quello che fa da collante e che caratterizza la robustezza dell'infrastruttura di GCP è la rete: i vari data center e le risorse che vi installiamo, comunicano attraverso la rete e le risorse zonali, regionali e globali e se ne avvalgono per il loro funzionamento.

Le reti in GCP sono chiamate VPC, cioè Virtual Private Cloud (reti private virtuali in cloud). Come tutte le risorse di GCP, appartengono ad un progetto e sono isolate tra loro anche quando stanno nello stesso progetto.

Le reti di VPC sono concetti astratti e sono globali, esistono cioè in tutte le regioni del mondo. Ogni rete di VPC (VPC network) è composta da una serie di sottoreti (subnet), che sono invece regionali ed hanno un intervallo di indirizzi IP concreti. Macchine virtuali ed altre risorse GCP vengono assegnate a una sottorete da cui ricevono un indirizzo IP nell'intervallo corrispondente 

Una rete VPC è quindi fatta di una serie di sottoreti che possono essere in regioni diverse, ma che saranno comunque collegate tra di loro e accessibili l'una all'altra. Sottoreti che appartengano a reti VPC differenti non saranno accessibili l'una all'altra neanche se si trovano nella stessa regione.

Questo è il potere di isolamento che ci offrono le VPC. Per quanto riguarda l'accesso da Internet alle reti interne VPC, basta creare degli IP pubblici, che verranno mappati sugli indirizzi interni delle risorse che vogliamo esporre.

Load balancing in GCP

Le app come Amazon o Ebay, con milioni di visitatori ogni giorno, utilizzate in tutto il mondo, vengono gestite tramite svariati Web Server, pronti a elaborare ogni richiesta.

Banner

La singola richiesta viene inviata a un load balancer, non direttamente all'applicazione, che sceglierà la VM che elaborerà la risposta.

I load balancer sono come gli smistatori o classificatori di un ufficio postale. Ci possono essere molti livelli di load balancer:

  • bilanciatori del carico DNS, che traducono l’indirizzo della richiesta in diversi indirizzi IP, che possono puntare alla posizione più vicina al client (più veloce → meno latenza);
  • bilanciatore del carico di rete, molto veloce, che sposta qualsiasi tipo di dati attraverso la rete;
  • bilanciatori di carico dell'applicazione che aggiungono diverse funzionalità intelligenti come l'affinità di sessione, un meccanismo che consente al sistema di bilanciamento di associare una sessione utente a un'istanza specifica. Questo garantisce che durante la sessione tutte le richieste dell'utente vengano inviate alla stessa istanza.

I load balancer non hanno bisogno di alcun intervento diretto, occorre solo configurare e monitorare il processo. Essi si riferiscono a servizi avanzati in grado di gestire (avviare, arrestare, sostituire) le macchine virtuali che sono effettivamente necessarie 

Quando le nostre applicazioni sono installate in diverse zone o regioni, abbiamo bisogno di presentarle al mondo attraverso un unico indirizzo IP, in grado di fare bilanciamento del carico e permettere a strumenti, quali lo scaling automatico delle risorse, di operare attraverso le regioni e le zone in cui si trova la nostra applicazione da scalare.

Questa è la funzione del cloud load balancing: ci offre un singolo indirizzo IP a livello globale, che è in grado di reindirizzare le richieste a una serie di indirizzi IP interni, su diverse zone, in diverse regioni.

Una caratteristica apprezzata dei load balancer di Google è che non richiedono pre-warming, cioè non c'è bisogno di prepararli o configurarli per picchi di accesso o carichi particolarmente elevati in momenti di punta, si adattano da soli automaticamente.

Organizzazione delle risorse in GCP

Per risorse intendiamo una macchina virtuale, un cloud storage bucket, un'istanza di Cloud SQL o anche i nostri dati o il nostro codice eseguito su App Engine. Tutte queste risorse vengono organizzate in progetti.

Ogni risorsa che creiamo deve essere associata ad uno e un solo progetto quindi, prima di cominciare ad utilizzare la piattaforma, dovremo per forza creare un progetto. I progetti possono essere a loro volta organizzati in cartelle e al di sopra di tutto potremmo avere un'organizzazione. Organizzazione e cartelle sono facoltativi ed è quindi possibile avere un intero sistema GCP fatto solo di progetti, senza livelli superiori.

 

I progetti vengono usati per:

  • raggruppare e gestire le risorse,
  • assegnare permessi,
  • attivare le varie API.

Hanno anche un'altra funzione molto importante, quella di abilitare e gestire la fatturazione.

I progetti infatti vengono fatturati singolarmente e possono avere billing account differenti. In pratica tengono traccia delle risorse utilizzate e permettono di stabilire delle quote d'uso con notifica quando vengono sforate.

I progetti vengono identificati da tre attributi:

  • Il nome o project name, un identificativo che assegniamo noi a nostro piacimento, che può essere cambiato in qualsiasi momento e che non è necessario che sia univoco sulla piattaforma Google;
  • l'identificativo di progetto o project ID, che non è modificabile una volta assegnato e sarà quello che utilizzeremo per interagire con il progetto, ad esempio attraverso le API;
  • un numero di progetto o project number, che viene assegnato direttamente da GCP.

L'obiettivo di questa struttura gerarchica è quello di darci la possibilità di trasferire e riflettere su GCP la nostra struttura aziendale con tutta la sua complessità.

Potremmo quindi usare le cartelle per raggruppare dipartimenti, uffici, team di lavoro, ognuno con i propri progetti, le proprie risorse e gli specifici livelli di accesso.

IAM policy

GCP ha un insieme di ruoli e autorizzazioni che definiscono chi ha accesso a quali risorse. Possiamo utilizzare il servizio IAM (Cloud Identity and Access Management) per ispezionare e modificare tali ruoli e autorizzazioni, tramite la voce di menu IAM e amministrazione -> IAM.

Una IAM policy si compone di tre elementi:

  • la parte relativa al destinatario della policy, ovvero al “chi” (who)
  • quella che definisce “cosa è possibile fare”, (can do what)
  • ed infine l'ultima che riguarda “su quale risorsa” (on which resource).

Come destinatario della policy (chi), una IAM policy può essere assegnata a:

  • un Google account,
  • un service account, Carlo Parodo – GCP: il cloud di Google pag. 8
  • un Google group,
  • un intero dominio G Suite o Cloud Identity.

La parte della cosa è possibile fare con la policy specifica quali permessi vogliamo dare al destinatario della stessa. In GCP i permessi non vengono assegnati direttamente ma piuttosto si utilizzano i ruoli.

Abbiamo tre tipi di ruoli:

  • primitivi (primitive),
  • predefiniti (predifined), 

Gli IAM primitive roles sono quelli originariamente previsti dalla piattaforma. Sono generici e una volta assegnati hanno effetto su tutte le risorse all'interno di un progetto. Esistono 4 primitive roles GCP:

  • Il billing administrator. Questo ruolo non consente l'interazione con le risorse ma permette di gestire metodi di pagamento e anche visionare analizzare e verificare i costi sostenuti per il progetto o i progetti a cui è stato assegnato.
  • Il viewer che garantisce accesso in sola lettura a tutte le risorse di un progetto.
  • L’editor, che ha gli stessi privilegi di un viewer, ma in più può anche eseguire modifiche, come ad esempio creare nuove risorse, configurarle, eliminarle, etc.
  • L’owner, che è il proprietario del progetto, ha tutti i privilegi dell'editor ma è anche in grado di aggiungere e rimuovere utenti, creare ed eliminare progetti o assegnare policy.

I ruoli predefiniti (IAM predifined roles) sono associati a specifici prodotti e servizi e definiscono quindi, oltre a permessi assegnati, anche su quali risorse applicarli.

Gli IAM custom roles infine, non possono essere assegnati a livello di cartella ma solo a progetti e organizzazioni. La gestione o l'aggiornamento dei custom roles è totalmente in capo a noi, inclusa la validità ed efficacia della selezione di permessi effettuata. Occorre quindi sempre valutare bene se e quando utilizzarli.

La caratteristica del su quale risorsa la policy sarà valida dipende da:

  • dove, nella gerarchia, la policy verrà inserita,
  • il tipo di ruolo che scegliamo.

In generale una policy si applica a tutte le istanze di una risorsa ma in alcuni casi possono essere applicate policy anche a livello più granulare. È il caso ad esempio dei bucket e degli oggetti di Cloud Storage o anche dei dataset di Big Query.

Come interagire con GCP

Per interagire con GCP abbiamo a disposizione 4 strumenti:

  • Console Web
  • Cloud SDK
  • Cloud Shell
  • API RESTful

La Console Web è probabilmente lo strumento di amministrazione di GCP usato più comunemente. È un'interfaccia interattiva che permette di completare la stragrande maggioranza delle operazioni amministrative sulla piattaforma.

Offre pagine che guidano nella selezione delle opzioni disponibili senza bisogno di ricordarsi nomi e relativi valori. Ci consente di:

  • controllare le risorse richieste,
  • avviare e fermare i servizi,
  • abilitare e disabilitare le API,
  • gestire la fatturazione e verificare i pagamenti.

Nella console Web GCP notiamo subito in alto sulla sinistra un pannello che racchiude un nome, un ID e un numero del progetto su cui stiamo lavorando. Questi identificatori vengono spesso utilizzati durante l'interazione con i servizi GCP.

Il menu di navigazione è un componente importante della console GCP. Offre un rapido accesso a tutti i servizi della piattaforma. È composto da sette categorie di servizi GCP:

  • Calcolo: ospita una varietà di tipi di macchine che supportano qualsiasi tipo di carico di lavoro. Le diverse opzioni di elaborazione consentono di decidere dettagli operativi e infrastruttura.
  • Archiviazione: archiviazione dei dati e opzioni di database per dati strutturati o non strutturati, relazionali o non relazionali.
  • Networking: servizi che bilanciano il traffico delle applicazioni e forniscono regole di sicurezza.
  • Stackdriver: una suite cross-cloud per logging, monitoraggio, trace e altri strumenti per l’affidabilità del servizio.
  • Strumenti: servizi per sviluppatori che gestiscono distribuzioni e pipeline di creazione di applicazioni.
  • Big Data: servizi che consentono di elaborare e analizzare set di dati di grandi dimensioni.
  • Intelligenza artificiale: una suite di API che esegue specifiche attività di intelligenza artificiale e machine learning sulla piattaforma Google Cloud.

La console web si presta all'uso interattivo dell'amministrazione quotidiana dei prodotti GCP, in cui si accede via browser e si completano le operazioni necessarie in una sessione.

Il Google Cloud SDK è un set di comandi per terminale che permettono di gestire risorse e applicazioni ospitate in GCP.

Contiene i seguenti comandi:

  • gcloud, per gestire prodotti e servizi offerti dalla piattaforma,
  • gsutil, per operare su bucket e oggetti di Cloud Storage,
  • bq, per eseguire ricerche e analisi con Big Query.

Il Cloud SDK è indirizzato ad un uso specializzato rispetto alla Console Web. Permette di creare script complessi e parametrizzati che possono essere invocati quando necessario, oppure aggiunti ad un crontab per l'esecuzione in terminali stabiliti.

La Cloud Shell è un terminale interattivo accessibile da console web.

Consente di utilizzare il Cloud SDK direttamente dal Web sull'istanza di Compute Engine con 5 gb di spazio gratuito su un disco persistente, che viene montato come nostra home directory.

È una macchina Linux che possiamo utilizzare in ogni momento, per accedere all’SDK, ma anche ad altri strumenti come: Git, Docker, Python, Java, Go, Node JS

L’API RESTful è un'interfaccia di programmazione su HTTPS, secondo il paradigma RESTful (Representational State Transfer). Le informazioni tra client e server sono scambiate attraverso JSON e l'autenticazione avviene via OAuth. Le API RESTful sono alla base di tutti gli strumenti amministrativi in quanto, sia console web che Cloud SDK, utilizzano queste API per portare avanti le istruzioni date dagli utenti. L'uso di queste API è legato per lo più all'uso programmatico, cioè come parte dello sviluppo di software amministrativi che includono la creazione e gestione di risorse o servizi GCP, come parte della propria logica di esecuzione.

Creare Macchine Virtuali in GCP

Google Compute Engine consente di creare macchine virtuali che eseguono diversi sistemi operativi, tra cui più versioni di Linux (Debian, Ubuntu, Suse, Red Hat, CoreOS) e Windows Server, sull'infrastruttura di Google. È possibile eseguire migliaia di CPU virtuali su un sistema che è stato progettato per essere veloce e offrire una forte coerenza delle prestazioni.

Google Compute Engine (GCE) è il componente IaaS (Infrastructure as a Service) di Google Cloud Platform che gestisce il motore di ricerca di Google, Gmail, YouTube e altri servizi. Consente agli utenti di avviare macchine virtuali (VM) su richiesta.

Le macchine virtuali possono essere avviate dalle immagini standard o dalle immagini personalizzate create dagli utenti. Alcune risorse di Compute Engine vivono in regioni o zone. Una regione è una posizione geografica specifica in cui è possibile eseguire le risorse.

Ogni regione ha una o più zone. Ad esempio, la regione us-central1 denota una regione centrale degli Stati Uniti che ha zone us-central1-a, us-central1-b, us-central1-c, e us-central1-f.

Le risorse che vivono in una zona sono denominate risorse zonali. Istanze di macchine virtuali e dischi permanenti vivono in una zona.

Per collegare un disco persistente a un'istanza di macchina virtuale, entrambe le risorse devono trovarsi nella stessa zona. Allo stesso modo, se si desidera assegnare un indirizzo IP statico a un'istanza, l'istanza deve trovarsi nella stessa zona dell'IP statico.

Per creare una VM, nel menu della console GCP:

  1. Selezionare Compute Engine -> VM Instances -> Create
  2. Impostiamo un nome a piacere e clicchiamo su Crea.
  3. Al termine, dovremmo vedere la nuova macchina virtuale tra le Istanze VM.

Per accedere via SSH alla macchina virtuale, clicchiamo su SSH (pulsante in alto a destra nella console). Questo avvia un client SSH direttamente dal browser.

 

Riferimenti bibliografici:

  • Servizi GCP: https://cloud.google.com/docs/overview/cloud-platform-services
  • Regions and Zones: https://cloud.google.com/compute/docs/regions-zones/
  • Guide rapide, video ed esempi di GCP: https://cloud.google.com/gcp/getting-started/?hl=it
  • Sviluppo di applicazioni con GCP: https://cloud.google.com/training/application-development?hl=it
  • GCP Developer Enablement Program: https://www.codemotion.com/learning/tp/gcp-developer-enablement-program-25
  • Google Infrastructure Security Design Overview: https://cloud.Google.com/security/infrastructure/design

Eventi su Cloud

05/11/20 CloudConf 202012/05/20 Come si vende il Cloud15/04/20 Come si vende il Cloud30/11/18 Automatizza l’archiviazione della posta elettronica nel cloud con MailStore23/11/18 Business nel Cloud, cos'è e come affrontarlo.21/09/18 Automatizza l’archiviazione della posta elettronica nel cloud con MailStore30/03/18 Automatizza l’archiviazione della posta elettronica nel cloud con MailStore22/02/18 Automatizza l’archiviazione della posta elettronica nel cloud con MailStore15/01/18 Automatizza l’archiviazione della posta elettronica nel cloud con MailStore14/11/17 Automatizza l’archiviazione della posta elettronica nel cloud con MailStore20/10/17 Cloud Pratico, sicuri di saperne abbastanza?13/10/17 Automatizza l’archiviazione della posta elettronica nel cloud con MailStore22/09/17 Automatizza l’archiviazione della posta elettronica nel cloud con MailStore30/06/17 Automatizza l’archiviazione della posta elettronica nel cloud con MailStore18/04/17 Automatizza l’archiviazione della posta elettronica nel cloud con MailStore23/03/17 Automatizza l’archiviazione della posta elettronica nel cloud con MailStore23/02/17 Automatizza l’archiviazione della posta elettronica nel cloud con MailStore26/05/16 Cloud Pratico, sicuri di saperne abbastanza?05/02/16 Automatizza l’archiviazione della posta elettronica nel cloud con MailStore01/12/15 Condividi i dati dei tuoi clienti nel cloud. Analisi applicativa e infrastrutturale per scegliere la soluzione più idonea alle proprie esigenze.26/10/15 Condividi i dati dei tuoi clienti nel cloud. Analisi applicativa e infrastrutturale per scegliere la soluzione più idonea alle proprie esigenze.12/10/15 Archivia la posta elettronica con MailStore – Soluzioni locali e nel cloud06/07/15 Condividi i dati dei tuoi clienti nel Cloud20/04/15 CompleteFTP e Owncloud - Panoramica
Ripe Ncc Member
vmware
CloudLinux
Plesk
HP
Microsoft