Notch? Oblò? Notch a goccia? no, grazie… la fotocamera la voglio SOTTO il display

Un interessante servizio di HdBlog.it che mostra l’ultima innovazione nel campo dei display direttamente da Shenzen, il cuore pulsante della tecnologia cinese.

Si tratta di una piccola porzione di schermo che a quanto pare permette di far passare la luce, rendendo possibile quindi il posizionamento di una fotocamera sotto il display.

Ricordo di un brevetto di Apple depositato qualche anno fa per qualcosa di simile ma il funzionamento era ben diverso

Help me Obi Wan Kenobi… You’re my only hope

A quanto pare si fanno passi da gigante nel campo degli ologrammi.

Una tecnologia che fino a qualche anno fa poteva sembrare un sogno di fantascienza oggi si avvicina alla realtà grazie agli Acoustic Trap Display

Fino ad oggi i tentativi di creare un’immagine olografica tridimensionale in movimento erano fondati puramente su metodi per “ingannare” l’occhio umano attraverso espedienti di prospettiva ed illusioni ottiche.

Questa nuova invenzione invece riesce a produrre immagini dotate di una reale consistenza e che non temono affatto il punto di vista dell’osservatore.

Le immagini sono proiettate su dei piccoli polimeri plastici molto leggeri che fluttuano rapidamente in uno spazio delimitato, mossi da onde sonore (in grado inoltre di produrre un feedback tattile sulla mano di chi interagisce).

Controllare le automobili da smartphone: GENIALE o LETALE?

La modalità Summon  introdotta nella versione 7.0 del software Autopilot delle Tesla Model S e Model X permette di richiamare o meglio “evocare” l’automobile a distanza utilizzando lo smartphone.

Questa funzione permette inoltre di effettuare piccoli spostamenti del veicolo da remoto.

Certo si tratta di un’invenzione estremamente interessante ed avveniristica ma allo stesso tempo fa sorgere alcuni dubbi:

cosa mi impedisce di usarla ad esempio per spostare la mia macchina da un posto auto all’altro per non dover pagare il parcheggio a tempo?

come fa un pedone che sta per attraversare la strada passando fra una macchina posteggiata e l’altra a capire che quella macchina potrebbe da un momento all’altro muoversi investendolo?

io credo che nonostante le superficiali conclusioni che si possono trarre da vicende del genere non è la tecnologia in se che deve essere demonizzata

piuttosto è l’uso che se ne fa

quando l’uomo ha scoperto il fuoco due scelte gli si sono presentate:

usarlo per scaldarsi e cucinare

oppure usarlo per incendiare villaggi

 

voi che cosa ne pensate?

Corso docker

Introduzione a Docker

Docker (www.docker.com) è una piattaforma open source (realizzata in go) per lo sviluppo, il trasporto e l’esecuzione di applicazioni distribuite – in modo semplice, veloce, scalabile e portabile. Docker permette di istanziare container. Un contenitore Docker è un’unità software standardizzata che impacchetta un servizio software, insieme alle sue configurazioni e dipendenze.

docker-vmUn container non è una macchina virtuale (anche se in qualche modo la ricorda).  Un container non ha un SO, né device driver. Il container espone verso l’esterno un servizio, ha al suo interno tutte le librerie e il codice necessario al funzionamento del servizio stesso.

Per esempio immaginare App1 come un http server e App2 come un Msql Server. Il container1 esporrà verso l’esterno il servizio http e il container2 esporrà verso l’esterno il servizio mysql.

I Container Docker sono leggeri (usano poche risorse e si avviano velocemente), standardizzati, si possono eseguire sui principali sistemi operativi (Linux e su Windows e Mac OS, ma anche sul cloud) e sono sicuri.

La piattaforma Docker consente una separazione tra le applicazioni e l’infrastruttura di esecuzione, in modo da semplificare il rilascio delle applicazioni. Garantisce che il servizio implementato da un contenitore possa essere eseguito sempre nello stesso modo, indipendentemente dal suo ambiente di esecuzione – sia on premise che sul cloud.

Docker Engine

Il nucleo fondamentale della piattaforma Docker è Docker Engine.  Docker Engine è basato su un’architettura client-server.

docker-engine

il client (docker) accetta comandi dall’utente mediante un’interfaccia dalla linea di comando (CLI) e comunica con il demone Docker sull’host. Il client e il demone Docker comunicano mediante un’API REST.

docker-server-manageil server è un host in grado di gestire Container Docker. In particolare sul server è in esecuzione il processo demone Docker (dockerd), il quale, gestisce inoltre un insieme di oggetti Docker (contenitori, immagini e relativa cache , le reti e i volumi). Sul server è in esecuzione il demone di docker che gestisce gli oggetti docker e permette l’interazione con i client locali o remoti  tramite  CLI e REST.

Il registry (pubblico o privato) contiene un insieme di immagini. Il registry pubblico di Docker è Docker Hub. Un’organizzazione potrebbe gestire un proprio registry privato

Containers e immagini

Contenitore e immagine sono due tipi fondamentali di oggetti Docker, sono due concetti correlati ma distinti. Un immagine può essere assimilata all’immagine ISO di una macchina virtuale. Un immagine è statica:

  • Non può essere eseguita direttamente;
  • Non ha un proprio stato;
  • E’ immutabile.

Un conteiner rappresenta un istanza di un immagine. un contenitore è un concetto dinamico, runtime:

  • Può essere eseguito su un host
  • Ogni Conteiner ha un proprio stato che può cambiare durante l’esecuzione (es., il contenuto del file system nel disco)

 

Enviroment preparation

Prima di iniziare con l’installazione, è necessario precisare che Docker utilizza alcune funzionalità del kernel di Linux che, per ovvi motivi, non sono presenti in un sistema Windows. Per ovviare a questo problema si installa una macchina virtuale Linux con all’interno il demone Docker, a gestire i container ed un set di API utilizzabili in un’ottica client/server per inviare comandi.

docker-installation

Questo meccanismo è completamente “trasparente” all’utente, in quanto l’installer di Docker si occuperà di installare tutto il necessario. Ad oggi, esistono due diversi installer, in base alla versione di Windows e al processore che si ha a disposizione.

Se il sistema operativo è Windows 10 nelle versioni Professional, Enterprise o Education e il processore è a 64 bit, l’installer è Docker for Windows. In tutti gli altri casi Docker Toolbox. La differenza principale tra i due installer consiste nell’hypervisor utilizzato: Docker Toolbox utilizza Oracle VirtualBox, mentre Docker for Windows utilizza Microsoft Hyper-V ed è in grado di funzionare come servizio Windows, garantendo quindi una migliore integrazione.docker-windows-home

 

Docker for windows scaricare l’installer e eseguirlo. Nella fase finale dell’installazione, in cui potrebbe esser richiesto di abilitare le funzionalità di Hyper-V: accettiamo e riavviamo la macchina. Se invece si installa Docker Toolbox, tra le varie cose, verrà installato anche Oracle Virtual Box, mediante cui sarà generata la macchina Linux.

Una volta terminata l’istallazione è possibile aprire la console di Powershell ed eseseguire il primo dei comandi docker docker version.

docker-version

L’output è suddiviso tra client e server. Il client è la macchina locale, mentre il server è la macchina virtuale Linux che Docker ha istanziato. Le parti comunicano tra loro grazie allo strato di API.

 

la gestione della Network in Docker

Se si esegue il comando docker network ls è possibile visualizzare le reti messe a disposizione da docker. Anche se è possibile creare network custom, appena istallato docker mette a disposizione 3 reti.

docker-network-1

docker-networkla rete host rappresenta la rete del server host. la rete bridge invece è la rete nell’interno della quale vengono costruiti i containere. Ogni container creato avrà un indirizzo ip appartenente a questa rete. Docker network insopect <network name>permette di avere informazioni sulle reti

docker-network-inspect

Ogni container creato avrà un indirizzo ip appartenente a Subnet: 172.17.0.0/16″,

 

I comendi Docker

Di seguito si riportano la lista dei comandi che il Client Docker può inviare al server.

comandi docker

Tramite la docker cli è possibile gestire diversi ogetti Docker: Immagini, volumi nettwork e container. Si può schematizzare  i comandi della docker cli per container con la seguente immagine:

docker-command

Dall’immagine risulta chiaro per esempio che eseguire il comando docker run equivale a eseguire un docker create docker-run-help(crea un nuovo container) e un docker start (fa partire il container). Quando il container è nello stato running è possibile: stopparlo o restartarlo.

Se si desidera conoscere lo usage di un comando docker basta far seguire il comando dall’opzione –help. Es: docker run –help. L’unico parametro obligatorio del comando docker run è l’mmagine da istanziare nel container che si vuole creare.

 

Docker in pratica

Come si è detto prima, il comando docker run permette di creare e far partire un nuovo container. Immaginiamo di voler istanziare nel container l’immagine hello-world.

docker run hello-word

hello-world è un immagine di esempio messa a disposizione dal docker hub. Creando un container con questa immagine verrà visualizzata a schermo un output che sintetizza cosa avviene tra client e server durante l’esecuzine del comando in esame.

docker hello-world

  1. Il docker client contatta il demone di docker;
  2. il demone scarica l’immagine hello-world dal docker hub;
  3. Il demone crea il nuovo container dall’immagine, esegue l’applicativo presente nell’immagine producendo l’output;
  4. il demone invia l’output al client che lo visualizza nel terminale.

Per visualizzare tutte le immagini scaricate dal docker hub e presenti sul server, si esegue docker images.

docker-images

In questo momento, l’unica immagine presente sul server è helo-world. Questo comando da una serie di informazioni sull’immagine:

  • REPOSITORY: il nome
  • TAG: la versione
  • IMAGE ID: id dell’immagine
  • CREATE: il momento di creazione dell’immagine sul docker hub
  • SIZE: la dimensione dell’immagine

per vedere i container creati, si esegue docker ps -a (se non si usa l’opzione -a vengono visualizzati solo icontainer nello stato running/up ) l’opzione -a visualizza tutti i container aprescindere dallo stato in cui si trovano.

docker-ps-a

Anche questo comando da diverse informazioni su i container presenti sull’ambiente:

  • CONTAINER ID: id del container
  • IMAGE: immagine istanziata nel container
  • COMMAND: comando eseguito nel container
  • CREATED: periodo di creazione
  • STATUS: stato attuale del container
  • NAME: nome del container. Se non viene assegnato nessun nome, Docker assegna un nome di default

Docker permette, mediante l’uso dei container, di far partire due o più versioni diverse della stessa applicazione senza che queste vadano in conflitto. Il container permette di isolare le due applicazioni. Ogni container rappresenta per docker un processo isolato.

Si immagini di voler far partire un container con un  server apache (versione 2).

docker run -d -–name apache-2 httpd:docker-run-httpd-2

 

 

L’opzione -d permette di eseguire il container in background. –name assega un nome al container. http:2 rappresenta l’immagine da istanziare seguita dalla versione (tag). httpd è l’immagine dell’apache server presente sul docker hub.

Docker permette, mediante l’uso dei container, di far partire due o più versioni diverse della stessa applicazione senza che queste vadano in conflitto. Il container isola le due applicazioni. Ogni container rappresenta per docker un processo a sestante.

Se si volesse far partire anche un server apache versione 2.4

docker run -d -–name apache-2-4 httpd:2.4

docker-run-httpd-2-4

docker-images

Eseguendo i due comandi, si nota subito che l’operazione di pulling è molto più breve nel secondo comando. Durante il pulling in nostro server docker scarica in locale le immagini di cui ha bisogno.

Le immagini docker sono strutturate a layer, questo consente una gestone più agevole della memoria.

Tenendo presente quanto detto, quando si esegue il primo comando, nessuna versione dell’immagine httpd è presente sul server, quindi vanno scaricati tutti i layer dell’immagine httpd:2.

Quando invece si esegue il secondo comando, sul server è già presente una versione dell’immagine httpd. Il server scaricherà solo i layer che mancano tra la versione 2 e 2.4. Anche il container una volta creato ha un layer (accessibile sia in lettura che in scrittuta). I layer dell’mmagine sono statici, le modifiche fatte sul layer del container (istallazione di nuovi pacchetti) non modificano l’immagine, ma seguono il ciclo di vita del container. Se si installa vim sul container httpd-2, il pacchetto verrà istallato sul layer del container e vim sarà utilizzabbie finchè il container rimmarrà in vita.

Se si volesse avere vim dentro l’immagine http:2  sarebbe necessario creare una nuova immagine: Partendo dall’immagine http:2 aggiungere un layer e istallare vim.

Dopo questa breve digressione che approfondiremo più avanti, torniamo alle immagini e ai container appena creati. Ora sul server ci sono le due nuove immaggini scaricate e anche nella lista dei container sono presenti i due nuovi container creati.

docker-ps-a-images

Dopo aver creato il container è possibile eseguire su di esso una serie di comandi. I container possono essere identificati o dal nome o dal container id.

per eseguire un comando all’interno di un container si usa <code>docker exec</code>Per esempio per attivare il terminale bash all’interno del container apache-2, si può scrivere <code>docker exec -it apache-2 bash</code>  Per stoppare, startare o restartare il container apache-2

docker stop apache-2

docker start apache-2

docker restart apache-2

Per rimuovere un container si usa docker rm. Prima di rimuovere un container va soppato (Andrebbe fatto un docker stop de container). L’opzione -f stoppa il container prima di rimuoverlo.

docker rm apache-2
docker rm -f apache-2-4

Interazione tra container e Host

Fino ad ora, si è visto come sia possibile esequire diversi comandi su i container. Sarebbe interessante capire come poter interaggire con i servizi messi a disposizione dal container dall’ esteno. Per Interaggire dall’esteno con i servizi messi a sisposizione dai container si usa il port-binding.

Dal comando docker ps si può notare che ogni container espone una porta verso l’esterno. In particolare apache la porta 80.

docker-ps-a-images

binding port Il binding tra le porte consiste nell’associare la porta del container (es 80) ad una porta del sistema host.

per applicare il port binding basta aggiungere al comando docker run ,già visto in precedenza, l’opzione -p. In particolare -p <host port>:<container port>.

docker run -d –name apache-2 -p 8080:80 httpd:2

docker run -d –name apache-2-4 -p 8081:80 httpd:2.4

Dopo aver creato i nuovi container, se si visualizza la lista dei container si può notare nella colonna PORTS che è stato settato il binding

docker-run-port

apache

codice html interno al container

 

Un ulteriore prova è che se ora sul andiamo su http://localost:8080 o http://localost:8081 accediamo ai due servizi apache.

 

La persistena dei dati in un container

 

I dati all’interno del container permangono fino a quando il container esiste. Se per esempio si crea un db all’nterno di un container mysql i dati verranno conservati nel db fino a quando il container non verrà distrutto. Un altro esempio potrebbe essere quello dello sviluppo di un’applicazione: il codice di sviluppo sarà presente nella macchina finche questa non verrà distrutta. Sinteticamente si può quindi dire che di per se un container non garantisce la persistenza dei dati. Per ovviare a questo problema si usano i volumi.

L’utilizzo dei volumi si basa sul concetto di mount di un filesystem. In pratica monto un foder esterno al container (del host o di un altro server) all’interno del conteiner stesso. per applicare un volume basta aggiungere al comando docker run ,già visto in precedenza, l’opzione -v. In particolare -v <host path>:<container path>.

html volume

codice html modificato

Tornanto all’esempio precedente il db in un volume esterno al container, così come il codice di sviluppo, anche qualora il container venisse distrutto i dati rimarrebbero nel dileSystem esterno. Si Immagini per esempio di voler sviluppare sul server Apache (sostituire l’html di default di apache con quello contenuto nel folder di sviluppo “d:/docker/php”).

docker run -d –name apache-2 -v d:/docker/php:/usr/local/apache2/htdocs -p 8080:80 httpd:2

Una volta eseguito il comando Sarà possibile:

  • sviluppare senza accedere al container, lavorando direttamente nel folder d:/docker/php (aggiunge eliminare o modificare file).
  • Ovviamente se si accede alla macchina e si creano e modificano file all’interno del path /usr/local/apache2/htdocs, le modifiche verranno salvate all’interno del volume d:/docker/php

Come prima sarà possibile accedere a http://localost:8080 e visualizzare il risultato delle modifiche apportate.

Creare Immagini Docker

Fino ad ora sono state usate solo immagini base, scaricate direttamente da Docker hub. Si è anche visto come le modifiche fatte su un container (come installazone di pacchetti) seguano il ciclo di vita del container.

Per la costruzione di un’immagine personalizzata, Docker utilizza un approccio di tipo infrastructure-as-code – sulla base di un file di testo speciale di nome Dockerfile.
Il Dockerfile contiene tutti i comandi da eseguire per costruire un’immagine personalizzata. Il comando docker build -t image-name context consente di costruire automaticamente un’immagine (di nome image-name) a partire da un contesto context. Il contesto può essere una cartella locale e deve contenere il Dockerfile, insieme a ogni altro file di interesse (ad es., file binari, script e template). Un Dockerfile è composto da una sequenza di istruzioni.

Per vedere i comandi fondamentali del dockerfile analizziamo il seguente esempio:

angular-dockerfile

  • l’istruzione FROM specifica l’immagine di base da cui costruire l’immagine personalizzata (e la sua versione)
  • L’istruzione RUN specifica un comando che va eseguito durante la costruzione di un’immagine.
  • l’istruzione EXPOSE [port] specifica che il contenitore ascolta a runtime alla porta port
  • l’istruzione ENV [key value] imposta una variabile d’ambiente nel contenitore
  • l’istruzione WORKDIR [path] imposta la directory di lavoro
  • l’istruzione COPY [src dest] copia un insieme di file o cartelle dalla sorgente src (che deve essere relativa al contesto della costruzione dell’immagine) alla destinazione dest (nel contenitore)
  • l’istruzione CMD [command] è un’istruzione che  deve essere eseguito dai contenitori che verranno creati da questa immagine

un Dockerfile deve iniziare con un’istruzione FROM e, di solito, termina con una singola istruzione CMD.

un Dockerfile può contenere più istruzioni RUN che vengono eseguite in sequenza. La differenza principale tra l’istruzione CMD e le istruzioni RUN è il momento della loro cmesecuzione. Le istruzioni specificate da RUN vengono eseguite durante la costruzione di un’immagine, l’istruzione specificata da CMD verrà eseguita dai contenitori creati a partire dall’immagine.

Di solito è preferibile avere in un Dockerfile una sola istruzione RUN (o comunque poche) che specificano una sequenza di comandi separati  da ‘&&’. Questo prerchè ogni istruzione RUN aggiunge un layer all’immagine che si sta creando.I Layer vengono conservati i chache. Se due immagini eseguono la stessa seguena di istruzioni il server non rieseguirà il comando, ma usera il layer in chache

Una volta eseguito il comando docker build -t angular:1.2 verrà creata la nuova immagine, sarà visualizzata nella lista delle immagini (docker images) e potrà essere deployata in un container. Per istanziarla in un container basta usare docker run.

Docker Compose

Docker è utilizzato non per costruire ambienti distribuiti, anche di grandi dimenzioni. E’ facile capire come utilizzare  CLI di docker per costruire, modificare un ambiente di sviluppo o produzioone formato da 10 container sia quanto meno scomodo.

Immaginiamo per esempio di voler creare un ambirnte di sviluppo formato da 4 container (macchine):

  • Un Server Http con php;
  • Un db mysql
  • Un phpadmin (per gestire il db)
  • Una container con Angular installato.

In particolare, le chiamate al server, vengono effettuate da angular.  L’http server si connette al db per ricavare le informazioni richieste. Il php admin serve solo per acedere e gestire direttamente il db.

Si potrebbe creare i 4 container separatamente, ma l’operazione sarebbe certamente lunga. Per ovviare a questo problema ci viene in aiuto docker-compose. docker-copmpose è un tool messo a disposizione da docker, che appoggiandosi su un file yml, permette di creare tutte le macchine necessarie per il nostro ambiente di sviluppo con in solo comando:  docker-compose -f <nome_file> up -d

L’opzione -d serve per manare il comando il background. L’opzione -f permete di dichiarare il nome del file yml in cui sono definiti i container che fanno parte dell’ambiente da creare. Se l’opzione -f non viene definita il comando docker-compose cercherà nel folder il file chiamato docker-compose.yml.

Quindi tutti i container vanno definiti all’interno del docker-compose.yml file. All’interno di questo file i container vanno definiti come servizi. Per utilizzare docler-compose sarà necessario semplicemente fare una trascrizione (conversione) delle opzioni del comando docker run in formato yml.

Per semplicità riporto il file yml utilizzato per costruire l’ambiente sopra indicato e poi lo analizzeremo riga per riga. (Il file si chiama php-apache-mysql.yml).

docker-compose-yml-1docker-compose-yml-2

La prima istruzione e version che dice a docker-compose quale versione dele api usare per fare il parsing del file. Come già detto ogni container per il docker-compose è un servizio.

servicers permette di definire la lista dei servizi.
Il servizio db rappresenta il container in cui è presente mysql (il nome del servizio non è il nome del  container).
image rappresenta l’mmagine di partenza scaricata dal docker hub.
container_name è il nome che sarà assegnato al container.
command esegue permette di eseguire un comando una volta che il conteiner è stato creato.
volumes equivale a l’opzione -v di docker run. Permette di devinire uno o più volumi. I volumi vanno definiti uno sotto l’altro e ogni volume deve essere preceduto dal degno ‘-‘ e racchiusi tra virgolette.
environment permette di definire una serie di variabili di ambiente. Ovviamente ogni immagine del docker hub a le sue variabili dambiente. Nel cado in esame l’immagine mysql permette di definire in fase di creazione del container utenti e relative password
Se ora si analizza il servizio phpadmin che rappresenta il container con il phpadmin istallato, si possono notare oltre le precedenti anche altre istruzioni.
depends_on permette di devinire uno o più dipendenze. docker compose sa che prima di creare il container in esame deve creare i container dai quali dipende Le dipendenze vanno definite una sotto l’altro e ogni dipendenza deve essere preceduta dal degno ‘- ‘ seguito dal nome del sevizio. Nel caso in esame, si può creare il phpadmin solo dopo aver creato il container con il mysql. Nella sezione enviroment è definito l’host a cui collegarsi (il sevizio db)
ports equivale a l’opzione -p di docker run. Permette di devinire uno o più port binding. I port binding vanno definiti uno sotto l’altro e ogni volume deve essere preceduto dal degno ‘-‘ e racchiusi tra virgolette.
Se si analizza il servizio web o angula si può notare l’istruzione build che equivale al comando docker build per la crazione di immagini castomizzate. context rappresenta il folder dove è conservato il dockerfile, mentre dockerfile rappresenta il nome del docker file. Nel servizio angular è stato utilizzato un nome non di default.
Si riportano di seguito i docker file del servizio web e angular:

http-dockerfileangular-dockerfile

docker-custom-nettworkUna volta definita la struttura dell’enviroment si esegue il comando
docker-compose -f php-apache-mysql.yml up -d.
Come si può notare docker-compose oltre a creare i singoli container crea anche una network che rachiude l’ambiente definito e permette ai container di comunicare tra loro utilizzando questa rete.
docker-compose-up
Una volta creati i container è possibile vedere lo stato dei singoli containe con il comando
docker-compose -f php-apache-mysql.yml ps
(equivale al comando docker ps ma filtra sulla rete creata dal docker-compose). Visualizza solo le macchine definite nello yml.
docker-compose-ps

E’ possibile anche distrugere l’ambiente

docker-compose -f php-apache-mysql.yml down

il comando distrugge anche la network

 

Nota
Sul container web, per permettere la connessione con il db nella stringa di connessione al posto dell’hostname va indicato il npme del servizio del database: ‘db’.

db_conn

Biografia

Accettare cookie dagli sconosciuti può aprirti nuovi mondi

Abbiamo un blog!!!

….ma prima prendi questi biscotti