Aggiungere un podcast a Google Podcast Manager

Google podcast in esecuzione

Informazioni strategiche per far crescere il tuo podcast

Google Podcast Manager

Qualche tempo fa avevo parlato di come fare per indicizzare un podcast su Google, oggi invece ti voglio spiegare come visualizzare ed analizzare le statistiche degli ascoltatori del podcast provenienti da Google.

I principali dati che Google Podcast Manager raccoglie sono:

  • il numero di ascolti per programma e puntata,
  • il numero di ascolti per segmento di puntata,
  • la percentuale di ascolto per ogni puntata.

Per iniziare a raccogliere questi dati la prima cosa da fare è collegarsi al sito https://podcastsmanager.google.com e rivendicare il possesso del nostro podcast attraverso i 4 passaggi che Google mette a disposizione.

Passaggio 1 – inserire il feed RSS

Come primo passaggio ci viene chiesto l’indirizzo del feed RSS del podcast che vogliamo monitorare.

Ad esempio, se utilizzi Spreaker, per trovare l’indirizzo del feed RSS ti basta aprire la pagina del podcast e copiare l’indirizzo indicato tramite l’icona arancione vicino a quella dei social.

Esempio: ottenere l’indirizzo del feed RSS di un podcast su Spreaker trmite l’icona arancione

Una volta copiato l’indirizzo puoi tornare su Podcast Manager ed inserirlo.

Inserimento del feed RSS su Google Podcast Manager

NOTA: se nel momento in cui invii il feed ricevi il messaggio d’errore Questo programma non è al momento disponibile su Google significa che il tuo podcast non è stato ancora aggiunto a Google Podcast, per farlo ti rimando a questa guida.

Passaggio 2 – Verifica dei dati

Anteprima del feed appena inserito

Passaggio 3 – Verifica della proprietà

Per verificare la proprietà del podcast Google invierà una mail con un codice

Passaggio 4 – Proprietà verificata

Proprietà verificata con successo

Perché questi dati sono importanti?

Il mondo del podcasting sta esplodendo è sempre più content creator annunciano la pubblicazione di un podcast. In un contesto del genere è fondamentale catturare e mantenere l’attenzione del pubblico e per farlo è necessario capire esattamente chi ti ascolta, quando ti ascolta e con quale dispositivo.

Proprio per questo Google ha lanciato Podcast Manager che permette di raccogliere in un unico punto le statistiche sulla fidelizzazione del pubblico tramite il numero di puntate riprodotte, il tempo cumulativo di riproduzione e la percentuale di completamento di ogni singolo episodio. Con questi dati capire in quali punti gli ascoltatori interrompono l’ascolto o quali sono le parti maggiormente apprezzate non sarà un problema.

Inoltre grazie al grafico con il numero di ascolti per giorno ti sarà facile capire qual è il momento migliore per pubblicare l’ultimo episodio del podcast.

Infine, grazie al report che mostra su quale dispositivo il tuo podcast viene riprodotto, potrai individuare subito se ti stai rivolgendo ad un pubblico che ascolta le tue puntate in mobilità utilizzando uno smartphone o se invece i tuoi ascoltatori preferiscono la comodità della casa ascoltandoti da uno smart-speaker.


Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Analisi delle performance di Webpack

Tempo di bundling di webpack

Non c’è niente di più noioso che dover aspettare che il compilatore termini il proprio lavoro.

Chiunque programmi per applicazioni per il web con buona probabilità avrà avuto il piacere di imbattersi in Webpack. Webpack, grazie alla sua flessibilità e all’enorme quantità di loader e plugin disponibili, è diventato lo standard per la creazione di bundle di asset JS e CSS.

La creazione dei bundle tipicamente non richiede più di qualche secondo per essere completata ma al crescere del numero di asset il tempo necessario a terminare il processo può crescere notevolmente. Ad esempio, nel caso del backoffice di Slope, la creazione dei bundle era arrivata a superare il minuto. Decisamente troppo.

In questo articolo voglio raccontarti come ho migliorato le performance di Webpack utilizzando vari accorgimenti.

Source: https://xkcd.com/303

Ottimizzazione

Per ottimizzare i tempi di build, la documentazione di Webpack, riporta:

Use the latest webpack version. We are always making performance improvements.  […] Staying up-to-date with Node.js can also help with performance. On top of this, keeping your package manager (e.g. npm or yarn) up-to-date can also help. Newer versions create more efficient module trees and increase resolving speed.

documentazione di Webpack

Sulla base di quanto suggerito dalla documentazione ho deciso di provare, utilizzando il backoffice di Slope come benchmark, quale fosse l’impatto dovuto a:

  • Aggiornamento di Webpack dalla versione 3 alla versione 4
  • Avanzamento di Yarn dalla versione 1.19.0 alla versione 1.22.0
  • Avanzamento della versione di Node dalla 8.16.0 alla 12.11.1

Metodo di prova

La prova è stata eseguita su di un PC con le seguenti caratteristiche tecniche:

ProcessoreIntel(R) Core(TM) i5-7600 CPU @ 3.50GHz × 4
Memoria16384 MB (DDR4)
DiscoSamsung SSD 850 (250GB)
Scheda graficaRadeon RX 580 Series (POLARIS10, DRM 3.33.0, 5.3.0-40-generic, LLVM 9.0.0)
OSUbuntu 18.04.4
Kernel5.3.0-40-generic (x86_64)

Le performance sono state misurate utilizzando il BackOffice di Slope. Il progetto è basato su Symfony 4.2.8 e contiene al suo interno circa 190 file Javascript/Typescript e circa 60 file CSS/SCSS.

Per verificare le performance è stato misurato il tempo necessario alla creazione dei bundle nelle seguenti condizioni:

  • configurazione con Webpack 3, Yarn 1.19.0, Node 8.16.0
  • configurazione con Webpack 4 , Yarn 1.19.0, Node 8.16.0
  • configurazione con Webpack 4 , Yarn 1.22.0, Node 8.16.0
  • configurazione con Webpack 4 , Yarn 1.19.0, Node 12.11.1
  • configurazione con Webpack 4 , Yarn 1.22.0, Node 12.11.1

Per ogni configurazione è stata eseguita una prima prova per fare il warm-up della cache (prova 0) e una serie di 10 build consecutive.

Build di development

Come prima prova ho analizzato il tempo necessario ad eseguire la build di development. Nella configurazione di Webpack di sviluppo è abilitata la creazione delle sourcemaps e il linting del codice JS/TS mentre è disattivata la minificazione del codice.

Webpack 3Webpack 4Yarn 1.22.0Node 12.11.1Node 12.11.1 + Yarn 1.22.0
Prova 050,1421,7221,8219,5119,35
Prova 150,4418,4618,8015,9715,82
Prova 250,7018,3915,5615,7615,78
Prova 350,1718,9718,7515,8515,68
Prova 449,1218,6817,7815,9515,63
Prova 550,2818,5718,7815,8915,81
Prova 650,5618,4118,4915,7815,70
Prova 749,3719,0619,9515,9515,86
Prova 849,4219,9518,8815,9415,76
Prova 950,3516,6218,8816,0315,95
Prova 1050,5018,6718,8015,8715,68
Esecuzione delle prove di compilazione nelle varie configurazioni. Tempi in secondi.
Tempo di build nelle varie configurazioni (minore è meglio)
Webpack 3Webpack 4Yarn 1.22.0Node 12.11.1Node 12.11.1 + Yarn 1.22.0
Media50,0618,7819,0716,2316,09
Media (esclusa prova 0)50,0918,4818,7715,9015,77
*Tempi in secondi

Dall’analisi dei risultati si nota chiaramente come il solo passaggio da Webpack 3 a Webpack 4 riduca notevolmente il tempo di creazione della build (circa il 60% in meno!).
Analizzando le performance con Webpack 4 invece è possibile notare come l’effetto del singolo avanzamento di versione di Yarn introduca un trascurabile peggioramento delle performance mentre l’effetto dell’aggiornamento di Node da solo introduca una riduzione dei tempi di build di circa il 10%.

Trovo molto interessante notare anche il fatto che, mentre il singolo aggiornamento di Yarn sembri peggiorare le performance, l’utilizzo congiunto delle ultime versioni di Node e Yarn faccia perdere alla build qualche frazione di secondo sul tempo di esecuzione.

Build di produzione

Nella seconda configurazione di prova ho utilizzato la build di produzione di Webpack. In questa configurazione sono disattivati i processi di linting del codice JS/TS e la creazione delle sourcemaps mentre invece risulta attiva la fase di minificazione del codice.

Webpack 3Webpack 4Yarn 1.22.0Node 12.11.1Node 12.11.1 + Yarn 1.22.0
Prova 076,3537,5336,5632,5632,73
Prova 174,6920,8220,7718,3618,21
Prova 275,7820,7820,8618,3618,12
Prova 373,5320,7720,7918,2818,15
Prova 473,6320,6320,5618,1918,08
Prova 572,0020,8420,9118,3018,13
Prova 672,3721,0720,8318,5118,17
Prova 773,4020,9720,8018,2518,15
Prova 874,2321,0220,9618,6918,16
Prova 973,9520,8720,8218,8018,12
Prova 1073,0821,0921,0018,3718,14
Esecuzione delle prove di compilazione nelle varie configurazioni. Tempi in secondi.
Tempo di build nelle varie configurazioni (minore è meglio)
Webpack 3Webpack 4Yarn 1.22.0Node 12.11.1Node 12.11.1 + Yarn 1.22.0
Media73,9922,5322,3919,7119,47
Media (esclusa prova 0)73,6720,8920,8318,4118,14
*Tempi in secondi

Anche in questo caso il passaggio da Webpack 3 a Webpack 4 si conferma come il miglior investimento per abbattere i tempi di esecuzione della build (circa il 70% in meno).
Contrariamente alla build di development l’accoppiata Webpack 4 + Yarn 1.22.0 non peggiora le performance ma il guadagno di tempo risulta essere praticamente trascurabile (-0,27% escludendo la prova 0). Anche in questo caso l’avanzamento di versione di Node invece permette di migliorare le performance di un ulteriore 10% rispetto ai tempi di Webpack 4.

Anche in questo caso l’aggiornamento combinato di Webapack 4, Node 12.11.1 e Yarn 1.22.0 permette di guadagnare una manciata di secondi sul tempo di build.

Conclusioni

Le prove eseguite sembrano confermare esattamente quanto riportato dalla guida di Webpack. Il miglior investimento possibile per migliorare le performance della build di Webpack è quello di utilizzare sempre la versione più recente del tool.

Una volta aggiornato Webpack all’ultima versione, dovendo scegliere se aggiornare Node o Yarn non c’è dubbio che la scelta migliore sia quella di investire tempo nell’aggiornamento di Node (guadagnando circa un 10% di tempo in meno).

Solo in ultima istanza conviene aggiornare Yarn il cui effetto sui tempi di build risulta essere praticamente trascurabile.

Come ultima nota c’è da considerare che lo sforzo necessario ad ogni aggiornamento è direttamente proporzionale al guadagno ottenuto. Mentre aggiornare Yarn non richiede più di qualche minuto, aggiornare Node e soprattutto Webpack può richiedere più di qualche ora.


Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Millewin: estrarre i pazienti con indirizzo email in anagrafica

Time Needed : 5 minutes

Recentemente mi è stato chiesto se fosse possibile estrarre dal database di Millewin tutti i pazienti che avessero un indirizzo email salvato nell'anagrafica. Visto che la query può essere utile a tutti, di seguito ho riportato i passaggi necessari ad effettuare l'estrazione:

  1. Aprire Mille Utilità

    Per poter estrarre i dati dei pazienti con indirizzo email tramite una query SQL la prima cosa da fare è avviare Mille Utilità

  2. Aprire dal menù Statistiche, Impostazione Estrazioni SQL Personali

    Aprire Estrazioni SQL Personali

  3. Aggiungere il codice SQL

    Premendo il pulsante Nuovo creare una nuova estrazione chiamata contatti pazienti e incollare nel campo Comando SQL il codice riportato sotto. Una volta fatto salvare il tutto con il bottone Salva
    Creazione del nuovo comando SQL

  4. Eseguire l'estrazione

    Premere il tasto Applica per eseguire l'estrazione. Il programma chiederà su quali dati eseguire l'estrazione. Selezionare l'intervallo di date di interesse e proseguire con il comando Avanti.
    Si aprirà una nuova schermata da cui è possibile eseguire l'estrazione mediante il pulsante Esegui posto in alto a destra.Confermare l'esecuzione del comando SQL con il pulsante esegui

  5. Salvare i dati in formato Excel

    A questo punto si aprirà una schermata contente i dati dei pazienti che hanno un indirizzo email associato.
    Da questa schermata è anche possibile esportare i dati mediante il pulsante Salva in alto a sinistra. Pulsante di salvataggio su file

Tools
  • Millewin

Di seguito è riportato il codice da inserire nel campo Comando SQL descritto al punto 3:

select
	paz.cognome,
	paz.nome,
	paz.codice_fiscale,
	nos.pa_tel as tel,
	nos.tel_cell as cell,
	nos.email 
from
	pazienti paz left join nos_002 nos on paz.codice = nos.codice
	left join v_utenti med on nos.pa_medi = med.userid 
where 
	med.codice_regionale ilike '%'
	and paz.pa_convenzione = 'S'
	and nos.pa_drevoca IS NULL
	and paz.decesso IS NULL
	and nos.email IS NOT NULL 
order by
	paz.cognome,
	paz.nome;

Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Ubuntu 20.04 disponibile al download! 🎉

La mia scrivania

Ubuntu 20.04 Focal Fossa è stato appena rilasciato! Questa è l’ultima versione LTS del famoso sistema operativo open source con supporto fino al 2025.

Bando alle ciance, se non vuoi perdere tempo procedi subito con il download dell’ultima versione tramite il link sottostante:

Novità

Sebbene il rilascio ufficiale sia oggi io è già da un mesetto che lo utilizzo quotidianamente sul mio PC del lavoro senza alcun problema. Per cui di seguito ti mostro le novità dell’ultima fatica di Canonical con qualche commento personale sul mio utilizzo.

NOTA: i miei commenti fanno riferimento al passaggio dalla versione 18.04 alla 20.04. Se hai aggiornato di volta in volta alla 18.10, 19.04 e 19.10 probabilmente avrai già notato alcuni dei cambiamenti che ho riportato.

Iniziamo a parlare dei miglioramenti sotto il cofano. L’ultima versione di Ubuntu utilizza il Kernel 5.4 che, oltre ai soliti miglioramenti alle performance e a migliorare il supporto all’hardware più recente, introduce il supporto nativo ai file system exFAT. Finalmente non sarà più necessario installare pacchetti aggiuntivi per leggere chiavette e memory card.
La mia vecchia guida su come montare i volumi exFat potrà finalmente andare in pensione.

Nonostante il Kernel 5.6 non fosse pronto per il rilascio di Ubuntu, gli sviluppatori di Canonical si sono comunque adoperati per fare il backport di WireGuard anche su Ubuntu 20.04. Per chi non lo conoscesse, WireGuard è un software che permette di connettersi a tunnel VPN senza bisogno di utilizzare tool esterni.

Passiamo ora all’avvio del sistema. Fin dalla pressione del tasto di avvio è possibile accorgersi dei miglioramenti fatti dagli sviluppatori. Infatti è stato introdotto un nuovo splash screen che mostra all’avvio il logo del produttore del computer. Inoltre la velocità di avvio del sistema è stata ulteriormente migliorata grazie all’introduzione di un nuovo algoritmo di compressione (lz4) del kernel e di intramfs.
Sul mio PC Ubuntu ora si avvia veramente in un lampo!

Arrivati alla schermata di accesso del sistema operativo è possibile accorgersi anche di altri piccoli miglioramenti all’usabilità. Innanzitutto non esiste più la “tendina” da trascinare verso l’alto per inserire la password. Gli sviluppatori hanno anche lavorato alla rifinitura della grafica. Ora è possibile vedere dalla schermata di blocco le notifiche arrivate e come background viene utilizzata un versione sfocata dello sfondo del desktop dell’utente.

Inserita la password di accesso, GNOME 3.36 ci accoglie in tutto il suo splendore. Chi proviene da Ubuntu 18.04 apprezzerà fin da subito la maggiore pulizia e la migliore cura dei dettagli nella UI.
Tra i miglioramenti più utili all’usabilità del sistema operativo c’è l’introduzione della modalità non disturbare. Attivando questa modalità tutte le notifiche verranno silenziate. Veramente utilissimo durante le presentazioni e durante le videochiamate di lavoro.

La nuova modalità non disturbare nel centro notifiche

Anche l’app switcher (alt+tab) è stato migliorato. Nella versione precedente di Ubuntu, aprendo due finestre di FireFox queste venivano raggruppate in un unico elemento. Ora invece ogni finestra ha la sua icona nello switcher.
Per me che utilizzo quasi esclusivamente alt-tab per cambiare finestra questa è veramente una manna dal cielo!

Sopra: Il vecchio task switcher che raggruppava i software; Sotto: il nuovo task switcher con un icona per ogni applicazione

Un altro cambiamento è stato fatto all’applicazione Ubuntu Store che è stata rimpiazzato con il più moderno Snap Store. A prima vista potrebbe sembrare quasi la stessa cosa ma a parte il lavoro di bug-fix e di miglioramento generale, il nuovo Snap Store permette di avere delle funzionalità più avanzate (ad esempio è possibile selezionare quale versione del pacchetto installare).

Il nuovo Snap Store permette di selezionare la versione del software installare.

Un altro cambiamento che farà la gioia di chi utilizza monitor 4K è il supporto al fractional scaling. Da ora non sarà più necessario scegliere tra un fattore di scala del 100% o del 200% ma sarà possibile selezionare dei valori intermedi come ad esempio 125% o 150%.

Ma la cosa più bella dell’ultima release di Ubuntu è l’introduzione del tema scuro! Finalmente è possibile modificare con un solo click l’aspetto complessivo del sistema. Da nautilus (per esplorare i file) a gedit (il text editor), dal pannello delle impostazioni a firefox ora tutto il sistema utilizzerà consistentemente i colori scuri.
L’ultima release di Ubuntu è un piacere per gli occhi per me che adoro il tema scuro.

Qualche bug

L’ultima versione di Ubuntu però non è perfetta e nel corso di questo mese ho notato anche qualche bug minore durante il mio utilizzo giornaliero.

Partiamo dal più fastidioso, il tema scuro di gedit rende praticamente illeggibile il testo in quanto, nel momento in cui viene selezionata una riga, questa viene evidenziata di bianco con il testo bianco. L’unica soluzione per aggirare il problema e leggere il testo è selezionare tutto il testo. Speriamo in una patch a breve.

Testo bianco con evidenziazione bianca. Decisamente poco leggibile.

Un’altra piccolezza piuttosto fastidiosa è il fatto che da nautilus non è possibile trascinare con il mouse i file sul desktop. Non capisco se è una scelta di progetto o un bug ma spero che gli sviluppatori di Canonical riescano a risolvere anche questo problema.

Ma il problema più fastidioso è che a volte, quando a fine giornata arresto il sistema, il processo di chiusura del sistema operativo si inchioda ed è necessario attendere diversi minuti prima che si spenga completamente. Sospetto che possa essere un bug legato ai driver proprietari di nvidia ma nulla che non possa essere risolto con una patch.

Ma quindi devo aggiornare?

Secondo me se non fai uso di software particolari puoi aggiornare senza troppi pensieri all’ultima versione per godere di una versione che non rivoluziona il modo di lavoro ma rifinisce vari aspetti del sistema operativo che lo rendono più efficiente e più piacevole da utilizzare.

Se utilizzi un sistema a 32bit tuttavia non potrai aggiornare direttamente ad Ubuntu 20.04 visto che gli sviluppatori hanno deciso di abbandonare questa vecchia architettura per concentrarsi unicamente nello sviluppo del sistema a 64bit.

In ogni caso Ubuntu 18.04 è ancora supportato fino al 2023 per cui se non vuoi rischiare l’aggiornamento o se non sei sicuro che il tuo hardware sia compatibile puoi posporre l’aggiornamento e farlo tranquillamente più avanti nel tempo.


Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Lenovo t450s: Webcam si blocca su Windows 10

Logo lenovo

Hai un notebook Lenovo? Quando provi a fare una videochiamata con Skype dopo qualche secondo l’immagine proveniente dalla fotocamera del portatile si inchioda e rimane fissa per sempre?

Se ti sei trovato in questa situazione potresti essere incappato in un problema comune ai proprietari di portatili Lenovo della serie T400 e T500.

Io mi sono imbattuto in questa situazione con un amico che mi ha chiesto di verificare come mai non riuscisse a fare videochiamate con il suo nuovo Lenovo T450s.

Soluzione

Time Needed : 5 minutes

In pratica, quello che gli succedeva era che dopo un paio di secondi l'immagine proveniente dalla webcam si bloccasse con un frame fisso. Anche il LED di stato della webcam lampeggiava una volta per poi spegnersi definitivamente. Fortunatamente la soluzione a questo problema richiede giusto 5 minuti ed un paio di modifiche al registro di sistema di Windows.

  1. Aprire il registro di sistema di Windows

    Aprire l'editor del registro di sistema (regedit) cercandolo tra le applicazioni installate nel computerApertura del registro di sistema di Windows

  2. Trovare la prima voce da aggiungere

    Navigare le voci del registro seguendo HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\Platform

  3. Aggiungere la prima voce

    Fare click destro -> nuovo -> valore DWORD (32 bit). Nominarlo EnableFrameServerMode e impostare il valore a 0Aggiunta della prima chiave al registro di Windows

  4. Trovare la seconda voce da aggiungere

    HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows Media Foundation\Platform key

  5. Aggiungere la seconda voce

    Fare click destro -> nuovo -> valore DWORD (32 bit). Nominarlo EnableFrameServerMode e impostare il valore a 0 Aggiunta della seconda chiave al registro di Windows

  6. Riavvia

    Affinchè le modifiche effettuate abbiano effetto riavvia il computer.

Tools
  • Windows regedit

Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Fonte

Comprimere PDF su Linux utilizzando Ghostscript

Documenti da scansionare

Ti è mai capitato di dover scansionare un documento di diverse pagine e di accorgerti solo alla fine che il file PDF ottenuto abbia un peso spropositato?

A me è capitato giusto ieri. Dovevo mandare una serie di scartoffie al commercialista ma il file PDF che ho ottenuto risultava troppo pesante (11 MB) per il form di caricamento dei documenti (max 5MB).

Per risolvere questi tipi di problemi esistono vari servizi online che ti permettono di caricare il file PDF e di comprimerlo senza dover installare nulla nel tuo PC. Tuttavia, trattandosi di documenti privati ho pensato non fosse il caso di regalare così i miei dati ad un servizio che non so cosa combini con i documenti caricati dagli utenti.

Quindi mi sono arrovellato il cervello e mi sono chiesto: “Possibile che su Ubuntu non esista nulla che permette di comprimere i PDF direttamente dal terminale?

Ovviamente la risposta a tale domanda è: si, esiste il modo di comprimere i file PDF da terminale. E per farlo esiste il seguente non-troppo-semplice comando di GhostScript:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=<LIVELLO-COMPRESSIONE> -dNOPAUSE -dQUIET -dBATCH -sOutputFile=<OUTPUT-FILE> <INPUT-FILE>

All’interno del comando devi sostituire:

  • <LIVELLO-COMPRESSIONE> rappresenta la qualità (e quindi la dimensione) del file finale. Sono ammessi i valori:
    • /screen minima qualità
    • /ebook qualità media
    • /printer buona qualità
    • /prepress massima qualità
  • <OUTPUT-FILE> è il nome del file compresso prodotto dal comando
  • <INPUT-FILE> è il nome del file da comprimere

PS: per avere più informazioni su tutti i possibili parametri di GhostScript ti basta digitare sul terminale man gs

Quindi per ottenere un buon rapporto qualità/peso ho deciso di utilizzare il livello di compressione /ebook tramite il seguente comando:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=documenti-ebook.pdf documenti.pdf

Statistiche

Utilizzando un documento da 11,6MB come prova ho ottenuto i seguenti risultati:

  • 536,5kB a qualità screen
  • 1,4MB in qualità ebook
  • 11,6MB in qualità printer
  • 11,6MB in qualità prepress

Come puoi vedere gli ultimi due livelli di compressione non hanno cambiato la dimensione del file ottenuto. Questo vuol dire che di default l’applicazione dello scanner utilizza printer come livello di compressione.

PDF ottenuti utilizzando i vari livelli di compressione
PDF ottenuti utilizzando i vari livelli di compressione

Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Fonte

Vue 3: creazione di un componente con Typescript

Immagine di copertina

La versione alpha di Vue 3 è disponibile da qualche tempo ormai e nel momento in cui scrivo è stata appena rilasciata la versione alpha 8.

La nuova versione di Vue porterà con sé una valanga di novità e miglioramenti tra cui:

  • Composition API: è il nuovo metodo per definire i componenti con un approccio “function-based” ispirato agli hooks di React.
  • Portals: permettono di gestire il funzionamento di parti di DOM anche al di fuori dello scope componente Vue stesso.
  • Fragments: permettono di avere più elementi root all’interno dello stesso componente Vue.
  • Updated v-model-API: ora è possibile utilizzare più modelli.
  • Suspense: permette di renderizzare un componente come fallback nell’attesa che una condizione sia soddisfatta. (molto utili in ambito UX)
  • TypeScript: supporto completo a Typescript senza bisogno di librerie esterne.

Anche se la versione rilasciata è ancora in alpha e qualche componente potrebbe presentare bug e malfunzionamenti è già possibile scrivere un’applicazione per iniziare a giocare con le nuove funzionalità.

In questo articolo ho descritto la procedura che ho utilizzato per creare una nuova applicazione che utilizzi Vue 3 e Typescript.
Ok, bando alle ciance e inizia a configurare una nuova applicazione 🙂

Setup dell’ambiente

La prima cosa da fare è quella di spostarsi su una cartella e inizializzare un nuovo progetto con yarn (ma con npm sarebbe esattamente la stessa cosa) tramite il seguente comando:

yarn init

Una volta inizializzato il file package.json è devi aggiungere le dipendenze necessarie al progetto:

yarn add vue@3.0.0-alpha.8
yarn add --dev yarn vue-loader@v16.0.0-alpha.3 webpack-cli webpack webpack-dev-server typescript ts-loader @vue/compiler-sfc@v3.0.0-alpha.8

La prima cosa da fare è definire una configurazione per Webpack che permetta al codice Typescript e Vue di essere traspilato in javascript. Per farlo devi crear il file webpack.config.js nel seguente modo:

const path = require('path')
const { VueLoaderPlugin } = require('vue-loader')

module.exports = (env = {}) => ({
  mode: env.prod ? 'production' : 'development',
  devtool: env.prod ? 'source-map' : 'cheap-module-eval-source-map',
  entry: path.resolve(__dirname, './src/main.ts'),
  output: {
    path: path.resolve(__dirname, './dist'),
    publicPath: '/dist/'
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        use: 'vue-loader'
      },
      {
        test: /\.ts$/,
        loader: 'ts-loader',
        options: {
          appendTsSuffixTo: [/\.vue$/],
        }
      },
    ]
  },
  resolve: {
    extensions: ['.ts', '.js', '.vue', '.json'],
    alias: {
      'vue': '@vue/runtime-dom'
    }
  },
  plugins: [
    new VueLoaderPlugin(),
  ],
  devServer: {
    inline: true,
    hot: true,
    stats: 'minimal',
    contentBase: __dirname,
    overlay: true
  }
})

Affinchè i file Typescript vengano correttamente compilati devi definire il file di configurazione tsconfig.json nel seguente modo:

{
  "compilerOptions": {
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "declaration": false,
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "module": "es2015",
    "moduleResolution": "node",
    "noImplicitAny": false,
    "noLib": false,
    "sourceMap": true,
    "strict": true,
    "strictPropertyInitialization": false,
    "suppressImplicitAnyIndexErrors": true,
    "target": "es2015",
    "baseUrl": ".",
  },
  "exclude": [
    "./node_modules"
  ],
  "include": [
    "./src/**/*.ts",
    "./src/**/*.vue",
  ],
}

Ora che hai finito di configurare Webpack e Typescript puoi iniziare ad occuparti dei file necessari al funzionamento del progetto.
La prima cosa da fare è inserire sul file package.json uno script che permetta di avviare comodamente il server web di Webpack aggiungendo la entry scripts come riportato di seguito:

 {
  
  //...
  // Dependencies
  //...

  "scripts": {
    "dev": "webpack-dev-server"
  }
}

A questo punto devi aggiungere alla root del progetto il file index.html che verrà servito al browser quando proverò a connettersi alla tua app Vue:

<h1>Hello Vue 3!</h1>

<script src="/dist/main.js"></script>

Infine, all’interno della cartella src, aggiungi un nuovo file main.ts per verificare che il compilatore di Typescript funzioni veramente:

console.log('Hello world from Typescript!');

NOTA: Affinchè Typescript sia in grado di importare i file *.vue è necessario definire all’interno della cartella src un nuovo file chiamato shims-vue.d.ts

declare module "*.vue" {
    import { defineComponent } from "vue";
    const Component: ReturnType<typeof defineComponent>;
    export default Component;
}

Se ha seguito il tutorial fino a qui dovresti trovarti con un progetto organizzato in questo modo:

├── index.html
├── package.json
├── tsconfig.json
├── webpack.config.js
├── src
│    ├── shims-vue.d.ts
│    └── main.ts

Per verificare che tutto funzioni avvia il server con il comando yarn dev e visita http://localhost:8080/

Verifica che tutto funzioni correttamente aprendo http://localhost:8080
Se hai seguito il post fino a questo punto, avviando il server Webpack, verrà servita la pagina index appena creata.

Creazione di un componente Vue

Ora che l’infrastruttura necessaria per utilizzare Vue 3 è finalmente pronta, puoi iniziare a creare il componente Vue vero e proprio.

Come prima cosa aggiungi all’interno della cartella src un nuovo file chiamato App.vue fatto nel seguente modo:

<template>
  <h2>This is a Vue 3 component!</h2>
  <button @click="increase">Clicked {{ count }} times.</button>
</template>

<script lang="ts">
import {defineComponent, ref} from "vue";

export default defineComponent({
  setup() {
    const count = ref(0)

    const increase = () => {
      count.value++
    }
    
    return {
      count,
      increase,
    }
  }
});
</script>

Come puoi vedere, rispetto alla versione precedente in cui per creare un nuovo componente Vue era necessario creare una classe Typescript ed estendere Vue facendo class MyClass extends Vue {}, ora Vue 3 mette a disposizione una funzione defineComponent().
All’interno della funzione defineComponent() si trova il metodo setup(props) che ha come primo parametro le props Siccome il componente App sarà di primo livello, non verranno passate props per cui ho omesso di passargliele.
Inoltre, come puoi vedere dal codice, qualunque cosa venga restituita dal metodo setup(), è poi accessible dal template.

Ora che il componente Vue è stato creato non ti rimane che importarlo all’interno del file main.ts nel seguente modo:

import {createApp} from 'vue';
import App from './App.vue';

createApp(App).mount('#app');

Anche in questo caso puoi vedere come rispetto alla versione precedente di Vue non sia più necessario inizializzare la nuova applicazione con const app = new Vue(….).$mount('#app') ma con Vue 3 sia possibile utilizzare direttamente la funzione createApp() ed il metodo mount() per agganciare l’applicazione ad un selettore del DOM.

Infine l’ultimo passaggio affinché Vue riesca ad agganciarsi al DOM correttamente è quello di aggiungere al file index.html un div con id app:

<h1>Hello Vue 3!</h1>

<div id="app"></div>

<script src="/dist/main.js"></script>

A questo punto, rilanciando l’applicazione con yarn dev potrai iniziare a giocare con il nuovo componente Vue appena creato.

Componente Vue in funzione
Il componente Vue all’opera

Next level

In questo post ti ho fatto vedere come creare un semplicissimo componente utilizzando la composition API di Vue 3 e Typescript. Ovviamente ho scalfito appena la punta dell’iceberg e ci sono mille altre funzionalità e novità da provare in Vue 3 ma già con questo semplice componente è possibile apprezzare il nuovo approccio “funzionale” con cui è possibile definire i componenti nella prossima release di Vue.

PS: Tutto il codice del progetto è disponibile su GitHub.


Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

La bufala della dottoressa Jiào Shenme Minzi

In questi giorni sta circolando questo messaggio su Whatsapp che suggerisce di utilizzare vitamina C e limone caldo per prevenire e curare dal coronovirus.

Ovviamente si tratta di una fake news. Sarebbe bello se bastassero un po’ di vitamine a curare il virus! Inoltre, se fosse vero, non si spiegherebbe come mai tutto il territorio italiano è stato marcato come zona rossa.

Per favore se ricevi questo messaggio non condividerlo a nessuno per evitare di diffondere ulteriormente fake news.

In questi giorni di quarantena sta girando di tutto sui social. Per evitare qualsiasi dubbio verifica sempre la fonte delle notizie. Se provengono da fonti autorevoli (ISS, portezione civile, ecc…) prendile pure in considerazione altrimenti ti consiglio vivamente di considerarle come fuffa.

Ciao, sono jiào Shenme Minzi dalla Cina, Ricercatrice della Facoltà di Scienze mediche. Università di Zanjan
Il virus Corona arriva in qualsiasi paese prima o poi, non c’è dubbio che molti paesi non hanno kit diagnostici o attrezzature.
Si prega di utilizzare quanto più vitamina C naturale possibile per rafforzare il sistema immunitario.
Non preoccuparti è un virus semplice da sbarazzare .
Il virus attualmente non contiene vaccini e trattamenti specifici sfortunatamente.
a causa della Mutazione genetica che l’ha resa molto pericoloso.
Questa malattia sembra essere causata dalla fusione del gene in un serpente e un pipistrello e ha acquisito la capacità di infettare i mammiferi, compresi gli umani.
È importante mantenere la calma e far girare questo messaggio.
il professor Chen Horin, CEO dell’ospedale militare di Pechino, ha dichiarato: “Le fette di limone in una tazza di acqua calda possono salvarti la vita”.
Anche se stai lavorando, dovresti dare un’occhiata a questo messaggio e trasmetterlo ad altri!
Il limone caldo può uccidere la proliferazione di questo virus nel nostro organismo !
Il limone tagliato in tre parti e messo in una tazza, quindi versa acqua calda e trasformalo in (acqua alcalina), bevilo ogni giorno sicuramente gioverà contro la proliferazione di questo virus.
I limoni caldi possono avere lo stesso effetto benefico delle medicine.
Il trattamento con questo estratto distrugge il virus e guarisce da questa influenza
Inoltre gli acidi e l’acido carbossilico nel succo di limone possono regolare l’ipertensione, proteggere le arterie strette, regolare la circolazione sanguigna e ridurre la coagulazione del sangue.
Dopo aver letto, dillo a qualcun altro e trasferiscilo alla persona che ami e prenditi cura della tua salute personale. Consiglio: Il professor Chen Horin nota che chiunque riceva questo messaggio è almeno garantito per salvare la vita a qualcuno …
Ho fatto il mio lavoro e spero che anche tu possa aiutarmi a svilupparlo”.
Lo hanno pubblicato in gruppi universitari.💪


Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Utilizzare Typescript in un progetto Symfony

Typescript logo

TypeScript è un linguaggio di programmazione open source sviluppato da Microsoft. Lo scopo con cui Microsoft ha creato Typescript è quello di estendere le funzionalità di Javascript (ECMAScript 6) aggiungendo il supporto ad una tipizzazione forte del linguaggio.

Grazie a questi vantaggi (e alla totale compatibilità con Javascript) Typescript ha raggiunto il terzo posto nella classifica dei linguaggi più apprezzati dagli utenti di StackOverflow distaccando di parecchie posizioni Javascript.

Classifica dei linguaggi più amati dagli utenti di StackOverflow
Classifica dei linguaggi più amati dagli utenti di StackOverflow

“TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.”

https://www.typescriptlang.org/

Come dice la definizione ufficiale di Microsoft, Typescript è un superset di Javascript.
Cosa vuol dire “superset di Javascript”? Sta a significare che Typescript non è altro che un “livello” posto al di sopra di Javascript che non ne altera il funzionamento di base ma ne estende le funzionalità.

Proprio a causa della sua natura di livello aggiuntivo rispetto a Javascript, Typescript non è interpretato nativamente dai browser ed è quindi necessario “tradurlo” in Javascript prima di poterlo utilizzare. Il processo di “traduzione” da Typescript a Javascript è chiamato traspilazione.

Ti mostro con un esempio pratico cosa avviene ad un semplice codice scritto in Typescript durante la fase di traspilazione:

const hello = (name: string) => {
    console.log('Hello, ' + name);
};
hello('Lorenzo');

Viene traspilato nel seguente codice Javascript:

var hello = function hello(name) {
  console.log('Hello, ' + name);
};
hello('Lorenzo');

Installazione

Una volta appurati i vantaggi derivanti dall’uso di Typescript sei pronto per installarlo e configurarlo all’interno di un’applicazione Symfony.

NOTA: Per seguire questo articolo devi avere un progetto Symfony con una configurazione di Webpack funzionante. Se non sai come fare ti consiglio di guardare i miei precedenti articoli su come creare un nuovo progetto Symfony e su come configurare Webpack.

La prima cosa da fare è installare i pacchetti necessari:

yarn add typescript
yarn add ts-loader --dev

Una volta che il download sarà terminato devi definire la configurazione che utilizzerà il compilatore di Typescript (tsc).
Per generare il file di configurazione con le opzioni di default puoi usare il comando:

./node_modules/typescript/bin/tsc --init

Con questo comando verrà aggiunto il filetsconfig.json alla root del progetto.

Affinché il compilatore funzioni correttamente la configurazione di default non è sufficiente.
E’ necessario specificare all’interno del file di configurazione quali cartelle del progetto devono essere compilate e quali no aggiungendo le voci include e exclude come descritto di seguito:

"compilerOptions": {
    // ... configurazione di default del compilatore
},
"include": [
    "./assets/js/**/*.ts"
],
"exclude": [
    "node_modules"
]

NOTA: Per saperne di più su tutte le configurazioni del compilatore Typescript ti rimando alla documentazione ufficiale.

A questo punto il compilatore è stato configurato e sei pronto per aggiungere il processo di compilazione di Typescript alla configurazione di Webpack.
Per farlo devi modificare il file webpack.config.js (contenuto nella root del progetto) nel seguente modo:

Encore.

    //... configurazioni di webpack encore

    .enableTypeScriptLoader()

    //... configurazioni di webpack encore

    // Aggiunta di un file Typescript da compilare
    .addEntry('js/myFirstTsScript', './assets/js/myFirstTsScript.ts')

Una volta avviata la compilazione con Webpack troverai all’interno del percorso public/build/js/myFirstTsScript.js il file traspilato.

Per poter utilizzare il file appena creato all’interno di un template TWIG puoi usare il seguente codice:

{% block javascripts %} 
 {{ encore_entry_script_tags('js/myFirstTsScript') }}
{% endblock %}

Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!

Fonte
Fonte

Millewin: Liberare spazio sull’hard disk pulendo la cartella pg_log

Cartella pg_log piena di file temporanei

ATTENZIONE: Prima di procedere accertarsi di aver effettuato un backup dai dati. La procedura descritta nell’articolo è sicura ma prevenire è sempre meglio che curare.

Nel corso del tempo, aggiornamento dopo aggiornamento, può capitare che la cartella C:\Program Files (x86)\Millewin\Dati\database_postgresql\pg_log (o C:\Programmi\Millewin\Dati\database_postgresql\pg_log nel caso di sistemi a 32bit) si riempa di file del tipo postgresql-01.log, postgresql-02.log, ecc … arrivando ad occupare svariate decine di gigabyte sull’hard disk del computer.

Tutti i file contenuti all’interno della cartella, essendo solo dei file di log, possono essere tranquillamente eliminati senza alcuna conseguenza sui dati dei pazienti.

Inoltre per evitare che il problema si ripresenti è necessario:

  • Aprire Centrale di Controllo,
  • Premere il menù Manutenzione,
  • Selezionare Schema Postgresql,
  • Premere Aggiorna schema postgres, se presente (Nel momento in cui scrivo la versione del database più aggiornata è la 13.02)

NOTA: L’operazione potrebbe durare alcuni secondi ma risolverà definitivamente il problema.

NOTA2: Nel caso di installazioni di rete l’aggiornamento dello schema va fatto sul server.

Nessun aggiornamento da fare (Versione del database 13.02)

Se questo post ti è stato utile puoi farmelo sapere lasciando un commento qui sotto oppure scrivendomi direttamente a t.me/lorenzomillucci.
Inoltre ti invito ad iscriverti al mio canale Telegram e a seguirmi su Twitter per non perderti nemmeno un post del mio blog. A presto!