


[{"content":"","date":"12 agosto 2026","externalUrl":null,"permalink":"/it/tags/affitti-brevi-firenze/","section":"Tags","summary":"","title":"Affitti Brevi Firenze","type":"tags"},{"content":"","date":"12 agosto 2026","externalUrl":null,"permalink":"/it/tags/alloggiati/","section":"Tags","summary":"","title":"Alloggiati","type":"tags"},{"content":"","date":"12 agosto 2026","externalUrl":null,"permalink":"/it/alloggiati/","section":"Alloggiati","summary":"","title":"Alloggiati","type":"Alloggiati"},{"content":"","date":"12 agosto 2026","externalUrl":null,"permalink":"/it/tags/carbon-free/","section":"Tags","summary":"","title":"Carbon Free","type":"tags"},{"content":" L\u0026rsquo;arte dell\u0026rsquo;ospitalità a Firenze # Gestire una struttura ricettiva nel cuore di Firenze, a due passi dal Duomo o dagli Uffizi, è un\u0026rsquo;esperienza unica ma anche una grande sfida. Negli ultimi anni il mercato degli affitti brevi e dei B\u0026amp;B è esploso, richiedendo ai proprietari e ai property manager un\u0026rsquo;organizzazione impeccabile.\nLe recensioni a 5 stelle si conquistano con dettagli curati, pulizia perfetta e un check-in accogliente. Tuttavia, la burocrazia italiana si mette spesso di traverso, trasformando quello che dovrebbe essere il momento dell\u0026rsquo;accoglienza in un freddo passaggio di scartoffie. Parliamo, ovviamente, delle schedine alloggiati.\nIl peso della burocrazia per chi fa Property Management # Che tu abbia un solo appartamento in Oltrarno o che gestisca dieci case vacanza sparse per il centro storico, la regola è sempre la stessa: entro 24 ore dall\u0026rsquo;arrivo dell\u0026rsquo;ospite, i suoi dati vanno comunicati alla Polizia di Stato.\nPer chi non ha strumenti adeguati, il processo è snervante:\nRaccogliere i passaporti o le carte di identità (spesso sbiadite o difficili da leggere). Accedere al portale istituzionale Alloggiati Web, che a volte risulta lento o temporaneamente fuori servizio. Inserire a mano ogni singolo dato: nome, cognome, cittadinanza, tipo e numero di documento, luogo di rilascio. Un errore di distrazione è facile, soprattutto dopo una giornata passata a correre tra un check-in e l\u0026rsquo;altro. E le sanzioni per mancato o errato invio non sono da sottovalutare.\nDimentica l\u0026rsquo;inserimento manuale con Send to Alloggiati # Perché continuare a perdere ore preziose davanti allo schermo quando la tecnologia può fare il lavoro sporco per te? Send to Alloggiati è l\u0026rsquo;applicazione creata per risolvere definitivamente questo problema.\nCon Send to Alloggiati, il processo di registrazione diventa istantaneo:\nScansione Intelligente: Durante il check-in, apri l\u0026rsquo;app e inquadri il documento dell\u0026rsquo;ospite. L\u0026rsquo;algoritmo di riconoscimento ottico (OCR) estrae tutti i dati necessari in frazioni di secondo, direttamente sul tuo dispositivo e nel pieno rispetto della privacy. Esportazione CSV per ISTAT (Ross1000): Non solo Polizia di Stato! L\u0026rsquo;app ti permette anche di esportare un flusso dati in formato CSV, pronto per essere caricato sul portale Ross1000 per l\u0026rsquo;adempimento ISTAT. In alternativa, puoi usare l\u0026rsquo;invio diretto tramite Web Service (WS) con un solo tasto per completare le pratiche in un attimo. Ritorna a fare l\u0026rsquo;Host # Delegare la burocrazia a un\u0026rsquo;app affidabile significa riappropriarsi del proprio tempo. Immagina di finire il tuo giro di check-in a Firenze e poter finalmente goderti un aperitivo in Piazza Santo Spirito, senza il pensiero di dover accendere il computer per registrare i turisti arrivati nel pomeriggio.\nMettiti al passo con i tempi e scegli una soluzione moderna, veloce e a prova di errore.\n👉 Inizia subito a risparmiare tempo: vai su schedinesmart.it per scoprire tutte le funzionalità e scaricare l\u0026rsquo;app.\n","date":"12 agosto 2026","externalUrl":null,"permalink":"/it/alloggiati/invio-schedine-alloggiati-firenze/","section":"Alloggiati","summary":"Gestisci appartamenti o B\u0026amp;B a Firenze? Evita lo stress del portale Alloggiati Web. Scopri come inviare i dati alla Questura in un click o esportando un file CSV per l\u0026rsquo;ISTAT.","title":"Firenze e gli Affitti Brevi: Semplifica l'Invio Schedine Alloggiati","type":"Alloggiati"},{"content":"","date":"12 agosto 2026","externalUrl":null,"permalink":"/it/tags/green-tech/","section":"Tags","summary":"","title":"Green Tech","type":"tags"},{"content":"","date":"12 agosto 2026","externalUrl":null,"permalink":"/it/","section":"Luciosoft Blog","summary":"","title":"Luciosoft Blog","type":"page"},{"content":"","date":"12 agosto 2026","externalUrl":null,"permalink":"/it/tags/privacy/","section":"Tags","summary":"","title":"Privacy","type":"tags"},{"content":"","date":"12 agosto 2026","externalUrl":null,"permalink":"/it/tags/property-manager/","section":"Tags","summary":"","title":"Property Manager","type":"tags"},{"content":" L\u0026rsquo;importanza di un software sostenibile # Oggi, quando parliamo di inquinamento, pensiamo subito a mezzi di trasporto o industrie. Ma sapevate che anche il mondo digitale ha un impatto enorme sull\u0026rsquo;ambiente? I server sempre accesi, il trasferimento continuo di dati e i datacenter energivori consumano quantità incredibili di energia.\nDa sviluppatore, credo che ognuno debba fare la propria parte. Per questo, quando ho progettato e sviluppato Schedine Smart (l\u0026rsquo;app che automatizza l\u0026rsquo;invio delle schedine alloggiati al portale della Polizia di Stato), ho voluto mettere al centro non solo la privacy e la facilità d\u0026rsquo;uso, ma anche l\u0026rsquo;ecosostenibilità.\nUn\u0026rsquo;infrastruttura Carbon Free # Schedine Smart è orgogliosamente un\u0026rsquo;applicazione carbon free. Come abbiamo raggiunto questo traguardo?\n1. Elaborazione On-Device # Il cuore dell\u0026rsquo;app è il suo sistema di riconoscimento ottico (OCR). La maggior parte della magia avviene direttamente sul vostro smartphone, grazie a modelli di machine learning eseguiti localmente (on-device).\nCosa significa questo per l\u0026rsquo;ambiente? Significa che non stiamo inviando foto pesanti avanti e indietro attraverso la rete, e non stiamo tenendo accesi server costosi e affamati di energia h24 solo per estrarre i dati da un documento. Questa scelta non solo azzera i consumi di rete, ma garantisce anche una privacy assoluta.\n2. Zero Server Intermedi # Molte app usano server intermedi per raccogliere i dati, elaborarli e poi inoltrarli. Schedine Smart non lo fa. L\u0026rsquo;app comunica direttamente dal vostro telefono al portale Alloggiati Web.\nMeno server significa meno hardware fisico necessario, meno energia consumata per il raffreddamento dei datacenter e un\u0026rsquo;infrastruttura molto più leggera ed ecologica.\n3. I servizi Cloud (quando strettamente necessari) # L\u0026rsquo;unica eccezione riguarda l\u0026rsquo;utilizzo opzionale dell\u0026rsquo;intelligenza artificiale (Gemini Flash) come ultima spiaggia per i documenti illeggibili. Per questo ci appoggiamo a Google Cloud, un fornitore che dal 2007 è carbon neutral e che oggi alimenta le proprie strutture al 100% con energia rinnovabile, puntando a operare interamente con energia pulita in ogni momento entro il 2030.\nApproccio Paperless: Zero Carta # Gestire un B\u0026amp;B o una casa vacanze tradizionalmente significa accumulare decine di fotocopie di documenti d\u0026rsquo;identità, appunti cartacei e registri che inevitabilmente finiranno al macero.\nCon Schedine Smart, l\u0026rsquo;intero processo è digitalizzato. Scansioni il documento, l\u0026rsquo;app legge i dati e li invia. Nessuna fotocopia, nessuno spreco di carta, nessun toner per stampanti. L\u0026rsquo;ambiente ringrazia.\nFai una scelta green per il tuo B\u0026amp;B # Usare strumenti moderni non significa solo risparmiare tempo e ridurre gli errori di battitura, ma può essere anche un modo concreto per ridurre l\u0026rsquo;impatto ambientale della tua attività ricettiva.\nCon Schedine Smart, fai una scelta sicura per la privacy dei tuoi ospiti ed ecosostenibile per il nostro pianeta.\nScarica Schedine Smart per Android\nLa versione iOS è in lavorazione, arriverà a breve!\n","date":"12 agosto 2026","externalUrl":null,"permalink":"/it/alloggiati/send-to-police-ecosostenibile/","section":"Alloggiati","summary":"Scopri come l\u0026rsquo;app Schedine Smart gestisce l\u0026rsquo;invio delle schedine alloggiati in modo ecosostenibile, con un\u0026rsquo;infrastruttura carbon free e paperless.","title":"Schedine Smart: L'App per Schedine Alloggiati Carbon Free ed Ecosostenibile","type":"Alloggiati"},{"content":"","date":"12 agosto 2026","externalUrl":null,"permalink":"/it/tags/send-to-alloggiati/","section":"Tags","summary":"","title":"Send To Alloggiati","type":"tags"},{"content":"","date":"12 agosto 2026","externalUrl":null,"permalink":"/it/tags/sostenibilit%C3%A0/","section":"Tags","summary":"","title":"Sostenibilità","type":"tags"},{"content":"","date":"12 agosto 2026","externalUrl":null,"permalink":"/tags/sustainability/","section":"Tags","summary":"","title":"Sustainability","type":"tags"},{"content":"","date":"12 agosto 2026","externalUrl":null,"permalink":"/it/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"7 agosto 2026","externalUrl":null,"permalink":"/it/tags/bb-lecce/","section":"Tags","summary":"","title":"B\u0026B Lecce","type":"tags"},{"content":" Ospitare a Lecce: il fascino del Barocco e l\u0026rsquo;accoglienza del Sud # Lecce e tutto il Salento sono diventati un punto di riferimento internazionale per il turismo. Le masserie, i Bed and Breakfast incastonati nella pietra leccese e le case vacanza tra i vicoli storici offrono esperienze autentiche che i turisti amano. L\u0026rsquo;accoglienza qui è un\u0026rsquo;arte fatta di sorrisi, pasticciotti caldi e consigli sulle spiagge migliori.\nMa anche qui, dove il tempo sembra scorrere più lentamente, i gestori devono fare i conti con le rigide scadenze della burocrazia: l\u0026rsquo;invio delle schedine alloggiati alla Polizia di Stato.\nL\u0026rsquo;estate salentina e i check-in infiniti # Chi gestisce una struttura ricettiva nel Sud Italia sa bene che i mesi estivi (e non solo) possono trasformarsi in un vero e proprio tour de force. Tra le pulizie delle camere, la preparazione delle colazioni e l\u0026rsquo;accoglienza di ospiti che arrivano scaglionati durante tutta la giornata, la sera si è spesso esausti.\nEppure, proprio in quel momento, bisogna mettersi al PC. Bisogna decifrare i documenti, fare l\u0026rsquo;accesso al portale Alloggiati Web e inserire i dati a mano per ogni singola persona. Un lavoro ripetitivo, soggetto a errori, che rischia di rovinare la tranquillità che rende speciale questo lavoro.\nLa soluzione smart: Send to Alloggiati # Perché sprecare energie quando la tecnologia può semplificarti la vita? L\u0026rsquo;app Send to Alloggiati è lo strumento che sta cambiando le abitudini di molti host pugliesi, permettendo loro di gestire la burocrazia in pochi istanti.\nEcco i vantaggi concreti:\nLettura Automatica dei Documenti: Non hai bisogno di scanner o computer portatili. Inquadra il documento del tuo ospite con la fotocamera dello smartphone durante il check-in. L\u0026rsquo;app estrae i dati in modo intelligente e sicuro (tutto in locale, senza cloud) e li invia direttamente al portale della Questura. Finito. Esportazione CSV per ISTAT (Ross1000): Non solo Polizia di Stato! L\u0026rsquo;app ti permette anche di esportare un flusso dati in formato CSV, pronto per essere caricato sul portale Ross1000 per l\u0026rsquo;adempimento ISTAT. In alternativa, puoi usare l\u0026rsquo;invio diretto tramite Web Service (WS) con un solo tasto per completare le pratiche in un attimo. Goditi la bellezza del tuo lavoro # Automatizzare l\u0026rsquo;invio delle schedine alloggiati ti permette di recuperare tempo prezioso. Tempo da dedicare alla cura dei dettagli della tua struttura o, semplicemente, per goderti una serata estiva leccese senza l\u0026rsquo;ansia delle scadenze.\n👉 Fai un regalo a te stesso e al tuo B\u0026amp;B: vai su schedinesmart.it per scoprire tutte le funzioni dell\u0026rsquo;app e scaricarla subito!\n","date":"7 agosto 2026","externalUrl":null,"permalink":"/it/alloggiati/invio-schedine-alloggiati-lecce/","section":"Alloggiati","summary":"Il turismo in Puglia non si ferma mai. Scopri come gestire l\u0026rsquo;invio delle schedine alloggiati a Lecce e nel Salento in pochi secondi, tramite smartphone e file CSV per ISTAT.","title":"B\u0026B nel Salento: Schedine Alloggiati a Lecce senza Stress","type":"Alloggiati"},{"content":"","date":"7 agosto 2026","externalUrl":null,"permalink":"/it/tags/host/","section":"Tags","summary":"","title":"Host","type":"tags"},{"content":"","date":"7 agosto 2026","externalUrl":null,"permalink":"/it/tags/salento/","section":"Tags","summary":"","title":"Salento","type":"tags"},{"content":" Ospitare a Milano: la città che non si ferma mai # Milano è il motore d\u0026rsquo;Italia, una città frenetica che vive di grandi eventi internazionali: la Design Week, le Settimane della Moda, le fiere e un turismo business costante tutto l\u0026rsquo;anno. Se gestisci un appartamento su Airbnb o un B\u0026amp;B in città, sai benissimo che i tuoi ospiti si aspettano un servizio impeccabile, veloce e all\u0026rsquo;altezza di una metropoli europea.\nMa mentre tutto intorno a te va alla velocità della luce, c\u0026rsquo;è un momento della giornata in cui il tempo sembra fermarsi: l\u0026rsquo;invio delle schedine alloggiati.\nIl \u0026ldquo;collo di bottiglia\u0026rdquo; del portale istituzionale # I Property Manager milanesi spesso si trovano a gestire decine di check-in al giorno, magari distribuiti in quartieri diversi, da Isola ai Navigli. Raccogliere i dati, tornare in ufficio (o a casa), accedere ad Alloggiati Web e inserire manualmente ogni singola anagrafica è un\u0026rsquo;attività anacronistica.\nInoltre, il portale della Polizia di Stato richiede precisione assoluta. Se sbagli a trascrivere un nome o il numero di un documento rilasciato da un paese straniero con un formato insolito, devi ricominciare da capo. E le scadenze (entro le 24 ore dall\u0026rsquo;arrivo) non ammettono ritardi.\nEfficienza meneghina con Send to Alloggiati # Il mercato milanese degli affitti brevi richiede soluzioni smart e automatizzate. È qui che entra in gioco Send to Alloggiati, un\u0026rsquo;app pensata per tagliare i tempi della burocrazia in modo sicuro e professionale.\nCome migliorerà il tuo flusso di lavoro?\nUpload CSV dai Channel Manager: Se utilizzi software gestionali avanzati per sincronizzare le prenotazioni, Send to Alloggiati ti permette di importare il file CSV dei tuoi ospiti. Con pochi clic elabori e invii massivamente le schedine, eliminando del tutto l\u0026rsquo;inserimento manuale. Esportazione CSV per ISTAT (Ross1000): Non solo Polizia di Stato! L\u0026rsquo;app ti permette anche di esportare un flusso dati in formato CSV, pronto per essere caricato sul portale Ross1000 per l\u0026rsquo;adempimento ISTAT. In alternativa, puoi usare l\u0026rsquo;invio diretto tramite Web Service (WS) con un solo tasto per completare le pratiche in un attimo. Automatizza e scala il tuo business # A Milano, il tempo è denaro. Ogni ora spesa a litigare con un portale web per inserire dati a mano è un\u0026rsquo;ora sottratta allo sviluppo del tuo business, all\u0026rsquo;acquisizione di nuovi appartamenti o, più semplicemente, al tuo tempo libero.\nL\u0026rsquo;ottimizzazione dei processi è il segreto dei migliori host. Fai il salto di qualità.\n👉 Migliora subito la gestione del tuo B\u0026amp;B: vai su schedinesmart.it per tutti i dettagli tecnici e per iniziare a usare l\u0026rsquo;applicazione.\n","date":"2 agosto 2026","externalUrl":null,"permalink":"/it/alloggiati/invio-schedine-alloggiati-milano/","section":"Alloggiati","summary":"Scopri la soluzione definitiva per i Property Manager e gli host di Milano per inviare i dati ad Alloggiati Web tramite foto e file CSV per ISTAT in modo automatico e veloce.","title":"Airbnb a Milano: Come Automatizzare l'Invio delle Schedine alla Polizia","type":"Alloggiati"},{"content":"","date":"2 agosto 2026","externalUrl":null,"permalink":"/it/tags/airbnb-milano/","section":"Tags","summary":"","title":"Airbnb Milano","type":"tags"},{"content":"","date":"2 agosto 2026","externalUrl":null,"permalink":"/it/tags/check-in/","section":"Tags","summary":"","title":"Check-in","type":"tags"},{"content":"","date":"28 luglio 2026","externalUrl":null,"permalink":"/it/tags/bb-napoli/","section":"Tags","summary":"","title":"B\u0026B Napoli","type":"tags"},{"content":" L\u0026rsquo;energia contagiosa di Napoli (e i suoi turisti) # Negli ultimi anni, Napoli ha vissuto un vero e proprio rinascimento turistico. Dalle vie del centro storico a Spaccanapoli, fino ai quartieri più panoramici, l\u0026rsquo;apertura di nuovi Bed and Breakfast e case vacanza non accenna a diminuire. Ospitare in questa città significa regalare calore, ottimi consigli culinari e un\u0026rsquo;atmosfera indimenticabile.\nEppure, quando la sera cala sul Golfo, c\u0026rsquo;è un momento in cui l\u0026rsquo;entusiasmo dell\u0026rsquo;host si spegne: il collegamento al portale Alloggiati Web per l\u0026rsquo;invio delle schedine degli ospiti.\nQuando la burocrazia frena l\u0026rsquo;ospitalità # Gestire un B\u0026amp;B a conduzione familiare o una serie di appartamenti nel caos vitale di Napoli richiede molta energia. Tornare a casa dopo aver accolto gli ospiti, mettersi al computer e iniziare a digitare a mano i dati dei documenti di identità è frustrante.\nLa Questura richiede precisione e tempestività (invio entro 24 ore dall\u0026rsquo;arrivo). Se hai un gruppo di quattro turisti, tra nomi, cognomi, date e luoghi di rilascio dei documenti, rischi di passare mezz\u0026rsquo;ora incollato allo schermo, pregando che la connessione al portale di Stato non si interrompa proprio sul più bello.\nSend to Alloggiati: la soluzione \u0026ldquo;Zero Stress\u0026rdquo; # Perché continuare a fare a mano quello che l\u0026rsquo;intelligenza artificiale può fare in pochi decimi di secondo? Send to Alloggiati è l\u0026rsquo;app progettata per farti dimenticare il problema delle schedine.\nEcco perché sta conquistando gli host partenopei:\nLa fotocamera diventa il tuo assistente: Durante il check-in, apri l\u0026rsquo;app e inquadri il documento dell\u0026rsquo;ospite. L\u0026rsquo;app legge i dati automaticamente e li compila per te. Tu controlli, premi invio e il gioco è fatto. Nessun dato personale viene salvato sui nostri server, garantendo la totale privacy dei tuoi ospiti. Esportazione CSV per ISTAT (Ross1000): Non solo Polizia di Stato! L\u0026rsquo;app ti permette anche di esportare un flusso dati in formato CSV, pronto per essere caricato sul portale Ross1000 per l\u0026rsquo;adempimento ISTAT. In alternativa, puoi usare l\u0026rsquo;invio diretto tramite Web Service (WS) con un solo tasto per completare le pratiche in un attimo. Goditi la tua città # Il successo del tuo B\u0026amp;B dipende dall\u0026rsquo;attenzione che dedichi ai tuoi ospiti, non dal tempo che passi a inserire dati su un sito web anni \u0026lsquo;90. Ottimizza la tua routine di check-in e riprenditi il piacere dell\u0026rsquo;ospitalità.\n👉 Non aspettare oltre: visita schedinesmart.it per capire come funziona l\u0026rsquo;app e per scaricarla. Semplificati la vita da host!\n","date":"28 luglio 2026","externalUrl":null,"permalink":"/it/alloggiati/invio-schedine-alloggiati-napoli/","section":"Alloggiati","summary":"Il turismo a Napoli è in crescita esponenziale. Non farti fermare dalla burocrazia: scopri come inviare le schedine alloggiati in pochi secondi con lo smartphone o via CSV.","title":"Il Boom dei B\u0026B a Napoli: Risolto il Problema delle Schedine Alloggiati","type":"Alloggiati"},{"content":"","date":"23 luglio 2026","externalUrl":null,"permalink":"/it/tags/bb-palermo/","section":"Tags","summary":"","title":"B\u0026B Palermo","type":"tags"},{"content":" L\u0026rsquo;ospitalità siciliana senza ostacoli # Palermo è una città che travolge i sensi, e chi apre un Bed and Breakfast qui lo sa bene. I turisti arrivano desiderosi di perdersi tra i mercati storici di Ballarò e Vucciria, di assaggiare lo street food e di scoprire le meraviglie arabo-normanne. Il compito di un host palermitano è farli sentire subito a casa.\nMa c\u0026rsquo;è un ostacolo che spesso spezza questa magia dell\u0026rsquo;accoglienza: l\u0026rsquo;obbligo di registrare i documenti sul portale Alloggiati Web della Polizia di Stato.\nIl problema dei check-in serali # Molti voli per la Sicilia arrivano nel tardo pomeriggio o in serata. Accogli gli ospiti, mostri loro la camera, dài qualche consiglio su dove andare a mangiare e\u0026hellip; poi devi ritirarti per sbrigare le scartoffie. Il portale istituzionale richiede l\u0026rsquo;inserimento manuale di tutti i dati anagrafici e degli estremi del documento.\nSe i documenti sono tanti, o se hai più check-in nella stessa giornata, questa procedura si trasforma in un vero e proprio \u0026ldquo;lavoro extra\u0026rdquo; non retribuito. Aggiungi il fatto che il portale a volte è lento o in manutenzione, e lo stress è garantito.\nSend to Alloggiati: la soluzione a portata di mano # Non lasciare che la burocrazia rovini la tua passione per l\u0026rsquo;ospitalità. Send to Alloggiati è l\u0026rsquo;applicazione creata appositamente per chi gestisce strutture ricettive e vuole ottimizzare i tempi.\nPerché sceglierla per il tuo B\u0026amp;B a Palermo?\nOCR Veloce e Sicuro: Inquadra il documento dell\u0026rsquo;ospite (carta d\u0026rsquo;identità o passaporto) direttamente con la fotocamera del tuo telefono. L\u0026rsquo;intelligenza artificiale estrae i dati in locale in modo istantaneo. Tu controlli la correttezza e con un tap invii tutto alla Questura. Niente login continui e niente caricamenti infiniti. Esportazione CSV per ISTAT (Ross1000): Non solo Polizia di Stato! L\u0026rsquo;app ti permette anche di esportare un flusso dati in formato CSV, pronto per essere caricato sul portale Ross1000 per l\u0026rsquo;adempimento ISTAT. In alternativa, puoi usare l\u0026rsquo;invio diretto tramite Web Service (WS) con un solo tasto per completare le pratiche in un attimo. Più tempo per i tuoi ospiti, zero pensieri # Semplificare la gestione delle pratiche significa dedicare più energie alla cura della tua struttura e dei tuoi ospiti, elementi fondamentali per ottenere recensioni eccellenti e far crescere il tuo B\u0026amp;B a Palermo.\n👉 Inizia a risparmiare tempo fin dal prossimo check-in: scopri come funziona l\u0026rsquo;app su schedinesmart.it e scaricala per rivoluzionare il tuo modo di lavorare!\n","date":"23 luglio 2026","externalUrl":null,"permalink":"/it/alloggiati/invio-schedine-alloggiati-palermo/","section":"Alloggiati","summary":"Scopri come semplificare l\u0026rsquo;invio delle schedine alloggiati a Palermo. Usa il tuo smartphone per scansionare i documenti o esporta i dati per l\u0026rsquo;ISTAT via CSV in pochi clic.","title":"Gestire le Schedine Alloggiati a Palermo: Meno Burocrazia per il tuo B\u0026B","type":"Alloggiati"},{"content":" Pisa: molto più della Torre Pendente # Pisa è una delle mete turistiche italiane più amate dai visitatori stranieri e un importante snodo aeroportuale. Questo si traduce in un flusso continuo di turisti \u0026ldquo;mordi e fuggi\u0026rdquo; che si fermano spesso per una o due notti prima di proseguire il loro viaggio in Toscana.\nPer chi gestisce un B\u0026amp;B o una casa vacanze in città, questo alto turnover significa una sola cosa: molti check-in in poco tempo. E con i check-in arrivano inevitabilmente gli obblighi di legge, primo fra tutti la registrazione degli ospiti sul portale Alloggiati Web.\nIl peso dei soggiorni brevi sulla burocrazia # Se un ospite si ferma per una settimana, il tempo impiegato per registrarlo viene \u0026ldquo;ammortizzato\u0026rdquo;. Ma se gestisci ospiti che cambiano ogni giorno, la trasmissione dei dati alla Polizia di Stato diventa un\u0026rsquo;incombenza quotidiana pesante.\nMolti host si ritrovano la sera a dover inserire manualmente decine di nomi, numeri di passaporto e luoghi di nascita, lottando contro un portale istituzionale non sempre intuitivo e veloce. Un errore di digitazione su un documento straniero può costringere a rifare la procedura, rubando tempo prezioso che potrebbe essere dedicato al riposo o alla cura della struttura.\nAutomatizza i tuoi Check-in con Send to Alloggiati # Per far fronte a questo ritmo frenetico, la tecnologia viene in tuo soccorso. Send to Alloggiati è l\u0026rsquo;applicazione definitiva per azzerare i tempi burocratici e lavorare in modo più intelligente.\nI vantaggi per gli host di Pisa sono immediati:\nScansione da Smartphone: Ti basta inquadrare il documento dell\u0026rsquo;ospite con la fotocamera del tuo telefono. Grazie al sistema OCR integrato (che lavora offline per garantire la massima privacy), l\u0026rsquo;app estrae i dati all\u0026rsquo;istante e li invia direttamente ad Alloggiati Web con un solo tap. Esportazione CSV per ISTAT (Ross1000): Non solo Polizia di Stato! L\u0026rsquo;app ti permette anche di esportare un flusso dati in formato CSV, pronto per essere caricato sul portale Ross1000 per l\u0026rsquo;adempimento ISTAT. In alternativa, puoi usare l\u0026rsquo;invio diretto tramite Web Service (WS) con un solo tasto per completare le pratiche in un attimo. Lavora in modo più intelligente # Non lasciare che la burocrazia diventi il limite alla crescita del tuo B\u0026amp;B. Scegliere strumenti digitali moderni ti permette di offrire un\u0026rsquo;accoglienza più rilassata e professionale.\n👉 Smetti di copiare a mano i documenti: visita il sito schedinesmart.it per scoprire tutti i dettagli tecnici e scaricare l\u0026rsquo;app che semplificherà le tue serate!\n","date":"18 luglio 2026","externalUrl":null,"permalink":"/it/alloggiati/invio-schedine-alloggiati-pisa/","section":"Alloggiati","summary":"Pisa è una meta gettonatissima per soggiorni brevi. Scopri come automatizzare l\u0026rsquo;invio delle schedine alloggiati alla Questura usando un\u0026rsquo;app intelligente o l\u0026rsquo;esportazione CSV per l\u0026rsquo;ISTAT.","title":"B\u0026B a Pisa: Gestire il Flusso Turistico e le Schedine Alloggiati","type":"Alloggiati"},{"content":"","date":"18 luglio 2026","externalUrl":null,"permalink":"/it/tags/bb-pisa/","section":"Tags","summary":"","title":"B\u0026B Pisa","type":"tags"},{"content":"","date":"13 luglio 2026","externalUrl":null,"permalink":"/it/tags/bb-roma/","section":"Tags","summary":"","title":"B\u0026B Roma","type":"tags"},{"content":" La vita frenetica di un host a Roma # Roma è una città magnifica, ma chi gestisce un Bed and Breakfast o una casa vacanze nella Capitale sa bene che dietro alla Grande Bellezza c\u0026rsquo;è un lavoro immenso. Tra turisti che arrivano in ritardo, la pulizia delle camere, le pratiche per la tassa di soggiorno e l\u0026rsquo;eterno problema del traffico, il tempo per rilassarsi sembra non esserci mai.\nUna delle attività che ruba più tempo e genera più stress per i gestori è l\u0026rsquo;invio delle schedine alloggiati. La legge italiana è chiara: i dati degli ospiti devono essere trasmessi alla Polizia di Stato tramite il portale Alloggiati Web entro 24 ore dal loro arrivo.\nIl problema del portale Alloggiati Web # Immagina la scena: sono le 22:00, hai appena finito di fare il check-in a una famiglia di turisti stranieri. Sei stanco e vorresti solo chiudere la giornata. Invece ti tocca sederti al computer, accedere al portale (sperando che non sia in manutenzione o bloccato) e iniziare a inserire a mano i dati.\nNome, cognome, data di nascita, cittadinanza, tipo e numero di documento\u0026hellip; Tutto rigorosamente copiato dalle foto sgranate dei passaporti che ti sei fatto inviare su WhatsApp. Un errore di battitura, un documento non riconosciuto e la procedura si blocca. Per chi gestisce un alto volume di prenotazioni come succede a Roma, specialmente in alta stagione o in prossimità del Giubileo, questo lavoro manuale diventa un incubo ricorrente che porta via ore preziose ogni settimana.\nLa soluzione definitiva: Send to Alloggiati # E se ti dicessi che puoi risolvere questo problema in pochi secondi? Nata proprio dall\u0026rsquo;esigenza reale di un host, l\u0026rsquo;applicazione Send to Alloggiati è stata progettata per eliminare lo stress dell\u0026rsquo;inserimento manuale.\nEcco come questa app rivoluziona il lavoro quotidiano del tuo B\u0026amp;B:\nScansione e Invio Diretto: Tramite la fotocamera del tuo smartphone, l\u0026rsquo;app legge in modo intelligente (grazie all\u0026rsquo;intelligenza artificiale e al riconoscimento OCR avanzato) i documenti di identità ed estrae i dati in millisecondi. Controlli che sia tutto corretto e, con un solo pulsante, i dati vengono trasmessi in modo sicuro alla Polizia. Nessun passaggio su portali lenti e macchinosi.\nEsportazione CSV per ISTAT (Ross1000): Non solo Polizia di Stato! L\u0026rsquo;app ti permette anche di esportare un flusso dati in formato CSV, pronto per essere caricato sul portale Ross1000 per l\u0026rsquo;adempimento ISTAT. In alternativa, puoi usare l\u0026rsquo;invio diretto tramite Web Service (WS) con un solo tasto per completare le pratiche in un attimo.\nPiù tempo per i tuoi ospiti, meno burocrazia # Automatizzare l\u0026rsquo;invio delle schedine non è solo una comodità tecnica; è una scelta strategica per riprendersi il proprio tempo libero e migliorare l\u0026rsquo;esperienza dei clienti. Meno tempo passato davanti al PC a combattere con il portale della Questura significa più tempo per consigliare un buon ristorante a Trastevere ai tuoi ospiti o, più semplicemente, per riposare.\nSe gestisci una struttura a Roma e vuoi smettere di ricopiare passaporti a mano ogni sera, è arrivato il momento di passare a un metodo più smart.\n👉 Scopri come semplificarti la vita e prova subito la soluzione: Visita schedinesmart.it per tutti i dettagli e per scaricare l\u0026rsquo;app.\n","date":"13 luglio 2026","externalUrl":null,"permalink":"/it/alloggiati/invio-schedine-alloggiati-roma/","section":"Alloggiati","summary":"Gestisci un B\u0026amp;B a Roma? Scopri come automatizzare l\u0026rsquo;invio delle schedine alloggiati al portale ISTAT e della Polizia di Stato con un semplice click o esportando un file CSV per l\u0026rsquo;ISTAT.","title":"Gestire le Schedine Alloggiati a Roma: Salva le Tue Serate (Guida per B\u0026B)","type":"Alloggiati"},{"content":"","date":"8 luglio 2026","externalUrl":null,"permalink":"/it/tags/bb-venezia/","section":"Tags","summary":"","title":"B\u0026B Venezia","type":"tags"},{"content":" L\u0026rsquo;unicità (e la fatica) di ospitare a Venezia # Venezia non ha eguali nel mondo. Per un turista, soggiornare in Laguna tra canali, calli e campielli è pura magia. Ma per chi gestisce un Bed and Breakfast o un appartamento turistico, la realtà è fatta anche di grande impegno: accogliere gli ospiti ai moli, spiegare come muoversi senza perdersi, gestire le alte maree e, ovviamente, assolvere a tutti gli obblighi burocratici.\nTra questi, la trasmissione dei dati alla Polizia di Stato tramite il sistema Alloggiati Web è spesso vissuta come la parte più noiosa e stressante della giornata.\nIl problema dell\u0026rsquo;inserimento dati per gli host veneziani # Immagina questa situazione: hai appena accolto un gruppo di turisti arrivati con il vaporetto, hai spiegato loro tutto il necessario e finalmente torni alla tua base. Manca solo una cosa: registrare le schedine alloggiati.\nApri il portale ISTAT/Polizia di Stato e inizi a decifrare i documenti: carte d\u0026rsquo;identità usurate, passaporti con nomi incomprensibili, formati stranieri a cui non sei abituato. E se il sito web decide di fare i capricci, i tempi si allungano a dismisura. Per chi gestisce un B\u0026amp;B a Venezia, dove i ritmi sono dettati anche dalla logistica complessa della città, perdere tempo prezioso per copiare a mano dei dati è inaccettabile.\nLa svolta: l\u0026rsquo;app Send to Alloggiati # Nata dall\u0026rsquo;esperienza diretta di chi conosce queste problematiche, l\u0026rsquo;app Send to Alloggiati è la soluzione definitiva per snellire le pratiche di check-in.\nPerché questa app è perfetta per i property manager veneziani?\nMassima Mobilità: Sei sempre in movimento tra un sestiere e l\u0026rsquo;altro? Non ti serve il computer. Ti basta il tuo smartphone. Fai una foto al documento di identità e l\u0026rsquo;intelligenza artificiale estrae i dati all\u0026rsquo;istante, in locale, tutelando la privacy. Con un solo clic, i dati vengono trasmessi alla Questura. Esportazione CSV per ISTAT (Ross1000): Non solo Polizia di Stato! L\u0026rsquo;app ti permette anche di esportare un flusso dati in formato CSV, pronto per essere caricato sul portale Ross1000 per l\u0026rsquo;adempimento ISTAT. In alternativa, puoi usare l\u0026rsquo;invio diretto tramite Web Service (WS) con un solo tasto per completare le pratiche in un attimo. Riprenditi il tuo tempo in Laguna # Automatizzare la burocrazia significa poter offrire un servizio migliore ai tuoi ospiti e vivere il tuo lavoro con più serenità. Smetti di stressarti ogni sera davanti al portale Alloggiati Web e unisciti a centinaia di host che hanno già scelto la comodità.\n👉 Risolvi il problema delle schedine alloggiati oggi stesso: visita la pagina ufficiale schedinesmart.it per scoprire come l\u0026rsquo;app può cambiare il tuo modo di lavorare e per scaricarla sul tuo smartphone.\n","date":"8 luglio 2026","externalUrl":null,"permalink":"/it/alloggiati/invio-schedine-alloggiati-venezia/","section":"Alloggiati","summary":"Scopri come semplificare l\u0026rsquo;invio delle schedine alloggiati a Venezia. Usa il tuo smartphone per acquisire i documenti o carica un file CSV per dire addio all\u0026rsquo;inserimento manuale.","title":"Gestione B\u0026B a Venezia: Dimentica lo Stress del Portale Alloggiati Web","type":"Alloggiati"},{"content":"","date":"1 giugno 2026","externalUrl":null,"permalink":"/it/coding/","section":"Coding","summary":"","title":"Coding","type":"Coding"},{"content":"","date":"1 giugno 2026","externalUrl":null,"permalink":"/it/tags/crm/","section":"Tags","summary":"","title":"CRM","type":"tags"},{"content":"","date":"1 giugno 2026","externalUrl":null,"permalink":"/it/tags/ddd/","section":"Tags","summary":"","title":"DDD","type":"tags"},{"content":"","date":"1 giugno 2026","externalUrl":null,"permalink":"/it/tags/flutter/","section":"Tags","summary":"","title":"Flutter","type":"tags"},{"content":"","date":"1 giugno 2026","externalUrl":null,"permalink":"/it/tags/graphql/","section":"Tags","summary":"","title":"GraphQL","type":"tags"},{"content":"","date":"1 giugno 2026","externalUrl":null,"permalink":"/it/tags/luciosoft/","section":"Tags","summary":"","title":"Luciosoft","type":"tags"},{"content":"","date":"1 giugno 2026","externalUrl":null,"permalink":"/it/tags/mobile/","section":"Tags","summary":"","title":"Mobile","type":"tags"},{"content":"","date":"1 giugno 2026","externalUrl":null,"permalink":"/it/tags/opensource/","section":"Tags","summary":"","title":"OpenSource","type":"tags"},{"content":"","date":"1 giugno 2026","externalUrl":null,"permalink":"/it/tags/riverpod/","section":"Tags","summary":"","title":"Riverpod","type":"tags"},{"content":"","date":"1 giugno 2026","externalUrl":null,"permalink":"/it/tags/twentymobile/","section":"Tags","summary":"","title":"TwentyMobile","type":"tags"},{"content":" L\u0026rsquo;articolo che avevo promesso # Nell\u0026rsquo;ultimo post vi avevo raccontato perchè ho deciso di rendere TwentyMobile open source. Oggi vi porto dietro le quinte: come è costruita l\u0026rsquo;app, le scelte architetturali, e tutti quei momenti \u0026ldquo;ma perchè non funziona?\u0026rdquo; che ogni developer conosce troppo bene.\nL\u0026rsquo;architettura: DDD e Connector Pattern # Quando ho iniziato a scrivere TwentyMobile, sapevo che non volevo un\u0026rsquo;app che funzionasse solo con Twenty CRM. L\u0026rsquo;idea era creare un client mobile che potesse, in futuro, collegarsi a qualsiasi CRM. Ambizioso? Forse. Ma l\u0026rsquo;architettura giusta fa la differenza tra un progetto che scala e uno che muore sotto il suo peso.\nHo scelto il Domain-Driven Design (DDD) combinato con un approccio Feature-First. In pratica, la struttura del progetto è così:\nlib/ ├── core/ # DI, Router, Theme, Notifications ├── domain/ # Modelli (Contact, Company, Note, Task, Workflow) │ └── repositories/ # L\u0026#39;interfaccia astratta CRMRepository ├── data/ # TwentyConnector (il client GraphQL) ├── presentation/ # UI organizzata per feature │ ├── onboarding/ │ ├── home/ │ ├── contacts/ │ ├── companies/ │ ├── tasks/ │ ├── workflows/ │ └── ... └── shared/ # Widget condivisi Il cuore di tutto è il Connector Pattern: un\u0026rsquo;interfaccia astratta CRMRepository che definisce tutti i metodi necessari (30+ metodi!) per interagire con un CRM generico. L\u0026rsquo;implementazione concreta è TwentyConnector, un client GraphQL che parla con le API di Twenty.\nSe domani volessi supportare HubSpot o Salesforce? Basterebbe creare un HubSpotConnector che implementa la stessa interfaccia. La UI non cambierebbe di una virgola. Questa è la magia del DDD fatto bene.\nLo stack tecnologico # Vi racconto le scelte tecnologiche e perchè le ho fatte:\nRiverpod per lo state management. Dopo anni di Provider e BLoC, Riverpod è stata una boccata d\u0026rsquo;aria fresca. Il code generation con riverpod_annotation riduce il boilerplate al minimo.\nGoRouter per la navigazione. Supporta deep linking, parametri tipizzati, e si integra bene con Riverpod per i redirect di autenticazione.\nFreezed per i modelli di dominio. Immutabilità garantita, copyWith automatico, e soprattutto quei factory constructor .fromTwenty() che mi permettono di mappare le risposte GraphQL di Twenty nei miei modelli di dominio.\nGraphQL Flutter per le API. Twenty CRM espone tutto tramite GraphQL, e devo dire che una volta capito come funziona, è molto più potente di REST per un\u0026rsquo;app mobile. Chiedi esattamente i dati che ti servono, niente di più.\nLe feature che mi hanno fatto impazzire # Il Business Card Scanner # Questa è stata una delle feature più divertenti da implementare. L\u0026rsquo;idea: inquadri un biglietto da visita con la fotocamera, l\u0026rsquo;app legge il testo con MLKit, e crea automaticamente il contatto nel CRM.\nLa realtà? I biglietti da visita sono un incubo. Font creativi, layout non standard, informazioni sparse in modo apparentemente casuale. Ho dovuto scrivere un parser personalizzato (BusinessCardParser) che cerca di capire cosa è un nome, cosa è un cognome, cosa è un\u0026rsquo;email, e cosa è un numero di telefono. Funziona nel 90% dei casi. Per quel 10% restante\u0026hellip; beh, c\u0026rsquo;è sempre l\u0026rsquo;inserimento manuale.\nSlide-to-Execute per i Workflow # Questa è la feature di cui sono più orgoglioso dal punto di vista UI. Quando esegui un workflow manuale di Twenty CRM dall\u0026rsquo;app, il bottone di conferma non è un semplice \u0026ldquo;Tap\u0026rdquo;. È uno slider stile iOS che devi trascinare da sinistra a destra.\nIl perchè è semplice: i workflow possono fare cose importanti (inviare email, aggiornare record, triggerare webhook). Non vuoi eseguirli per sbaglio perchè hai toccato il telefono con il pollice mentre lo tiravi fuori dalla tasca.\nL\u0026rsquo;implementazione include:\nSoglia di attivazione all'85% del trascinamento Feedback aptico progressivo al 25%, 50%, 75% Animazione shake se qualcosa va storto Anti-fat-finger threshold per evitare attivazioni accidentali Le Note Vocali # In una riunione non puoi metterti a scrivere appunti sul telefono senza sembrare maleducato. Ma puoi registrare una nota vocale dopo. Ho integrato speech_to_text per la trascrizione automatica e la salvo come nota nel CRM. Veloce, pratico, e non devi nemmeno guardare lo schermo.\nI problemi che nessuno ti racconta (parte 2) # Il TwentyConnector da 52KB — Sì, lo so. È un file enorme. Più di 50 mila byte di query GraphQL, mutation, e logica di parsing. Ogni volta che lo apro, l\u0026rsquo;IDE ci mette un secondo di troppo. Il refactoring è nella mia lista da un po\u0026rsquo;, ma come si dice\u0026hellip; \u0026ldquo;if it ain\u0026rsquo;t broke, don\u0026rsquo;t fix it\u0026rdquo;. E funziona. Malissimo come code quality, benissimo come funzionalità.\nL\u0026rsquo;autenticazione a due fattori — Implementare il flusso 2FA con OTP è stato\u0026hellip; un\u0026rsquo;avventura. Twenty CRM supporta TOTP, e l\u0026rsquo;app deve gestire il caso in cui l\u0026rsquo;utente ha attivato la 2FA. Ho dovuto creare una schermata OTP dedicata che si inserisce nel flusso di login solo quando necessario. Il tutto con un timer che invalida il codice ogni 30 secondi. Niente di trascendentale, ma quei dettagli di UX fanno la differenza.\nIl token refresh — L\u0026rsquo;app deve gestire il caso in cui l\u0026rsquo;utente mette l\u0026rsquo;app in background per ore e poi la riapre. Il token JWT sarà scaduto, e se non gestisci il refresh correttamente l\u0026rsquo;utente vede errori dappertutto. Ho implementato un AppLifecycleHandler che ri-autentica automaticamente quando l\u0026rsquo;app torna in foreground. Sembra banale, ma il numero di app che sbagliano questa cosa è impressionante.\nL\u0026rsquo;AI come co-developer # Una cosa che mi ha sorpreso è quanto gli agenti AI abbiano contribuito al progetto. Non sto parlando di usare Copilot per l\u0026rsquo;autocomplete. Sto parlando di agenti autonomi che aprono PR, fixano bug, e ottimizzano performance.\nSe guardate la history dei commit su GitHub, troverete branch come jules/optimize-country-code-search — creati automaticamente dall\u0026rsquo;agente Jules che ho integrato nel mio workflow di sviluppo. L\u0026rsquo;agente analizza le issue, scansiona il codice, propone soluzioni, e se i test passano apre una PR.\nLe PR che ho ricevuto includono:\n🔒 Fix di sicurezza: protezione dei dati PII nei log 🧹 Pulizia eccezioni swallowed nel generatore vCard ⚡ Ottimizzazione del parsing degli URL avatar 🔧 Aggiunta autofill hints nei form di login Non male per un co-developer che non dorme mai e non chiede ferie.\nI numeri (per i curiosi) # Qualche numero sul progetto:\n85+ commit sul branch main 28+ branch di feature e fix Versione 1.0.5, build 31 30+ metodi nell\u0026rsquo;interfaccia CRMRepository Supporto iOS e Android con layout responsivo per tablet 0 dati raccolti — privacy first Come provarlo # Se volete provare TwentyMobile, ecco i link:\n📱 Google Play Store 🍎 App Store (cercate \u0026ldquo;TwentyMobile\u0026rdquo;) 💻 Codice sorgente su GitHub 🌐 Sito ufficiale L\u0026rsquo;app supporta due modalità di accesso: API Token per gli amministratori e Email/Password per gli utenti standard. C\u0026rsquo;è anche una Demo Mode per esplorare l\u0026rsquo;interfaccia senza configurare nulla.\nConsiderazioni finali # Costruire TwentyMobile è stata un\u0026rsquo;esperienza incredibile. Ho imparato un sacco su GraphQL, sul DDD applicato a Flutter, e su come gestire un progetto open source. Ma soprattutto ho imparato che il modo migliore per risolvere un problema è condividere la soluzione.\nSe avete un\u0026rsquo;istanza Twenty CRM e vi manca un\u0026rsquo;app mobile, provatela. Se siete developer Flutter e volete contribuire, il codice è lì. E se avete domande, aprite una issue su GitHub o scrivetemi.\nAlla prossima.\n","date":"1 giugno 2026","externalUrl":null,"permalink":"/it/coding/twentymobile-crm-mobile-flutter/","section":"Coding","summary":"Dietro le quinte di TwentyMobile: architettura DDD, Connector Pattern, workflow manuali con slide-to-execute, e le nottate a debuggare GraphQL.","title":"TwentyMobile: come ho costruito un CRM mobile con Flutter, DDD e un po' di follia","type":"Coding"},{"content":"","date":"15 maggio 2026","externalUrl":null,"permalink":"/it/tags/gpl/","section":"Tags","summary":"","title":"GPL","type":"tags"},{"content":" Il problema che nessuno risolveva # Vi racconto una cosa. Usavo Twenty CRM da un po\u0026rsquo; — per chi non lo conosce, è un CRM open source bellissimo, moderno, con una community attiva. Funziona benissimo da browser. Ma io sono un mobile developer. E il mio lavoro lo faccio in giro: tra un meeting e l\u0026rsquo;altro, in aeroporto, dal cliente. E ogni volta che dovevo controllare un contatto o aggiornare una nota, dovevo aprire il browser, fare login, aspettare il caricamento\u0026hellip; e se ero in metropolitana con mezzo tacchetto di segnale, buona fortuna.\nCercavo un\u0026rsquo;app mobile nativa per Twenty CRM. Non esisteva. Cercavo alternative. Niente di decente. A quel punto mi sono detto: mi sà che me la devo fare da solo.\nDa progetto personale a open source # Le prime settimane di sviluppo le ho passate in modalità classica: codice chiuso, repository privato, nessuno vede niente finchè non è pronto. Il tipico approccio dello sviluppatore che ha paura che qualcuno veda il suo codice spaghetti.\nMa poi è successo qualcosa. Stavo usando Twenty CRM, che è open source. Stavo usando Flutter, che è open source. Stavo usando Riverpod, GraphQL Flutter, Freezed\u0026hellip; tutto open source. Il mio progetto viveva letteralmente sulle spalle di decine di sviluppatori che avevano deciso di condividere il loro lavoro gratuitamente.\nE io cosa facevo? Tenevo il mio codice chiuso. Mi è sembrata un\u0026rsquo;ipocrisia.\nLa scelta della licenza: GPL-3.0 # Quando ho deciso di rendere il progetto open source, la prima domanda è stata: quale licenza? Ho valutato le opzioni:\nMIT — Troppo permissiva per i miei gusti. Qualcuno potrebbe prendere il codice, chiuderlo, e venderlo come suo. No grazie. Apache 2.0 — Simile a MIT ma con protezione brevetti. Meglio, ma ancora troppo permissiva. GPL-3.0 — Copyleft forte. Se qualcuno modifica il codice e lo distribuisce, deve rilasciare le modifiche con la stessa licenza. Questo è quello che volevo. La GPL-3.0 protegge il progetto in modo che rimanga sempre open source. Se qualcuno vuole contribuire, perfetto. Se qualcuno vuole forkare e migliorare, perfetto. Ma non può prendere il mio lavoro e chiuderlo. Mi sembra equo.\nCosa significa in pratica per TwentyMobile # TwentyMobile è un client mobile per Twenty CRM costruito con Flutter. Quello che fa è semplice da spiegare ma non banale da implementare:\nGestione contatti e aziende con ricerca veloce, dettagli completi, e aggiornamenti ottimistici Note e note vocali per catturare informazioni al volo Task con notifiche per non dimenticare mai un follow-up Scanner biglietti da visita con OCR integrato Workflow manuali per eseguire automazioni direttamente dal telefono Il tutto si collega alla vostra istanza self-hosted di Twenty CRM. Zero dati raccolti, zero cloud proprietario, tutto viaggia direttamente tra il vostro telefono e il vostro server.\nLe paure di rendere il codice pubblico # Ve lo dico onestamente: prima di premere quel pulsante \u0026ldquo;Make public\u0026rdquo; su GitHub, ho avuto un momento di panico. I pensieri tipici:\n\u0026ldquo;Il codice non è perfetto\u0026rdquo; — E quando mai lo è? Ho rilasciato con delle cose che mi fanno ancora storcere il naso. Il TwentyConnector è un file da 52KB. Cinquantaduemila byte di codice GraphQL in un singolo file. Lo so, è troppo grosso. Ma funziona. E il refactoring arriverà. Nel frattempo, il mondo può vedere come ho risolto certi problemi, e magari qualcuno trova un modo migliore.\n\u0026ldquo;Qualcuno copierà tutto\u0026rdquo; — Con la GPL-3.0, può copiare. Ma deve mantenere la licenza e rilasciare le modifiche. E sinceramente, se qualcuno prende il mio codice e lo migliora, tanto meglio per tutti.\n\u0026ldquo;Chi contribuirà mai?\u0026rdquo; — Questa è stata la sorpresa più grande. Dall\u0026rsquo;integrazione con agenti AI come Jules, ho già ricevuto PR automatiche per fix di sicurezza, ottimizzazioni di performance, e pulizia del codice. Non è la community tradizionale fatta di persone, ma è una community che funziona.\nL\u0026rsquo;effetto collaterale che non mi aspettavo # Rendere il progetto open source mi ha costretto a scrivere codice migliore. Non perchè qualcuno lo stesse effettivamente leggendo — almeno non subito — ma perchè sapevo che qualcuno poteva leggerlo.\nHo iniziato a commentare di più. A strutturare meglio i commit. A scrivere un README decente. A documentare l\u0026rsquo;architettura. Robe che avrei dovuto fare comunque, ma che la pigrizia dello sviluppatore solitario tende a far saltare.\nE poi c\u0026rsquo;è il vantaggio del portfolio. Quando qualcuno mi chiede \u0026ldquo;ma tu cosa sai fare?\u0026rdquo;, gli mando il link a GitHub. Parlano i fatti, non il curriculum.\nConsigli per chi ci sta pensando # Se avete un progetto personale e state valutando se renderlo open source, ecco cosa vi dico dalla mia esperienza:\nNon aspettate la perfezione. Il codice perfetto non esiste. Rilasciate quando funziona, migliorate dopo. La community (umana o AI) vi aiuterà.\nScegliete la licenza con cura. Non è un dettaglio burocratico. La licenza definisce cosa gli altri possono fare con il vostro lavoro. Informatevi prima di scegliere.\nScrivete un buon README. È la prima cosa che le persone vedono. Se il README è scarso, nessuno guarderà il codice.\nPreparatevi alle issue strane. Su qualsiasi progetto open source prima o poi arriverà qualcuno che apre una issue tipo \u0026ldquo;non funziona\u0026rdquo; senza dare nessun contesto. Fa parte del gioco.\nUsate CI/CD da subito. Test automatici, build automatiche, linting. Se il progetto è open source, queste cose non sono opzionali.\nE adesso? # TwentyMobile è su GitHub, su Google Play e sull\u0026rsquo;App Store. Il progetto è attivo, le feature continuano ad arrivare, e il codice è lì per chiunque voglia dare un\u0026rsquo;occhiata, contribuire, o semplicemente imparare qualcosa.\nSe volete saperne di più sul progetto, passate dal sito ufficiale. E se vi va di contribuire, le PR sono aperte. Anche quelle degli agenti AI sono benvenute, a quanto pare.\nLa prossima volta vi racconto nel dettaglio come è costruita l\u0026rsquo;app dal punto di vista tecnico. Spoiler: Flutter, DDD, Connector Pattern, e un bel po\u0026rsquo; di GraphQL.\n","date":"15 maggio 2026","externalUrl":null,"permalink":"/it/coding/perche-ho-reso-twentymobile-open-source/","section":"Coding","summary":"La storia di come un progetto nato per risolvere un mio problema è diventato open source. Spoiler: non è stato facile decidere.","title":"Perché ho reso TwentyMobile open source (e perché dovresti farlo anche tu)","type":"Coding"},{"content":"","date":"19 febbraio 2026","externalUrl":null,"permalink":"/it/tags/ai/","section":"Tags","summary":"","title":"AI","type":"tags"},{"content":" Tutto è iniziato con una lamentela # Vi racconto una cosa. Circa un anno fa stavo guardando le recensioni di Send to Kindle — la mia app per inviare documenti al Kindle — e mi sono imbattuto in una recensione che diceva più o meno: \u0026ldquo;L\u0026rsquo;app funziona ma il PDF convertito fa schifo, è illeggibile\u0026rdquo;. Una stella, ovviamente.\nOra, la conversione dei PDF è sempre stata una rogna. Chi lavora con i documenti lo sa: un PDF può contenere di tutto. Testo, immagini, tabelle, layout assurdi. E convertirlo in un formato leggibile su Kindle senza perdere la formattazione è un\u0026rsquo;impresa. Per anni ho usato Calibre lato server per fare il lavoro sporco, e funzionava\u0026hellip; più o meno.\nMa quella recensione mi ha fatto pensare. Mi sà che è arrivato il momento di fare un salto di qualità.\nL\u0026rsquo;illuminazione: l\u0026rsquo;AI non è solo per le chat # Parliamoci chiaro: quando la gente sente \u0026ldquo;intelligenza artificiale\u0026rdquo; pensa subito a ChatGPT, ai chatbot, a quelle cose che ti scrivono le email. Ma l\u0026rsquo;AI è molto di più, soprattutto per chi sviluppa app mobile.\nIo l\u0026rsquo;ho capito lavorando su Schedine Smart, la mia app per l\u0026rsquo;invio delle schedine alloggiati. Lì avevo già integrato Google MLKit per leggere i documenti d\u0026rsquo;identità e Gemini Flash come fallback per i casi più disperati. E funzionava da dio. Allora mi sono detto: se l\u0026rsquo;AI riesce a leggere una carta d\u0026rsquo;identità cartacea del 1987, mezza stropicciata e con la foto sbiadita, perchè non può aiutarmi anche con i PDF?\nCosa ho fatto in pratica # Ho iniziato ad integrare l\u0026rsquo;AI in punti strategici delle mie app Flutter, senza riscrivere tutto da zero. Questo è il punto importante: non serve buttare via il codice esistente. L\u0026rsquo;AI si innesta come un layer aggiuntivo.\n1. Riconoscimento intelligente dei documenti # In Schedine Smart ho costruito un sistema a cascata:\nPrima prova: MLKit on-device, veloce e privato. Funziona benissimo per passaporti e CIE. Seconda prova: algoritmo proprietario per le vecchie carte d\u0026rsquo;identità italiane (quelle che manco tua nonna riesce a leggere). Terza prova: Gemini Flash via API, solo con consenso dell\u0026rsquo;utente. Il bello di Flutter è che gestire questa cascata è naturale. Un try-catch ben strutturato, un po\u0026rsquo; di async/await, e il gioco è fatto. L\u0026rsquo;utente non si accorge di nulla: scatta la foto e i dati appaiono.\n2. Conversione PDF più intelligente # In Send to Kindle ho aggiunto un layer di analisi pre-conversione. Prima di mandare il PDF al container Calibre, l\u0026rsquo;app ora analizza il documento per capire se è un PDF scansionato (praticamente un\u0026rsquo;immagine), un PDF con testo reale, o un mix dei due. Questa analisi determina che tipo di conversione applicare.\nPer i PDF scansionati ho integrato l\u0026rsquo;OCR con supporto AI, che riconosce il testo nelle immagini. Il risultato? Conversioni che prima erano illeggibili adesso escono pulite. Quella recensione da una stella magari adesso ne varrebbe almeno tre. Forse.\n3. Firebase come collante # Una cosa che ho imparato in questi anni è che Firebase è il miglior amico dello sviluppatore indie. In entrambe le app uso:\nFirebase Remote Config per gestire feature flag senza rilasciare aggiornamenti Cloud Functions per il backend leggero Firebase Storage per gestire i file Pub/Sub per comunicare con i container di conversione L\u0026rsquo;integrazione con Flutter è impeccabile grazie ai plugin FlutterFire. Se non li conoscete ancora, vi consiglio di provarli.\nSe vi interessa vedere come uso questi strumenti nei miei progetti, passate da luciosoft.it.\nI problemi che nessuno ti racconta # Però non è tutto rose e fiori, eh. Vi racconto qualche disavventura:\nLa memoria che esplode — Quando ho deployato il container di conversione PDF su Cloud Run, i file grossi facevano crashare tutto. Ho dovuto passare da 2GB a 4GB di RAM, e per i file davvero enormi servono 8GB. A un certo punto ho pensato: mi sà che sto facendo girare una centrale nucleare per convertire un PDF. Ma funziona.\nIl bug del -1017 — Firebase Storage ha un errore misterioso, il codice -1017, che appare quando carichi file scaricati da Google Drive. Ho perso due giorni a debuggare prima di capire che il problema era nel modo in cui iOS gestisce i file temporanei. La soluzione? Usare putData invece di putFile. Due righe di codice, due giorni di lavoro. Classico.\nLe carte d\u0026rsquo;identità del nonno — Il mio algoritmo di riconoscimento per le vecchie CI cartacee funziona bene nel 90% dei casi. Ma quel 10% restante\u0026hellip; gente con documenti piegati in quattro, tenuti nel portafoglio per vent\u0026rsquo;anni, con la foto che ormai sembra un quadro impressionista. Per quelli c\u0026rsquo;è Gemini Flash, che a volte riesce a tirar fuori i dati anche da quelle situazioni disperate.\nConsigli per chi vuole iniziare # Se sviluppate app Flutter e volete integrare l\u0026rsquo;AI, ecco cosa vi suggerisco dalla mia esperienza:\nPartite dal problema, non dalla tecnologia. Non mettete l\u0026rsquo;AI perchè fa figo. Mettetela dove risolve un problema reale degli utenti.\nUsate un approccio a cascata. L\u0026rsquo;AI non è infallibile. Avere un fallback (o due, o tre) è fondamentale. L\u0026rsquo;on-device prima, il cloud dopo.\nLa privacy prima di tutto. Soprattutto con dati sensibili come documenti d\u0026rsquo;identità. I dati devono viaggiare il meno possibile.\nFirebase Remote Config è vostro amico. Potete attivare e disattivare feature AI senza rilasciare un aggiornamento. Credete a me, ne avrete bisogno.\nTestate con file reali. I test con file perfetti vanno sempre bene. Ma poi arriva l\u0026rsquo;utente con il PDF da 50MB generato da uno scanner del 2003 e tutto esplode.\nE adesso? # Sto lavorando su nuove integrazioni. L\u0026rsquo;idea è usare modelli AI più leggeri direttamente on-device per certi task, senza dover passare dal cloud. Flutter con i suoi plugin e la community che cresce ogni giorno rende tutto questo possibile.\nSe volete provare le mie app:\nSend to Kindle — per inviare articoli e documenti al vostro Kindle Schedine Smart — per le schedine alloggiati senza impazzire E se vi va, passate da luciosoft.it per vedere cos\u0026rsquo;altro combino. Spoiler: altre app, altri esperimenti, e probabilmente altri bug da sistemare.\n","date":"19 febbraio 2026","externalUrl":null,"permalink":"/it/coding/flutter_e_ai_come_ho_rivoluzionato_le_mie_app/","section":"Coding","summary":"Dal riconoscimento documenti alla conversione intelligente dei PDF: come l\u0026rsquo;AI ha trasformato le mie app Flutter senza stravolgere il codice.","title":"Flutter e AI: come ho rivoluzionato le mie app senza riscriverle da zero","type":"Coding"},{"content":"","date":"19 febbraio 2026","externalUrl":null,"permalink":"/it/tags/geminiai/","section":"Tags","summary":"","title":"GeminiAI","type":"tags"},{"content":"","date":"19 febbraio 2026","externalUrl":null,"permalink":"/it/tags/sendtokindle/","section":"Tags","summary":"","title":"SendToKindle","type":"tags"},{"content":"","date":"19 febbraio 2026","externalUrl":null,"permalink":"/it/tags/sendtopolice/","section":"Tags","summary":"","title":"SendToPolice","type":"tags"},{"content":" La frustrazione che mi ha portato qui # Vi racconto una cosa. Quando ero developer mid-level, passavo un sacco di tempo a fare triage delle issue. Analizzare il contesto, capire quali file erano coinvolti, valutare se era una cosa da 5 minuti o da 5 giorni. Tempo perso, pensavo sempre. Ma vabbè, fa parte del lavoro.\nPoi sono diventato senior. E il triage è aumentato. Perchè non solo dovevo farlo, ma dovevo anche spiegarlo ai junior. Fantastico.\nAdesso faccio l\u0026rsquo;architetto. E indovinate? Il triage è ancora lì. Solo che adesso devo anche assicurarmi che le soluzioni proposte siano coerenti con l\u0026rsquo;architettura generale del sistema. Insomma, mi sà che questo problema mi segue.\nPerò in questi anni è successa una cosa interessante: gli agenti AI sono diventati davvero utilizzabili. E io ho iniziato a chiedermi: ma non posso delegare almeno una parte di questo lavoro?\nJules Orchestrator # Ho costruito un\u0026rsquo;architettura che ho chiamato Jules Orchestrator. Il nome viene dall\u0026rsquo;agente AI di Google che uso sotto il cofano: Jules.\nL\u0026rsquo;idea è semplice: quando arriva una issue su GitHub, un webhook attiva l\u0026rsquo;orchestratore che analizza il contesto, passa tutto all\u0026rsquo;AI, e se l\u0026rsquo;AI propone una soluzione sensata la implementa e apre una PR. Se i test passano, la PR è pronta per la review.\nEcco lo schema:\ngraph TD A[User Report / Issue] --\u003e|Webhook| B(Ingestion) B --\u003e|Trigger| C{Analysis Module} C --\u003e|Scan Codebase| D[Context Extraction] D --\u003e|Prompts + Context| E[Jules Agent] E --\u003e|Reasoning| F[Proposed Solution] F --\u003e|Code Generation| G[Implementation] G --\u003e|Run Tests| H{Verification} H --\u003e|Pass| I[Create Pull Request] H --\u003e|Fail| E I --\u003e|Review| J[Developer Review] J --\u003e|Approve \u0026 Merge| K[CI/CD Pipeline] K --\u003e|Automatic Deploy| L[Production] L --\u003e|Feedback Loop| A Come funziona in pratica # Ingestion - Arriva una issue o un bug report, il webhook parte. Analysis - Il modulo devtriage legge la segnalazione e scansiona la codebase per capire il contesto. Agent Activation - Jules riceve tutto e inizia a ragionare. La cosa interessante è che riesce a capire le dipendenze tra i file e valutare l\u0026rsquo;impatto delle modifiche. Implementation - Se trova una soluzione, genera il codice. Verification - I test girano automaticamente. Pull Request - Se i test passano, PR aperta. Altrimenti ritenta. Cosa ho imparato # Questa roba non sostituisce il developer, almeno non ancora. Ma mi ha liberato tempo. I bug banali, quelli che sai già come risolvere ma che ti rubano mezz\u0026rsquo;ora a testa, adesso li gestisce l\u0026rsquo;AI. Io faccio review delle PR e mi concentro sui problemi architetturali, che sono quelli che effettivamente richiedono la mia esperienza.\nL\u0026rsquo;altra cosa che ho notato è che l\u0026rsquo;AI può gestire anche manutenzione ordinaria: aggiornamenti di librerie, piccoli refactoring, fix di sicurezza minori. Roba che prima accumulavo nel backlog per mesi.\nConsiderazioni finali # Siamo solo all\u0026rsquo;inizio di questa storia. Jules Orchestrator funziona bene per Luciosoft, ma ogni progetto è diverso. Se vi interessa sperimentare, il codice è su GitHub.\nAh, e se state pensando \u0026ldquo;ma così i developer diventano inutili\u0026rdquo;: no. Diventano più efficienti. Che è diverso. Almeno finchè qualcuno deve ancora capire cosa costruire e perchè.\n","date":"3 febbraio 2026","externalUrl":null,"permalink":"/it/coding/app-sviluppate-e-mantenute-dall-ai/","section":"Coding","summary":"Come ho delegato il triage dei bug all\u0026rsquo;AI e ho iniziato a dormire sonni tranquilli.","title":"App sviluppate e mantenute dall'AI: dove stiamo arrivando","type":"Coding"},{"content":"","date":"3 febbraio 2026","externalUrl":null,"permalink":"/it/tags/automation/","section":"Tags","summary":"","title":"Automation","type":"tags"},{"content":"","date":"3 febbraio 2026","externalUrl":null,"permalink":"/it/tags/devops/","section":"Tags","summary":"","title":"DevOps","type":"tags"},{"content":"","date":"3 febbraio 2026","externalUrl":null,"permalink":"/it/tags/devtriage/","section":"Tags","summary":"","title":"DevTriage","type":"tags"},{"content":"","date":"3 febbraio 2026","externalUrl":null,"permalink":"/it/tags/jules/","section":"Tags","summary":"","title":"Jules","type":"tags"},{"content":"","date":"22 gennaio 2026","externalUrl":null,"permalink":"/it/tags/mlkit/","section":"Tags","summary":"","title":"MLKit","type":"tags"},{"content":"","date":"22 gennaio 2026","externalUrl":null,"permalink":"/it/tags/ocr/","section":"Tags","summary":"","title":"OCR","type":"tags"},{"content":" Come è nato tutto # Qualche anno fa mia madre ha iniziato a gestire un piccolo B\u0026amp;B. Io, da bravo figlio informatico, sono diventato il suo supporto tecnico non ufficiale. Vabbè, sapete come funziona. Tra le tante cose che mi ha chiesto di \u0026ldquo;sistemare\u0026rdquo;, c\u0026rsquo;era questa procedura delle schedine alloggiati. Per chi non lo sapesse, ogni struttura ricettiva in Italia deve comunicare i dati degli ospiti alla Polizia di Stato entro 24 ore dall\u0026rsquo;arrivo.\nVi giuro, la prima volta che ho visto mia madre ricopiare a mano i dati dal passaporto al portale Alloggiati Web, mi sà che mi è venuto un colpo. Pensavo: siamo nel 2026 e ancora facciamo così? Ci dev\u0026rsquo;essere un modo migliore.\nIl problema tecnico # Il portale Alloggiati Web funziona, per carità, ma l\u0026rsquo;inserimento manuale è lento e soggetto a errori. Soprattutto quando hai ospiti stranieri con nomi complicati o carte d\u0026rsquo;identità italiane di quelle vecchie, quelle cartacee mezze rovinate che neanche un esperto grafologico riuscirebbe a decifrare.\nDa architetto software ormai, non ho potuto resistere: ho iniziato a ragionare su come automatizzare il processo. L\u0026rsquo;idea di base era semplice: scansioni il documento, l\u0026rsquo;app estrae i dati, li formatta e li invia al portale. Semplice a dirsi, un po\u0026rsquo; meno a farsi. Da architetto software ormai, non ho potuto resistere: ho iniziato a ragionare su come automatizzare il processo. L\u0026rsquo;idea di base era semplice: scansioni il documento, l\u0026rsquo;app estrae i dati, li formatta e li invia al portale. Semplice a dirsi, un po\u0026rsquo; meno a farsi.\nSotto il cofano # Ho implementato un sistema di riconoscimento a più livelli. Non è una scelta casuale, è nata dalla pratica:\nGoogle MLKit (On-Device) - Per i passaporti e le carte di identità elettroniche funziona benissimo. Legge le MRZ (quelle strisce di caratteri in fondo ai documenti) in millisecondi, tutto on-device quindi niente dati che viaggiano su server esterni. Questa era una priorità assoluta per me.\nAlgoritmo locale proprietario - Ma MLKit da solo non basta. Ho dovuto sviluppare un algoritmo specifico per le vecchie carte d\u0026rsquo;identità italiane. Quelle cose le conosco bene perchè le ho viste passare tutte da mia madre. Riflessi, pieghe, scrittura sbiadita\u0026hellip; ho dovuto gestire tutto.\nGemini Flash come fallback - E quando proprio tutto fallisce? Ho integrato Gemini Flash come ultima risorsa. Solo se l\u0026rsquo;utente acconsente, l\u0026rsquo;immagine viene analizzata dall\u0026rsquo;AI di Google che riesce a capire anche i casi più disperati. Credo sia un buon compromesso tra automazione e privacy.\nUna nota sulla privacy # Ci tengo a precisare una cosa: i dati non passano mai da server miei. L\u0026rsquo;app legge il documento, estrae i dati localmente, e li manda direttamente al portale della Polizia. Niente cloud intermedi, niente database. Ho fatto questa scelta fin dall\u0026rsquo;inizio perchè mi sembrava l\u0026rsquo;unica cosa sensata da fare con dati così sensibili.\nProvalo # L\u0026rsquo;app si chiama Schedine Smart ed è gratuita. L\u0026rsquo;ho fatta prima di tutto per mia madre, poi ho pensato che potesse essere utile anche ad altri. Se gestite una struttura ricettiva e vi siete stancati di ricopiare dati a mano, fatemi sapere cosa ne pensate.\nScarica per Android\nLa versione iOS è in lavorazione, arriverà a breve.\n","date":"22 gennaio 2026","externalUrl":null,"permalink":"/it/alloggiati/invio-schedine-alloggiati/","section":"Alloggiati","summary":"La storia di come una frustrazione personale è diventata un\u0026rsquo;app. OCR, MLKit e un pizzico di AI per risolvere il problema delle schedine.","title":"Schedine Smart: finalmente le schedine alloggiati non sono più un incubo","type":"Alloggiati"},{"content":"Con questo articolo voglio spiegare come poter fare una app per il proprio canale personale youtube in 10 minuti. Io ho sviluppato in questo modo l\u0026rsquo;app Italiano con Eli, creata per il canale Italiano con Eli. Mentre stavo sviluppato l’app ho deciso di generalizzare la soluzione in modo da poter essere utilizzata da chiunque per recuperare qualsiasi video dato un determinato link del corrispettivo canale Youtube. L’applicazione completa e funzionante è disponibile al seguente link github. Potete fare un Fork o un Clone, usarla così com’è oppure modificandola come meglio vi pare. Se vi piace potete anche mettere un like.\nConfigurazione necessaria # Unica cosa da fare per poterla utilizzare è configurare la connessione alle API di Youtube in modo da poter utilizzare la ricerca dei vostri video del canale. Per una corretta configurazione potete seguire i seguenti step:\nAccedere al Google Api Console con il vostro account Google se non lo avete, create un nuovo account.\nAndare sotto progetti e cliccate su NUOVO PROGETTO, Immetti il nome e aspetta che google crei il progetto.\nClicca sul link delle Google API nella libreria delle API e cerca oppure seleziona le api youtube come evidenziato nella foto di seguito\nClicca sul link delle Google API nella libreria delle API e cerca oppure seleziona le api youtube come evidenziato nella foto di seguito\ndopo clicca abilità e vai sotto la voce di menu credenziali Seleziona Youtube Api v3, seleziona dati pubblici e conferma\nAdesso Google creerà la tua chiave di accesso\nl\u0026rsquo;api key recuperata al punto 6 dovrà essere inserita all’interno dell’applicazione e sostituita nella pagina main.dart al posto della key come segue:\nstatic String key = \u0026#34;\u0026#34;; // ** ENTER YOUTUBE API KEY HERE ** static String channelid = \u0026#34;UC_8mNVpafplqHNy85No4O2g\u0026#34;; // ** ENTER YOUTUBE CHANNEL ID HERE ** il channel id deve fare riferimento al vostro canale youtube. Lo potete semplicemente estrarre dal link del vostro canale youtube, prendendo la parte finale del link:\nLa configurazione è finita, avete appena creato la vostra nuova App per il vostro canale Youtube Yehaa!\nQualche cenno al codice # Per agevolare lo sviluppo dell’applicazione ho usato i seguenti due plugin che potete trovate nella pagina dei plugin per flutter flutter packages\ni plugin utilizzati sono i seguenti:\nyoutube player Flutter\nyoutube Api\nil codice dell’applicazione è molto semplice e ho usato una struttura di suddivisione pagine\nabbastanza chiara:\nModel contiene il modello dei dati recuperati dalle youtube Api. Adesso la classe fa anche qualcosa in più, c’è un metodo che recupera i dati da youtube e li inserisce in una lista di youtube data. Usa un sistema che fa il recupero dei dati solo se non sono presenti in cache usando la flutter shared preference. Questo meccanismo è molto utile in quanto le Api di Google sono a pagamento in funzione dell’utilizzo. Utilizzando la cache risparmierete drasticamente in chiamate. se non avete mai usato la cache in flutter potete leggere quest\u0026rsquo;altro mio articolo: flutter shared preferences in profondità.\nPages contiene le pagine dell’APP\nhome page\ncategory page\npagina di play video\nUI contiene un widget per rappresentare la lista dei video. L’ho creato a parte come widget per avere a disposizione una view da poter utilizzare sia nella pagina home che category. In questo modo, potrei usarlo anche in altre pagine in futuro.\nMain.dart altro non fa che inizializzare la classe del model, caricare i dati di youtube e passarli alle rispettive pagine.\nUtilizzando questa struttura il codice è molto semplice anche da manutenere ad esempio la pagina home contiene solo il seguente codice:\nimport \u0026#39;package:flutter/material.dart\u0026#39;; import \u0026#39;package:youtubeapichannel/Model/YoutubeData.dart\u0026#39;; import \u0026#39;package:youtubeapichannel/UI/YoutubeVideoList.dart\u0026#39;; YoutubeData youtubeData; class Home extends StatefulWidget { Home(YoutubeData inyoutubeData) { youtubeData = inyoutubeData; } @override _HomeState createState() =\u0026gt; new _HomeState(); } class _HomeState extends State\u0026lt;Home\u0026gt; { callAPI() async { setState(() {print(\u0026#39;UI Updated\u0026#39;); }); } @override void initState() { super.initState(); //callAPI(); } @override Widget build(BuildContext context) { if(youtubeData!=null) return new YoutubeVideoList(youtubeData.getHomeList()); else return new Container(child:new Text(\u0026#34;problem loading data from youtube!\u0026#34;)); } } Quindi riceve semplicemente in input la classe contenente la lista dei video e richiama il plugin YoutubeVideoList che sta sotto la UI per rappresentare i video sotto forma di lista di video youtube.\nUnica pecca, è che quando l’ho realizzata non ero tanto esperto e ho deciso di passare i dati come parametro. Oggi flutter mette a disposizioni tecniche migliori per passare i dati da una view ad un altra, in effetti dovrei fare un po\u0026rsquo; di refactor, ma oggi non ne ho voglia.\n","date":"26 giugno 2020","externalUrl":null,"permalink":"/it/coding/implementa_l%D1%82%D0%B0%D1%89app_per_il_tuo_canale_youtube_con_flutter_in_10_minuti/","section":"Coding","summary":"Con questo articolo voglio spiegare come poter fare una app per il proprio canale personale youtube in 10 minuti. Io ho sviluppato in\u0026hellip;","title":"Implementa l’App per il tuo canale Youtube con Flutter in 10 minuti","type":"Coding"},{"content":"","date":"26 giugno 2020","externalUrl":null,"permalink":"/it/tags/plugin/","section":"Tags","summary":"","title":"plugin","type":"tags"},{"content":"","date":"26 giugno 2020","externalUrl":null,"permalink":"/it/tags/youtube/","section":"Tags","summary":"","title":"youtube","type":"tags"},{"content":"","date":"18 giugno 2020","externalUrl":null,"permalink":"/it/tags/optimization/","section":"Tags","summary":"","title":"optimization","type":"tags"},{"content":"Noi programmatori abbiamo diverse competenze e tanti pattern che utilizziamo, ma credo che la cosa che maturiamo nel tempo e ci accomuna di più è l’ottimizzazione delle risorse per risparmiare tempo. Tutti sanno che il tempo è la cosa più importante! Lo dice lo stesso modo di dire: il tempo è denaro. Il detto si basa su tempo umano. Il tempo umano deve essere utilizzato come valore aggiunto per la creatività, invenzione, innovazione costruzione e implementazione. Noi programmatori siamo fortunati, abbiamo a disposizione un\u0026rsquo;altra unità di misura del tempo, oggigiorno tendente quasi all’infinito, che possiamo e dobbiamo sfruttare al massimo e questo tempo e il tempo macchina.\nUn tempo si facevano fatigare gli schiavi poi i cavalli, i muli, i motori oggi ci siamo evoluti, culturalmente e mentalmente, Gli schiavi di quest’era sono le macchine. Per macchine intendo i nostri pc, o meglio ancora i nostri server, il cloud o i robot.\nHo deciso di scrivere questo articolo per riportare delle tecniche utili per efficientare il nostro lavoro e di conseguenza ottenere più tempo. La mia tecnica principale da utilizzare per ottenere questo risultato è:\nappuntare gli step manuali che compiamo per fare un compito\nricercare possibili soluzioni alternative\nriflettere su come possiamo automatizzare ogni singolo step\nriflettere su come possiamo automatizzare ogni singolo step\nmettere tutto assieme\nripartire dal punto 1 se il nostro tempo d’impiego non è ancora = 0 per l’attività scelta\nUn esempio # Spesso per velocizzare il nostro lavoro scriviamo degli script, questi script sono necessari altrimenti dovremmo scrivere n istruzioni di comandi. Giornalmente o mensilmente o dopo aver fatto qualcos’altro, dobbiamo eseguirli. Quindi apriamo il terminale e lanciamo lo/gli script. Per evitare di lanciare lo script a mano, che implica ricordarci, trovare lo script e lanciarlo, possiamo procedere nel seguente modo:\nse si tratta di qualcosa che va eseguito con una schedulazione fissa\npossiamo schedularlo utilizzando uno scheduler\nin linux possiamo fare un cron\noppure possiamo utilizzare atrigger per eseguire la schedulazione nel caso in cui il nostro script sia su un server a cui non abbiamo accesso alla schedulazione\nSe invece non c’è una schedulazione fissa e dobbiamo eseguirlo al bisogno\nPossiamo utilizzare una scorciatoia da tastiera. In linux ma anche su Windows e molto semplice settare una una scorciatoia. Nel mio caso usando Ubuntu basta andare sotto *impostazioni *-\u0026gt; scorciatoie da tastiera e aggiungiamo il nostro nuovo parametro che conterà il path al nostro script e la scorciatoia desiderata. Come potete vedere nella seguente immagine, io lo uso ad esempio per lanciare in debug il mio blog e successivamente per fare il deploy:\nper quanto questo possa sembrare bello e può aiutarci a renderci più efficienti, con due tasti, il gioco è fatto, si può sempre ottimizzare. Voi direte, che altro puoi fare per ottimizzare questo? e perchè? Il perchè è semplice, per poterlo eseguire ho necessariamente bisogno di avere la mia macchina a disposizione e accesa. Quindi sarebbe meglio laddove possibile utilizzare sempre un server o il cloud in modo da fare tutto da remoto in modo così da poter avere più controllo e soprattutto non dipendere da una macchina.\nOggi ci sono tanti strumenti che abbiamo a disposizione per eseguire script o creare piccole pagine web o piccole applicazioni o siti vetrina. Il piano gratuito di questi servizi, mette a disposizione tanti strumenti fra i quali:\nSpazio hosting.\nSpazio database.\nFunzioni per micro servizi\nContainer\nMacchine virtuali\ne chi più ne ha più ne metta\nC’è ne sono così tanti che a volte tendiamo a non vederli, nonostante siano sotto il nostro naso. Quelli che utilizzo io maggiormente, sono:\nFirebase\nGoogle Cloud\nAmazon AWS\nGoogle Script\nL’ultimo servizio a differenza degli altri non è un servizio cloud ma semplicemente un motore di funzioni con schedulazione o attivazione in funzione dei servizi Google. Sono molto integrate con il nostro account Google e se lo usiamo come mail principale ci darà davvero delle grandi potenzialità per automatizzare:\ninvii di mail\nsincronizzazione di dati\nediting di documenti\nchiamare API esterne\nmemorizzare dati in excel\necc ecc\u0026hellip; è brutto dire ecc ecc ma davvero, l’elenco sarebbe troppo lungo, vi permette di automatizzare tutto ciò che è Google.\nGli altri tre sono i primi tre migliori provider Cloud. Per cominciare io consiglio di usare Firebase perchè mette a disposizione davvero tanti servizi e se si tratta di primo inzio con il cloud, l’accesso con Firebase, credo sia più semplice e con una linea di apprendimento più rapida.\nConclusioni # Cerchiamo di fare più attenzione a quello che ogni facciamo senza pensare. Se ogni giorno facciamo una cosa ripetitiva, anche se ci mettiamo davvero poco a farla, teniamola in considerazione e pensiamoci. Dopo anni le cose ripetitive possono diventare tante e rischiamo di saturare tutto il nostro tempo col fare solo cose ripetitive. Vi lascio e vi saluto con una frase che mi è venuta adesso. Probabilmente non ha senso o forse è già di qualcuno ma io non lo so. Meglio creare un sistema che ci risolve un problema che risolvere il problema stesso!\n","date":"18 giugno 2020","externalUrl":null,"permalink":"/it/coding/risparmio_tempo__faccio_pi_cose/","section":"Coding","summary":"Noi programmatori abbiamo diverse competenze e tanti pattern che utilizziamo, ma credo che la cosa che maturiamo nel tempo e ci accomuna di\u0026hellip;","title":"Risparmio tempo = faccio più cose","type":"Coding"},{"content":"","date":"18 giugno 2020","externalUrl":null,"permalink":"/it/tags/script/","section":"Tags","summary":"","title":"script","type":"tags"},{"content":"","date":"18 giugno 2020","externalUrl":null,"permalink":"/it/tags/timing/","section":"Tags","summary":"","title":"timing","type":"tags"},{"content":"","date":"5 giugno 2020","externalUrl":null,"permalink":"/it/tags/cloud/","section":"Tags","summary":"","title":"Cloud","type":"tags"},{"content":"Ci sono tanti modi per poter mettere al sicuro le funzioni. Questo argomento non è chiarissimo dal primo momento in cui si utilizzano le funzioni in Cloud ed è inoltre in continuo cambiamento. Io ho deciso di implementare un mio metodo che utilizza la blasonata e più semplice autenticazione: la Basic Auth. Sicuramente non è la più sicura ma bastava al mio scopo. Unica pecca è che la funzione deve essere aggiunta e implementata in ogni funzione Cloud che andiamo a creare. In questo modo, possiamo chiamare la funzione implementata da dove vogliamo semplicemente aggiungendo come parametro della request user e password criptati nella Basic Auth.\nPer semplificare la verifica, ho creato, una funzione che inserisco all’interno di ogni Cloud Function. Questa funzione si occupa di fare il parsing dei dati della request, verificare se presente una basic auth e se presente verifica se i dati di user e password corrispondono. Di seguito il codice utilizzato:\nvar compare = require(\u0026#39;tsscmp\u0026#39;) const checkAuth = async() =\u0026gt; { // parse login and password from headers const b64auth = (req.headers.authorization || \u0026#39;\u0026#39;).split(\u0026#39; \u0026#39;)[1] || \u0026#39;\u0026#39; const strauth = new Buffer(b64auth, \u0026#39;base64\u0026#39;).toString() const splitIndex = strauth.indexOf(\u0026#39;:\u0026#39;) const splitIndex = strauth.indexOf(\u0026#39;:\u0026#39;) const login = strauth.substring(0, splitIndex) const password = strauth.substring(splitIndex + 1) //function to validate credentials using https://www.npmjs.com/package/tsscmp //Prevents timing attacks using Brad Hill\u0026#39;s Double HMAC pattern to perform secure string comparison function check (name, pass) { var valid = true // Simple method to prevent short-circut and use timing-safe compare valid = compare(name, \u0026#39;user\u0026#39;) \u0026amp;\u0026amp; valid valid = compare(pass,\u0026#39;password\u0026#39;) \u0026amp;\u0026amp; valid return valid } if (!check(login, password)) { res.statusCode = 401 res.setHeader(\u0026#39;WWW-Authenticate\u0026#39;, \u0026#39;Basic realm=\u0026#34;example\u0026#34;\u0026#39;) res.end(\u0026#39;Access denied\u0026#39;) } } Successivamente possiamo utilizzare la funzione all’interno del metodo chiamato della nostra Cloud Function nel seguente modo:\nexports.helloWorld = async (req, res) =\u0026gt; { await checkAuth(); let message = req.query.message || req.body.message || \u0026#39;Hello World!\u0026#39;; res.status(200).send(message); }; Ed il gioco è fatto, le nostre funzioni adesso sono al sicuro. Mica tanto! ma è un inizio. Tanto alla fine se dovessero superare la nostra autenticazione, non sarebbe un grosso problema. In questa funzione restituiamo solo Hello World!\nCome facciamo invece a richiamare la nostra funzione con Flutter? Dobbiamo semplicemente creare la Basic Auth con user e password e aggiungerla alla request come segue:\nvar basicAuth = \u0026#39;Basic \u0026#39;+base64Encode(utf8.encode(user:password\u0026#39;)); http.Response response = await http.get(apiUrl, headers: \u0026lt;String, String\u0026gt;{\u0026#39;authorization\u0026#39;: basicAuth}); print(response.statusCode); //200 print(response.body ); //Hello world! Questo metodo non è uno dei migliori però è molto rapido implementarlo e inoltre ci dà un vantaggio perché può essere utilizzato allo stesso modo per tutti i provider cloud.\nInfine, possiamo richiamarlo dappertutto utilizzando qualsiasi linguaggio, e non costringe a doversi portare dietro chiavi json che potrebbero essere esposte.\nL\u0026rsquo;unico problema che ho avuto è stato quello di avere nel codice scolpiti user e password che non trovavo gradevoli. Ho risolto questo problema mettendo questi parametri all\u0026rsquo;interno delle configurazioni di firebase. Se siete interessati potete leggere questo articolo Flutter 2 plugin indispensabili dalle grandi potenzialità\n","date":"5 giugno 2020","externalUrl":null,"permalink":"/it/coding/metti_al_sicuro_la_tua_funzione_cloud_con_basic_auth/","section":"Coding","summary":"Ci sono tanti modi per poter mettere al sicuro le funzioni. Questo argomento non è chiarissimo dal primo momento in cui si utilizzano le\u0026hellip;","title":"Metti al sicuro la tua funzione Cloud con Basic Auth","type":"Coding"},{"content":"","date":"5 giugno 2020","externalUrl":null,"permalink":"/it/tags/secure/","section":"Tags","summary":"","title":"Secure","type":"tags"},{"content":"","date":"1 giugno 2020","externalUrl":null,"permalink":"/it/tags/firebase/","section":"Tags","summary":"","title":"Firebase","type":"tags"},{"content":" # Nell’articolo shared preferences in depth, ho spiegato come utilizzare la shared preferences in Flutter. In questo articolo voglio invece mostrarvi una classe che ho ideato per semplificare l’utilizzo. Ho creato questa classe per l’esigenza di dover memorizzare i dati degli utenti. Ad esempio l’ho usata in Send to Kindle per memorizzare una lista di mail. L’ho usata anche per memorizzare la lista dei token e dati d’acquisto dell’utente.\nIn generale questa struttura può essere utilizzata laddove serve lavorare con una lista di stringhe. Nell’articolo precedente, ho già mostrato come fare a memorizzare una lista di stringhe in local cache. Questa classe però rende l’utilizzo ancora più semplici e aggiunge dei metodi che ci permettono di lavorare in maniera più rapida.\nCome prima cosa, ho creato il metodo per salvare una lista il local cache nel seguente modo:\nclass CashedUserData { static Future\u0026lt;void\u0026gt; _writes = Future.value(); //add list by key reference in local cache static Future\u0026lt;void\u0026gt; addlist(String kPrefKey, List\u0026lt;String\u0026gt; stringList) async{ _writes = _writes.then((void _) =\u0026gt; _doAddList(kPrefKey,stringList)); return _writes; } } static Future\u0026lt;void\u0026gt; _doAddList(String kPrefKey, List\u0026lt;String\u0026gt; list) async { List\u0026lt;String\u0026gt; cached = await load(kPrefKey); cached.addAll(list); await (await SharedPreferences.getInstance()).setStringList(kPrefKey, cached); } Successivamente ho creato un altro metodo per recuperare la lista, inoltre ho messo qui i controlli del caso se empty o null:\nstatic Future\u0026lt;List\u0026lt;String\u0026gt;\u0026gt; load(String kPrefKey) async { return (await SharedPreferences.getInstance()).getStringList(kPrefKey) ?? []; } Man mano che la usavo ho avuto la necessità di dover aggiungere altri metodi. Metodi per:\nCancellare la lista.\nInserire una stringa per volta.\nFare l\u0026rsquo;override della lista.\nVerificare se un elemento esiste.\nPrendere il primo elemento della lista.\nSalvare un elemento in top alla lista.\nIn questo modo la classe alla fine è diventata così:\nclass CashedUserData { static Future\u0026lt;void\u0026gt; _writes = Future.value(); static Future\u0026lt;void\u0026gt; overrideListData(String kPrefKey, List\u0026lt;String\u0026gt; stringList) async{ _writes = _writes.then((void _) =\u0026gt; _doOverrideListData(kPrefKey,stringList)); return _writes; } static Future\u0026lt;void\u0026gt; addlist(String kPrefKey, List\u0026lt;String\u0026gt; stringList) async{ _writes = _writes.then((void _) =\u0026gt; _doAddList(kPrefKey,stringList)); return _writes; } static Future\u0026lt;void\u0026gt; save(String kPrefKey, String id) async{ if(await CashedUserData.exist(kPrefKey, id)) return; _writes = _writes.then((void _) =\u0026gt; _doSave(kPrefKey,id)); return _writes; } static Future\u0026lt;void\u0026gt; saveAsFirst(String kPrefKey, String id) async{ List\u0026lt;String\u0026gt; actuaList = await load(kPrefKey); if(actuaList!=null \u0026amp;\u0026amp; actuaList.length == 0 ) return save(kPrefKey,id); if(actuaList.contains(id)) actuaList.remove(id); if(actuaList.length\u0026gt;1) actuaList.removeAt(0); List\u0026lt;String\u0026gt; newlist = new List(); newlist.add(id); newlist.addAll(actuaList); _writes = _writes.then((void _) =\u0026gt; _doOverrideListData(kPrefKey,newlist)); return _writes; } static Future\u0026lt;void\u0026gt; delete(String kPrefKey, String id) { _writes = _writes.then((void _) =\u0026gt; _doDelete(kPrefKey,id)); return _writes; } static Future\u0026lt;String\u0026gt; getFirst(String kPrefKey) async { List\u0026lt;String\u0026gt; dataList = (await SharedPreferences.getInstance()).getStringList(kPrefKey); return (dataList!=null \u0026amp;\u0026amp; dataList.length\u0026gt;0) ? dataList[0] : \u0026#34;\u0026#34;; } static Future\u0026lt;List\u0026lt;String\u0026gt;\u0026gt; load(String kPrefKey) async { return (await SharedPreferences.getInstance()).getStringList(kPrefKey) ?? []; } static Future\u0026lt;bool\u0026gt; exist(String kPrefKey, String id) async { List\u0026lt;String\u0026gt; userDataList = (await SharedPreferences.getInstance()).getStringList(kPrefKey) ?? []; return (userDataList!=null \u0026amp;\u0026amp; userDataList.length \u0026gt; 0) ? userDataList.contains(id) : false; } static Future\u0026lt;void\u0026gt; _doSave(String kPrefKey, String id) async { List\u0026lt;String\u0026gt; cached = await load(kPrefKey); cached.add(id); await (await SharedPreferences.getInstance()).setStringList(kPrefKey, cached); } static Future\u0026lt;void\u0026gt; _doDelete(String kPrefKey, String id) async { List\u0026lt;String\u0026gt; cached = await load(kPrefKey); cached.remove(id); await (await SharedPreferences.getInstance()).setStringList(kPrefKey, cached); } static Future\u0026lt;void\u0026gt; _doAddList(String kPrefKey, List\u0026lt;String\u0026gt; list) async { List\u0026lt;String\u0026gt; cached = await load(kPrefKey); cached.addAll(list); await (await SharedPreferences.getInstance()).setStringList(kPrefKey, cached); } static Future\u0026lt;void\u0026gt; _doOverrideListData(String kPrefKey, List\u0026lt;String\u0026gt; list) async { await (await SharedPreferences.getInstance()).setStringList(kPrefKey, list); } static update(String kPrefKey, String currentItem, String kindlemail) async{ List\u0026lt;String\u0026gt; actuaList = await load(kPrefKey); if(actuaList!=null \u0026amp;\u0026amp; actuaList.length \u0026gt; 0 ) { try{actuaList[actuaList.indexOf(currentItem)] = kindlemail;} catch (e) {} } await overrideListData(kPrefKey, actuaList); } } Facendo così ho semplificato molto e reso più semplice i punti di chiamata. Inoltre se dovesse cambiare il plugin shared preference utilizzato, c’è un unico posto dove dover intervenire.\n","date":"1 giugno 2020","externalUrl":null,"permalink":"/it/coding/flutter_classe_utilie_per_shared_preferences/","section":"Coding","summary":"In generale questa struttura può essere utilizzata laddove serve lavorare con una lista di stringhe. Nell’articolo precedente, ho già\u0026hellip;","title":"Flutter classe utilie per shared preferences","type":"Coding"},{"content":"","date":"26 maggio 2020","externalUrl":null,"permalink":"/it/tags/ads/","section":"Tags","summary":"","title":"ads","type":"tags"},{"content":"","date":"26 maggio 2020","externalUrl":null,"permalink":"/it/tags/android-app/","section":"Tags","summary":"","title":"android app","type":"tags"},{"content":"Quando abbiamo un\u0026rsquo;idea per un\u0026rsquo;App, ci sono tante domande che dobbiamo porci:\nE’ già presente sul mercato?\nPotrebbe funzionare?\nQuanto ci costa svilupparla?\nQuanto possiamo guadagnarci?\nCome facciamo a monetizzare da questa idea?\nCome facciamo a monetizzare da questa idea?\nIn questo articolo voglio parlarvi di come monetizzare. Ci sono tante modalità e tanti strumenti che ci permettono di monetizzare, voglio riportare qui la mia esperienza, i miei errori e i suggerimenti su come utilizzare al meglio questi strumenti.\nQuando ho cominciato, non avevo per niente le idee chiare. Il mio obiettivo principale non era quello di guadagnarci ma di mettere in piedi un servizio auto-sostenibile, che non avesse costi o comunque fossero molto vicini allo zero, in modo da poter permettermi di vendere il servizio ad un prezzo molto basso.\nPrimo step # La prima cosa in assoluto da fare è individuare il nostro pubblico potenziale, per farlo vi consiglio di utilizzare Google adWords oppure facebook Ads. Questi strumenti sono ottimi per capire quale potrebbe essere il nostro pubblico potenziale. Per farlo dobbiamo inserire le parole chiavi riguardo le \u0026ldquo;specialità\u0026rdquo; della nostra App, selezionare il range di età e i paesi coinvolti. Il risultato che otteniamo da questa analisi è il numero dei potenziali utilizzatori totali e il paese con più percentuale di utilizzo. Quest’analisi potrebbe aiutarci ad individuare i nostri concorrenti, se esistono, e capire il loro pubblico e cosa ci distingue.\nStrumenti di guadagno # Stabiliamo la modalità di monetizzazione. Ce ne sono davvero di svariate e dipende anche molto dal nostro tipo di business, però le principali più utilizzate e più adattabili nel mondo delle app credo possano essere le seguenti:\nPubblicità\nProdotti e Abbonamenti in app\nVendita e analisi dati\nPubblicità: # Sebbene Google, uno dei più grandi colossi web al mondo, guadagni solo o quasi con la pubblicità, quest’ultima non è secondo me un ottimo strumento da utilizzare in tutti i contesti in quanto presenta i seguenti problemi:\nnon è adeguata nei momenti iniziali\nIl guadagno è molto basso a meno che non si posseggano davvero tanti utenti\nIl prodotto deve attrarre e coinvolgere l’utente per un tempo medio lungo\nRischia di essere troppo fastidiosa e potrebbe rovinare l’esperienza utente\nLa pubblicità più semplice da implementare con Flutter guarda caso è la stessa di google, quindi Google AdMob.\nVendita di prodotti: # se decidi di mettere in vendita la tua app, hai a disposizione attraverso la Google play console diverse possibilità di vendita tra cui:\nPrezzo download App\nCi permette di stabilire un prezzo per il download dell’app. Questa è la cosa più semplice da implementare, in quanto basta impostare il prezzo dell’app all’interno della console. Una volta fatto, abbiamo terminato! a meno che non si voglia mettere un ulteriore controllo all’interno dell’app, per evitare che vengano create delle copie pirate della nostra app e non la compri più nessuno. Secondo me questa modalità di vendita è ormai superata, la gente non si fida a comprare al buio, sebbene può sempre richiedere il rimborso ;credo comunque che imporre un prezzo sin dall\u0026rsquo;inizio sia un ostacolo. Sicuramente per alcune app ha senso, spesso viene utilizzato per la versione pro dell\u0026rsquo;app.\nProdotti in App\nquesta tipologia di prodotto dà accesso all’applicazione in versione gratuita e mette a disposizione alcuni prodotti all’interno dell’app stessa. In questo caso però oltre a definire i vari prodotti, scegliere e impostare i vari prezzi, dobbiamo anche sviluppare un pezzo nella nostra app per recuperare i prodotti da google play store per poter mostrare i prodotti. Anche se sono a disposizione librerie e plugin, prevede comunque un nostro sviluppo per poterlo utilizzare.\nAbbonamenti in App\nGli abbonamenti sono molto simili ai prodotti con la differenza sostanziale che hanno una scadenza quindi hanno una validità temporale.\nDifferenze tra Prodotti e Abbonamenti # Il prodotto in App può essere utilizzato solo una volta, consumato subito, oppure potrebbe essere utilizzato per sempre, dipende dal valore che noi decidiamo di attribuirgli nella nostra app. Una volta comprato sblocca qualcosa. L’abbonamento invece ha una scadenza specifica, quindi comprende lo stesso comportamento del prodotto base ma ha una durata che può essere settimanale, mensile, trimestrale e annuale.\nQuanto davvero si guadagna dalla vendita su google play store? # Questa è una cosa che all’inizio non è nota a tutti. Come nella vita normale, quando ci sono di mezzo i soldi, tutti ci devono guadagnare. Per tutti in questo caso intendo Google e lo stato. Google mette a disposizione:\nuna vetrina\nuno store\ngestione rimborsi\ngestione prezzi\nnormalizzazione valute\ntasse in tutti i Paesi del mondo.\ne tante altre cose\nSebbene questo servizio sia per il 95% automatico, s’ha da pagare. Ma la cosa interessante e curiosa è che la percentuale che prende Google è di circa il 30% del prezzo della nostra App. la percentuale invece dovuta allo stato dipende dal Paese di riferimento dell’acquisto. Esempio: se vendiamo un’App dal costo di 2 euro, il nostro guadagno netto effettivo sarà di 1 euro circa. Invece. nel caso di Abbonamento, la percentuale spettante a Google, guarda caso cambia e scende al 15%. Ma perchè Google ci invoglia a vendere abbonamenti? Non ci vuole tanto ad arrivarci, il prodotto una volta venduto ha terminato il suo guadagno. L’abbonamento invece è per sempre.\nStabiliamo il prezzo # Non è semplice stabilire il prezzo giusto. E’ molto importante sceglierlo adeguatamente. Io ho fatto tanti errori in fase di scelta e credo che sia ancora sbagliato. Però l’errore principale che ho commesso, e credo commettano in molti, è il fatto che sottovalutiamo il prodotto che abbiamo sviluppato. Lavorandoci da tanto e conoscendolo bene, tendiamo a sottovalutare. Dalla mia esperienza ho capito che il modo giusto per definirlo è moltiplicare per 3 o per 4 il prezzo che io stesso sarei disposto a pagare. Google play console permette di inserire diversi prezzi per ogni paese, sebbene alcuni paesi siano più ricchi e più disposti a pagare per un’App, io ho deciso di mettere per tutti lo stesso prezzo, nel mio caso credo sia giusto. Anche perché si tratta di un prezzo molto basso. Inoltre l’app send to kindle è destinata ai possessori di un kindle che quindi, avendo comprato un kindle, credo possano essere disposti a pagare qualche euro per una comoda funzionalità.\nDefiniamo la strategia # Questo è il punto più complicato e dipende molto dal tipo di app o servizio che abbiamo implementato. Io per definirla in send to kindle, ho fatto questo ragionamento: Posso guadagnare solo con la pubblicità? Sebbene il mio pubblico stia crescendo e può diventare molto ampio, per adesso la risposta è no e credo lo sarà per molto. Perchè? Ho deciso di rendere l’app maledettamente veloce e quindi l’interazione utente è troppo breve. L’utente entra, invia il contenuto al kindle e ha finito. Non ha altro da fare nella mia app.\nQuindi le scelte che avrei potuto seguire erano le seguenti:\nlavorare per proporre qualcos’altro legato al contesto\nutilizzare uno strumento diverso rispetto alla pubblicità\nAlla fine ho deciso di non usare la pubblicità come guadagno principale. Ma allora, perchè l’ho usata lo stesso? Ho usato la pubblicità come elemento di fastidio e noia. Sì, avete capito bene noia, ho creato un sistema in modo che ad ogni tre invii si è costretti a guardare un video, per poter proseguire. La gente può continuare a guardare video, ma prima o poi si annoierà così tanto di guardare video pubblicitari che deciderà di valutare la rimozione della pubblicità.\nOltre alla conversione degli articoli, send to kindle converte anche pdf e diversi formati di ebook. Di recente ho deciso anche di introdurre un abbonamento per questo che consente di effettuare un numero infinito di conversioni per un anno. Ho deciso di mettere un abbonamento perché la conversione utilizza un container in cloud ed ho dei costi per il servizio cloud da pagare ogni mese. In questo modo se i miei utenti dovessero sottoscrivere l’abbonamento, riceverò qualcosa ogni anno che spero possa essere utile ai fini di pagare il servizio in cloud e guadagnarci anche qualcosa. Finchè troverete l’app nello store vuol dire che sta funzionando ;)\nConsiderazioni # Oggigiorno quasi tutti cercano di proporre un servizio e contestualmente un abbonamento. Questo perchè a lungo andare è il più profittevole. Secondo me ogni app e ogni sistema necessita delle giuste considerazioni e scelte. Credo che tutti oggi possano comprendere e sono più propensi ad acquistare un oggetto fatto e finito anziché sottoscrivere un abbonamento. L’abbonamento non è visto molto bene da tutti, inoltre va motivato bene e bisogna ragionare bene su come venderlo e far comprendere tutti i vantaggi che si ottengono. Comunque non vi fasciate troppo la testa, il prezzo non è per sempre. Google play console, permette di cambiare il prezzo in ogni momento. Se uno lavora bene e fa crescere il suo servizio/app, il valore di quest’ultima cresce quindi è giusto aumentare il prezzo e aggiungere nuove funzionalità che aprono le porte a nuovi guadagni.\n","date":"26 maggio 2020","externalUrl":null,"permalink":"/it/strategie/come_monetizzare_con_la_tua_app/","section":"Strategie","summary":"Quando abbiamo un\u0026rsquo;idea per un\u0026rsquo;App, ci sono tante domande che dobbiamo porci:  * E’ già presente sul mercato?  * Potrebbe funzionare?  *\u0026hellip;","title":"Come monetizzare con la tua app","type":"strategie"},{"content":"","date":"26 maggio 2020","externalUrl":null,"permalink":"/it/tags/gain-money/","section":"Tags","summary":"","title":"gain money","type":"tags"},{"content":"","date":"26 maggio 2020","externalUrl":null,"permalink":"/it/tags/in-app-purchase/","section":"Tags","summary":"","title":"In App Purchase","type":"tags"},{"content":"","date":"26 maggio 2020","externalUrl":null,"permalink":"/it/strategie/","section":"Strategie","summary":"","title":"Strategie","type":"strategie"},{"content":"","date":"22 maggio 2020","externalUrl":null,"permalink":"/it/tags/kindle/","section":"Tags","summary":"","title":"kindle","type":"tags"},{"content":"","date":"22 maggio 2020","externalUrl":null,"permalink":"/it/kindle/","section":"Kindle","summary":"","title":"Kindle","type":"Kindle"},{"content":"Oggi voglio raccontarvi una storia, la storia di una mia creazione e del progetto che ad oggi mi ha portato più successo e soddisfazioni.\nPartiamo dagli albori # Io sono nato e soprattutto cresciuto nell\u0026rsquo;era digitale e sono sempre stato a contatto con la tecnologia, purtroppo non ho mai avuto un ottimo rapporto invece con i libri, credo e spero di poter recuperare in futuro. Questo mio mal rapporto con i libri però, in un certo senso, mi ha portato al successo di cui sto per raccontarvi. E’ strano in effetti ma è proprio così. Tanto tempo fa, essendo frustrato dal fatto che non leggevo abbastanza, ho deciso di comprare un Kindle pensando che mi avrebbe dato nuove opportunità di lettura.\nIl Kindle in effetti mi ha dato diverse soddisfazioni, ho letto diversi libri ma il mio utilizzo principale è sempre stato quello di leggere articoli online recuperati dal web. Articoli di programmazione, tecnologia, scienza e matematica. Sì, come avete già potuto capire, non sono un letterato e men che meno un filosofo, scrivo perchè mi piace ma non credo di saperlo fare bene non avendo studiato materie adeguate.\nVabbè… mi sà che sono troppo prolisso adesso. Veniamo al dunque\u0026hellip; ! perchè vi ho raccontato questa storia? Perché il Kindle è stato il punto cardine del mio successo? Avendone apprezzato tanto le sue capacità, ho deciso di consigliarlo a molti miei amici e parenti. L’ho consigliato anche a un mio caro collega di lavoro con il quale ci siamo spesso dati suggerimenti a vicenda su come ottenere il massimo dal kindle. L’app che più utilizzavamo era un’ app per smartphone che permetteva di inviare articoli al kindle. Un giorno quest’ app smette di funzionare e sparisce dallo store in maniera misteriosa e ahimè! non se ne sa più nulla. Nello store erano presenti altre app per fare questa azione, ma non funzionavano benissimo o alcune di queste erano a pagamento. Io e il mio collega eravamo un po’ frustrati da questa cosa.\nIl mio collega # Il mio collega # Un giorno il mio collega mi dice: ma perchè non la fai tu l’app per inviare contenuti al kindle? Io ci ho pensato un attimo, non sapevo bene da dove cominciare, ma poi mi son detto: lo sai che c’è? sono programmatore, ho le basi posso farcela! E’ così è nato Send To Kindle. Oggi devo molto al mio caro collega e alla sua richiesta.\nQuando ho rilasciato la prima versione dell’app, era molto spartana, l’ho implementata per me, i miei amici/parenti e soprattutto per il mio collega, non credevo e non potevo mai immaginare che ad oggi, dopo un anno dalla sua creazione, ho raggiunto più di 70.000 installazioni in tutto il mondo e questo numero cresce giornalmente.\nCosa Abbiamo imparato? # Quest’app mi ha fatto crescere in poco tempo e mi ha fatto capire tante cose che voglio riassumere e condividere con voi:\nSe non ci provi non ci riesci A volte ci pensiamo troppo, oppure attendiamo la perfezione per poter rilasciare qualcosa. Invece, in molti casi è meglio buttarla lì e poi se funziona siamo sempre in tempo per aggiornarla ed aggiungere nuove feature.\nPiù fai e più possibilità hai di riuscita\nSe ci riesci devi correre come un matto\nAnche se hai pensato e preparato tutto ai minimi dettagli, una volta che la tua app o il tuo sito iniziano ad ingranare e si popolano di utenti, cominciano i problemi! Ed è li che devi fare il possibile in modo da perdere meno utenti possibili.\nImpossibile accontentare tutti Ogni utente ha le sue necessità e non è possibile fare un prodotto generico che accontenti tutti.\nNon seguire troppo e valuta bene le richieste degli utenti L’ho provato sulla mia pelle, gli utenti potrebbero non accontentarsi mai! Un esempio: Send To Kindle nel primo periodo inviava solo articoli. Tutte le recensioni negative dicevano che non inviava documenti/file. Allora ho implementato l’invio dei documenti che mi è costato tempo e denaro. Adesso secondo voi cosa dicono gli utenti? Alcuni sono soddisfatti ma molti altri mettono sempre una stella e dicono: non invia file superiori a 25 mb. Secondo voi, se mai aumentassi questo limite cosa diranno?\nEsegui tanti rilasci frequenti\nAnche se un giorno tutto va bene pensa sempre che il giorno dopo andrà tutto di ma*\nPresta attenziona alle risposte date ai clienti\nAggiornati sempre sulle mosse dei tuoi concorrenti\nContinua ad aggiornare ed innovare\nConsiderazioni finali # Sono conscio del fatto che Send To Kindle non sia un’invenzione fuori dal normale o un’ innovazione. In effetti, non ho inventato qualcosa di completamente nuovo; ho reso migliore, più efficiente e integrato qualcosa che c’era già con tecnologie nuove. Credo che il mio punto di forza sia il fatto di aver reso fruibile il servizio da mobile. A volte basta poco per ottenere successo, basta essere meglio dei propri concorrenti. Sicuramente però per farlo sono necessari tanti sforzi e tanto lavoro. Se siete arrivati a leggere fino a qui complimenti!!! Se non l’avete ancora fatto scaricate Send To Kindle, e inviate questo articolo o altri articoli al kindle! Assaporate una lettura più rilassante!.\n","date":"22 maggio 2020","externalUrl":null,"permalink":"/it/kindle/send_to_kindle_mobile_la_storia/","section":"Kindle","summary":"Oggi voglio raccontarvi una storia, la storia di una mia creazione e del progetto che ad oggi mi ha portato più successo e soddisfazioni.  \u0026hellip;","title":"Send To Kindle Mobile la storia","type":"Kindle"},{"content":"","date":"19 maggio 2020","externalUrl":null,"permalink":"/it/tags/chatbot/","section":"Tags","summary":"","title":"ChatBot","type":"tags"},{"content":"","date":"19 maggio 2020","externalUrl":null,"permalink":"/it/tags/dialogflow/","section":"Tags","summary":"","title":"DialogFlow","type":"tags"},{"content":"In questi giorni ho voluto sperimentare e approfondire le conoscenze in ambito di chatbot, ho fatto questa scelta perchè, in questo momento, questa tecnologia è molto utilizzata e molto in crescita.\nUn pò di teoria # I chatbot esistono da tempo, davvero da tanto tempo, risalgono ai primi anni 60/70 con ELIZA e PARRY. Questi due progetti sono nati con lo scopo di creare una conversazione simulata con una macchina. In molti casi, questi due chatbot sono riusciti ad ingannare le persono coinvolte, utilizzando però risposte molto vaghe.\nTuttavia, questi due progetti, nonostante fossero classificati come chatbot, risultavano essere molto stupidi, difatto non hanno la stessa concezione del chatbot odierno. Il software che c’era dietro ai vecchi chatbot era molto semplice, possiamo vederlo come una mappatura uno a uno ( domanda -\u0026gt; risposta). Non era presente alcuna interpretazione della domanda. La maggior parte dei Chatbot moderni invece utilizzano il linguaggio naturale che possiamo immaginare con la composizione di tre elementi principali:\nanalisi lessicale (scomposizione frase in token)\nanalisi grammaticale (associazione parti del discorso)\nanalisi grammaticale (associazione parti del discorso)\nanalisi sintattica (arrangiamento token in una struttura ad albero)\nanalisi semantica (assegnazione di un significato)\nCosì descritto sembra semplice e noi umani siamo in grado di farlo senza sapere che esistono tutti questi step. Insegnare ad una macchina l’elaborazione degli step sopra elencati è davvero difficile. In particolar modo l’ultimo punto dell’analisi semantica.\nOggigiorno I Chatbot più comuni che utilizziamo senza quasi rendercene conto sono Ok Google, Alexa, Siri, Cortona e ogni giorno ne sono presenti sempre di più e di nuovi. Gli ambiti in crescita dove vengono maggiormente utilizzati sono banche, servizio clienti e e-commerce.\nMa perchè i chatbot si chiamano con nomi propri di persona? # Non ho trovato questa risposta online però credo che la risposta possa essere semplice! Dovendo interagire con qualcosa dalle sembianze umane, quale potrebbe essere il miglior modo per interagire se non quello di attribuire un nome con cui possiamo chiamarlo? Quasi tutte le interazioni con altre persone iniziano con il nome proprio della persona, serve per richiedere la sua attenzione.\nCosa c’è dietro al cofano? # Ma cosa c’è dietro questi Chatbot? Nel caso di Ok Google, il servizio nelle retroscene è proprio DialogFlow, Questo servizio messo a disposizione di tutti, permette a tutti in modo agile di creare un un vero e proprio chatbot in pochi step e senza alcuna conoscenza di programmazione. Il concetto è molto facile, si basa sulla creazione di Intenti e risposte.\nVi spiegherò in questo articolo come utilizzare DialogFlow e come implementarlo usando Flutter. Perchè Flutter? Perchè credo sia molto in crescita al momento. Il progetto sta crescendo così tanto da essere compatibile con tante piattaforme. In particolar modo funziona in maniera nativa su Android e IOS e funziona davvero alla grande. Secondo i test fatti, ha delle prestazioni quasi pari ai linguaggi nativi (Java/Swift/c++). Nonostante sia ancora in Beta, la funzione in modalità web va alla grande e funziona anche per ambienti desktop (linux e Windows). Ma cosa manca? ah già! Tv e Smartwatch! credo però che arriverà a breve anche li il supporto, se ne comincia a parlare online!\nMi fai vedere il codice? # Non voglio entrare nel dettaglio della configurazione del progetto di dialog flow in quanto ci sono davvero tanti tutorial ben fatti. Do per scontato che abbiate installato Flutter. Se non l\u0026rsquo;avete ancora fatto, potete partire da questa guida. Dopo aver installato Flutter, visto che la sua concezione è Mobile, se volete compilare anche per web dobbiamo eseguire i seguenti comandi:\n//abilito la verisone web di flutter flutter channel master flutter upgrade flutter config --enable-web //creo e faccio il run di un nuovo progetto cd into project directory flutter create . flutter run -d chrome Una volta abilitata la versione web di flutter e creato il progetto, possiamo procedere con la modifica del file pubspec.yaml. Questo file contiene le configurazioni e dipendenze ai plugin che utilizziamo nel nostro progetto. Dobbiamo quindi aggiungere le dipendenze a DialogFlow, la versione compatibile sia per web che per mobile è la seguente:\nflutter_dialogflow: ^0.1.3 assets: - assets/yourapifile.json Dobbiamo anche aggiungere negli asset il file json scaricato da google cloud relativo al service account che ha accesso al progetto di DialogFlow. l’implementazione di dialog Flow richiede davvero poco, giusto qualche riga di codice per l\u0026rsquo;inizializzazione:\ndialogFlow.AuthGoogle authGoogle = await dialogFlow.AuthGoogle(fileJson:\u0026#34;assets/yourapifile.json\u0026#34;).build(); dialogflow = dialogFlow.Dialogflow(authGoogle: authGoogle); Infine, chiediamo a DialogFlow l’elaborazione dell’intent in modo da ricevere una risposta, con la seguente riga di codice:\ndialogFlow.AIResponse response = await dialogflow.detectIntent(query); print(response.getMessage()); Potete trovare l’intera implementazione funzionante al seguente link Github. Per poterlo utilizzare, dovrete solo aggiungere la vostra chiave Json del vostro account di servizio, che dovrete creare su google cloud e associare a DialogFlow.\nschermata del risultato finale:\n","date":"19 maggio 2020","externalUrl":null,"permalink":"/it/coding/quando_flutter_incontra_dialogflow_nasce_un_chatbot_multi_piattaforma/","section":"Coding","summary":"In questi giorni ho voluto sperimentare e approfondire le conoscenze in ambito di chatbot, ho fatto questa scelta perchè, in questo\u0026hellip;","title":"Quando Flutter incontra DialogFlow nasce un ChatBot multi piattaforma","type":"Coding"},{"content":" Prerequisiti # Questo articolo richiede una discreta conoscenza dei seguenti argomenti che potete approfondire ai seguenti link:\nFirebase Remote Config\nFlutter Shared Preferences\nCome mai vi parlo di questi due plugin che sembrerebbero non avere niente a che fare l’uno con l’altro? Con questa guida, vi illustrerò come trarre beneficio da questi due plugin e come risparmiare usando i servizi gratuiti offerti da Firebase! :)\nNell’app Italiano con Eli, creata per il canale Italiano con Eli, ho creato un progetto su Firebase, in modo da poter utilizzare il remote config e altre potenzialità che Firebase mette a disposizione. L’app si occupa di mostrare una lista video da canale youtube, se interessati potete scaricare il codice sorgente su github, potete utilizzarlo con qualsiasi canale youtube. Per rendere l’app Italiano con Eli più originale ho pensato di aggiungere ai video delle domande sugli argomenti trattati nei video. Avevo quindi bisogno di un posto dove salvare i dati delle domande. Con Firebase, la cosa più logica e anche più diretta sarebbe quella di usare Realtime Database oppure Firestore.\nIo ho pensato di utilizzare remote config! Sì, avete capito bene! Remote config! Il primo pensiero che vi sta saltando in mente in questo momento sarà \u0026ldquo;questo è pazzo!\u0026rdquo; e il secondo “ma perchè?” condivido pienamente con voi il vostro primo pensiero… c’è un pò di pazzia nella scelta adottata. Per quanto riguarda il perché invece, posso rispondere come segue:\nnon avevo molto tempo a disposizione\nremote config è gratis e non ha limitazione di utilizzo\nsi può dare accesso al servizio a una persona esterna\nle altre scelte mi avrebbero portato a dover costruire anche un’interfaccia back end per il censimento delle domande\nConoscevo già remote config e sarei stato più rapido nell’implementazione\nMa come funziona un servizio non nato per questo lavoro? Funziona benissimo, devo dire che mi ha sorpreso la reattività che dimostra l’app e il sistema che ho messo in piedi. Per farlo funzionare così bene però ho dovuto mettere assieme i due plugin nel modo che vi spiego di seguito. All\u0026rsquo;interno della console di remote config vado a inserire un nuovo parametro per ogni video.\nNel campo nome inserisco l’id del video di youtube e all’interno del parametro un json contenente le domande e le risposte così strutturato:\n{ \u0026#34;Playlist\u0026#34;: \u0026#34;PLsrqydfBIVzy9IMGwSQieTVeSWC7cRCnN\u0026#34;, \u0026#34;Questions\u0026#34;: [ { \u0026#34;question\u0026#34;: \u0026#34;How do you say how much is it??: \u0026#34;, \u0026#34;answare\u0026#34;: [ \u0026#34;Quanto costa?\u0026#34;, \u0026#34;Quanto costano? \u0026#34;, \u0026#34;Quanto costi?\u0026#34; ] }, { \u0026#34;question\u0026#34;: \u0026#34;How do you say how much are they?: \u0026#34;, \u0026#34;answare\u0026#34;: [ \u0026#34;Quanto costano?\u0026#34;, \u0026#34;Quanto costate?\u0026#34;, \u0026#34;entrambe/both\u0026#34; ] }, { \u0026#34;question\u0026#34;: \u0026#34;Choose the correct option\u0026#34;, \u0026#34;answare\u0026#34;: [ \u0026#34;Quanto costa questo computer? 300 Euro\u0026#34;, \u0026#34;quanto computer ti costa? 300 Euro\u0026#34;, \u0026#34;Quanto costano questo computer?\u0026#34; ] }, { \u0026#34;question\u0026#34;: \u0026#34;Quanto costa? is\u0026#34;, \u0026#34;answare\u0026#34;: [ \u0026#34;singolare\u0026#34;, \u0026#34;plurale\u0026#34; ] } ] } Inoltre firebase mette a disposizione un inserimento facilitato che effettua anche la validazione del json, questo ci permette di editare più facilmente e non commettere errori.\nNell’app Flutter ho poi costruito l’oggetto Quiz che conterrà l’id di youtube, una lista di Domande e la Domanda conterrà una lista di Risposte. Con vari metodi utili di gestione e costruttore per deserializzazione dei dei dati Json come segue:\nclass Answer { final String answerText; final bool isCorrect; Answer(this.answerText, this.isCorrect); } class Question { final String question; final List\u0026lt;Answer\u0026gt; answers; Question(this.question, this.answers); } class Quiz { List\u0026lt;Question\u0026gt; _questions; int _currentIndex = -1; int _score = 0; String _videoId; Quiz.fromJson(String videoId, String jsonInput){ _videoId = videoId; _questions = new List\u0026lt;Question\u0026gt;(); var jsonQuestions = json.decode(jsonInput); jsonQuestions[\u0026#39;Questions\u0026#39;].forEach((quest) { List\u0026lt;Answer\u0026gt; answers = new List\u0026lt;Answer\u0026gt;(); bool iscorrect=true; quest[\u0026#39;answare\u0026#39;].forEach((ans) { //mettere la prima a true answers.add( new Answer(ans, iscorrect) ); iscorrect=false; }); answers.shuffle(); _questions.add( new Question( quest[\u0026#39;question\u0026#39;], answers) ); }); } Quiz(this._questions) { _questions.shuffle(); } List\u0026lt;Question\u0026gt; get questions =\u0026gt; _questions; int get length =\u0026gt; _questions.length; int get questionNumber =\u0026gt; _currentIndex + 1; int get score =\u0026gt; _score; Question get nextQuestion { _currentIndex++; if (_currentIndex \u0026gt;= length) return null; return _questions[_currentIndex]; } Question get prevQuestion { _currentIndex--; if (_currentIndex \u0026lt; 0) return null; return _questions[_currentIndex]; } String get correctAnsware { return _questions[_currentIndex].answers.where((x) =\u0026gt; x.isCorrect == true).first.answerText; } void answer(bool isCorrect) { if (isCorrect) _score++; } saveScore() async { SharedPreferences preferences = await SharedPreferences.getInstance(); preferences.setInt(\u0026#34;OK\u0026#34;+_videoId, this.score); preferences.setInt(\u0026#34;KO\u0026#34;+_videoId, this.length - this.score ); //preferences.setString(_videoId, \u0026#34;{\u0026#39;questions\u0026#39;:\u0026#39;\u0026#34;+ this.length.toString() +\u0026#34;\u0026#39;, \u0026#39;score\u0026#39;:\u0026#39;\u0026#34;+ this.score.toString() +\u0026#34;\u0026#39;}\u0026#34;); } } Per prima cosa, l’App recupera la lista dei video tramite le API youtube, successivamente\nrecupera il relativo json da remote config utilizzando l’id del video e lo passa al costruttore dell’oggetto che lo deserializza ed il gioco è fatto! Una volta ultimata l’app mi sono accorto però che youtube mette a disposizione un numero limitato di chiamate API giornaliere e oltretutto ho pensato che fosse inutile che l’App, ogni volta che viene aperta, debba richiamare le API Youtube. I video oltretutto non cambiano tanto in quanto questo canale produce un nuovo video a settimana.\nPer risolvere il problema delle chiamate API Youtube e rendere il tutto più reattivo ho deciso di salvare tutto in una lista di stringhe json in cache utilizzando proprio la Shared Preferences. Infine ho aggiunto un parametro nella remote config contente una data.\nIn questo modo ho fatto un meccanismo che mi permette di aggiornare i contenuti nei dispositivi solo se la data è più recente rispetto a quella memorizzata in cache del singolo dispositivo stesso:\nclass YoutubeData { RemoteConfig remoteConfig; String apikey; List\u0026lt;YoutubeDto\u0026gt; allYoutubeVideoList = []; List\u0026lt;YoutubeDto\u0026gt; getHomeList() { return List\u0026lt;YoutubeDto\u0026gt;.from(allYoutubeVideoList.where((item) =\u0026gt; item.kind == \u0026#34;video\u0026#34; \u0026amp;\u0026amp; item.id != item.channelId )); } List\u0026lt;YoutubeDto\u0026gt; allCategory() { return List\u0026lt;YoutubeDto\u0026gt;.from(allYoutubeVideoList.where((item) =\u0026gt; item.kind == \u0026#34;playlist\u0026#34; \u0026amp;\u0026amp; item.id != item.channelId )); } List\u0026lt;YoutubeDto\u0026gt; getCategoryVideoList(String plylistID) { return List\u0026lt;YoutubeDto\u0026gt;.from(allYoutubeVideoList.where((item) =\u0026gt; item.kind == \u0026#34;video\u0026#34; \u0026amp;\u0026amp; item.id != item.channelId \u0026amp;\u0026amp; item.playlist == plylistID )); } YoutubeData (this.apikey, this.remoteConfig); checkAndLoad() async { SharedPreferences preferences = await SharedPreferences.getInstance(); List\u0026lt;String\u0026gt; videoIDList = preferences.getStringList(\u0026#34;VideoIdList\u0026#34;); DateTime lastUpdateDate,updateDate; String date = remoteConfig.getString(\u0026#34;UpdateDatetime\u0026#34;); updateDate = DateTime.parse(date); if(preferences.getString(\u0026#34;LastUpdateDatetime\u0026#34;)!=null \u0026amp;\u0026amp; preferences.getString(\u0026#34;LastUpdateDatetime\u0026#34;).isNotEmpty) lastUpdateDate = DateTime.parse(preferences.getString(\u0026#34;LastUpdateDatetime\u0026#34;)); else lastUpdateDate = DateTime(2010); if( (videoIDList==null || videoIDList.length==0) || updateDate.isAfter(lastUpdateDate)) { await loadYtDataAndStoreInSharedPref(); preferences.setString(\u0026#34;LastUpdateDatetime\u0026#34;, DateTime.now().toString() ); } await loadLocalDataAndAddQuestion(); } loadYtDataAndStoreInSharedPref() async { YoutubeAPI ytApi = new YoutubeAPI(apikey, maxResults: 50); List\u0026lt;YT_API\u0026gt; ytResult = await ytApi.channel( remoteConfig.getString(\u0026#39;ChannelId\u0026#39;) ); //salviamo il conteggio dei video in shared pref SharedPreferences preferences = await SharedPreferences.getInstance(); preferences.setInt(\u0026#34;TotVideo\u0026#34;, ytResult.length ); //salviamo json youtube video in shared pref e lista video YoutubeDto youtubedto = new YoutubeDto(); List\u0026lt;String\u0026gt; videoIdList = new List\u0026lt;String\u0026gt;(); for(var result in ytResult) { videoIdList.add( result.id); String json = jsonEncode( youtubedto.yApitoJson(result) ); preferences.setString( result.id, json ); } preferences.setStringList(\u0026#34;VideoIdList\u0026#34;, videoIdList ); } //aggiungiamo le domande agli oggetti youtube precedentemente salvati loadLocalDataAndAddQuestion() async { SharedPreferences preferences = await SharedPreferences.getInstance(); List\u0026lt;String\u0026gt; videoIDList = preferences.getStringList(\u0026#34;VideoIdList\u0026#34;); allYoutubeVideoList = new List\u0026lt;YoutubeDto\u0026gt;(); int cntQuestion=0; for(String videoID in videoIDList) { String jsonYoutube = preferences.getString(videoID); Map userMap = jsonDecode(jsonYoutube); YoutubeDto youtubeDao = new YoutubeDto.fromJson(userMap); youtubeDao.questionJson = remoteConfig.getString( \u0026#34;_\u0026#34; + videoID.replaceAll(\u0026#34;-\u0026#34;, \u0026#34;_trattino_\u0026#34;) ); if( youtubeDao.questionJson != null \u0026amp;\u0026amp; youtubeDao.questionJson.isNotEmpty ) { cntQuestion = cntQuestion + \u0026#39;question\u0026#39;.allMatches(youtubeDao.questionJson).length; youtubeDao.playlist = json.decode( youtubeDao.questionJson)[\u0026#39;Playlist\u0026#39;]; } allYoutubeVideoList.add(youtubeDao); } preferences.setInt(\u0026#34;TotQuestion\u0026#34;, cntQuestion ); } } Qui di seguito potete vedere un esempio di come funziona:\n","date":"16 maggio 2020","externalUrl":null,"permalink":"/it/coding/flutter_2_plugin_indispensabili_dalle_grandi_potenzialit%D0%B0/","section":"Coding","summary":"Questo articolo richiede una discreta conoscenza dei seguenti argomenti che potete approfondire ai seguenti link:  * [Firebase Remote\u0026hellip;","title":"Flutter 2 plugin indispensabili dalle grandi potenzialità","type":"Coding"},{"content":"Il nome scelto da Google questa volta è molto comprensivo ed esaustivo. Firebase remote config è una configurazione salvata in remoto, in questo caso su Google Cloud. La configurazione è accessibile in modifica nella console di Firebase, alla voce di menù Firebase remote config che si trova in fondo, molto in fondo, nell’ultima sezione secondo me un pò nascosta.\nPrerequisiti:\ncreare un account su Firebase utilizzando il nostro account google\ncreare un app, io ho usato flutter\ncollegare la nostra app al codice sorgente con la chiave json\nFacendo questo potremmo utilizzare tutti i servizi Firebase, ci sono tanti tutorial online e Firebase stesso mette a disposizione wizard con step per guidarvi alla corretta implementazione di Firebase con la vostra app.Possiamo usare Firebase Remote Config per memorizzare tutto quello che la nostra app necessità come parametri di configurazioni. Per prima cosa, dobbiamo individuare e mettere in configurazione ciò che pensiamo possa cambiare nel tempo, in questo modo avremo delle configurazioni nell’app modificabili in tempo reale da remoto in modo da non dover rieffettuare un nuovo deploy dell’app stessa. Un esempio può essere il caso in cui stiamo utilizzando un Api per recuperare dei dati, l’url base delle api potrebbe cambiare nel tempo. Facendo questo potremmo utilizzare tutti i servizi Firebase, ci sono tanti tutorial online e Firebase stesso mette a disposizione wizard con step per guidarvi alla corretta implementazione di Firebase con la vostra app.Possiamo usare Firebase Remote Config per memorizzare tutto quello che la nostra app necessità come parametri di configurazioni. Per prima cosa, dobbiamo individuare e mettere in configurazione ciò che pensiamo possa cambiare nel tempo, in questo modo avremo delle configurazioni nell’app modificabili in tempo reale da remoto in modo da non dover rieffettuare un nuovo deploy dell’app stessa. Un esempio può essere il caso in cui stiamo utilizzando un Api per recuperare dei dati, l’url base delle api potrebbe cambiare nel tempo.\nUn altro esempio più concreto che utilizzo io nell’app send to kindle è un parametro che contiene il numero di azioni prima di mostrare una pubblicità. In questo modo se gli utenti si lamentano per le troppe pubblicità posso cambiarlo in tempo reale con il solo cambio di un parametro da interfaccia web a costo zero.\nIl sistema di Firebase funziona davvero alla grande, c’è dietro un sistema push-lazy che utilizza i dati internet per recuperare le configurazioni solo se davvero abbiamo cambiato qualcosa lato server e quindi abbiamo pubblicato una modifica ad uno o più parametri. L’aggiornamento dei parametri avviene in real time e quindi la modifica sarà subito disponibile nell\u0026rsquo;app.\nI parametri possono essere anche associati a delle condizioni. Ad esempio un parametro può essere utilizzato solo per gli utenti di una certa età di un determinato paese o lingua a un determinato orario. Figata no?\nVantaggi # Controllo da remoto istantaneo, semplice e centralizzato.\nModifica App in tempo reale.\nDiminuisce la necessità di dover effettuare un nuovo deploy.\ni parametri possono essere combinati con delle condizioni.\nCome lo uso io nelle mie app? # Di seguito voglio mostrarvi un esempio di implementazione. In questo modo ho centralizzato la parte di inizializzazione e creazione dei parametri in modo che siano più accessibili. Ho deciso di utilizzare un singleton in modo da poterlo usare in tutte le view e in tutte le classi per cui ne ho bisogno, implementato nel seguente modo:\nimport \u0026#39;package:firebase_remote_config/firebase_remote_config.dart\u0026#39;; class Configuration { int _link_sent_before_ads; int _max_send_limit_size = 24000000; int get linkSentBeforeAds =\u0026gt; _link_sent_before_ads; int get maxSendLimitSize =\u0026gt; _max_send_limit_size; int get maxSendLimitSizeMb =\u0026gt; (_max_send_limit_size/1000000).round(); static Configuration get instance =\u0026gt; _instance; static final Configuration _instance = Configuration._privateConstructor(); Configuration._privateConstructor() { //initializeRemoteConfig(); } loadConfig(RemoteConfig _remoteConfig) async { _link_sent_before_ads = _remoteConfig.getString(\u0026#39;link_sent_before_ads\u0026#39;).isEmpty ? _link_sent_before_ads : int.tryParse(_remoteConfig.getString(\u0026#39;link_sent_before_ads\u0026#39;)); _max_send_limit_size = _remoteConfig.getString(\u0026#39;max_send_limit_size\u0026#39;).isEmpty ? _max_send_limit_size : int.tryParse(_remoteConfig.getString(\u0026#39;max_send_limit_size\u0026#39;)); } initializeRemoteConfig() async{ RemoteConfig remoteConfig = await RemoteConfig.instance; try { //set some default params in case of crash await remoteConfig.setConfigSettings(RemoteConfigSettings(debugMode: false)); await remoteConfig.setDefaults(\u0026lt;String, dynamic\u0026gt;{ \u0026#39;service_api_conversion_1\u0026#39;: \u0026#39;https://ebook-converter.app/calibre/ebook-convert\u0026#39;, }); // Using default duration to force fetching from remote server. await remoteConfig.fetch(expiration: const Duration(seconds: 0)); await remoteConfig.activateFetched(); } on FetchThrottledException catch (exception) { // Fetch throttled. print(exception); } catch (exception) { print(\u0026#39;Unable to fetch remote config. Cached or default values will be used\u0026#39;); } await this.loadConfig(remoteConfig); } } potrà essere infine utilizzato molto semplicemente nel seguente modo:\n//call this just first time in app initialization await Configuration.instance.initializeRemoteConfig(); Print(Configuration.instance.maxSendLimitSize); ","date":"15 maggio 2020","externalUrl":null,"permalink":"/it/coding/che_cos%D0%B8_firebase_remote_config/","section":"Coding","summary":"Il nome scelto da Google questa volta è molto comprensivo ed esaustivo. [Firebase remote\u0026hellip;","title":"Che cos'è Firebase Remote Config","type":"Coding"},{"content":" # Che cos’è la shared_preferences dove, quando e quanto utilizzarla? # La shared_preference è un plugin che vi permette di salvare dei dati in memoria dedicata all’app, la cartella che li conterrà prende il nome in android con il nome del pacchetto della vostra app es com.nomeazienda.nomeapp. I dati che possiamo memorizzare all’interno di questa memoria con questo plugin sono dei seguenti tipi:\nstring\nintero\nbool\nList\nE’ da notare che questi parametri non sono persistenti, rimangono nell’area dedicata all’app e quindi vengono eliminate nel momento in cui l’app viene disinstallata oppure se vengono rimossi i dati della cache dell’app. Quindi in genere è doveroso memorizzare dati di preferenze non indispensabili in modo che non sia una tragedia se dovessero essere persi. Un esempio classico può essere come voglio il tema light o dark oppure l\u0026rsquo;ordine degli oggetti nel menu.\nCome si usa? # Salvataggio: # import \u0026#39;package:shared_preferences/shared_preferences.dart\u0026#39;; SharedPreferences _preferences = await SharedPreferences.getInstance(); _preferences.setString(\u0026#34;theme\u0026#34;, \u0026#34;dark\u0026#34;); _preferences.setInt(\u0026#34;countaccess\u0026#34;, 2); Recupero: # import \u0026#39;package:shared_preferences/shared_preferences.dart\u0026#39;; SharedPreferences _preferences = await SharedPreferences.getInstance(); _preferences.getString(\u0026#34;theme\u0026#34;); _preferences.getInt(\u0026#34;countaccess\u0026#34;); In un primo momento potremmo pensare che è una cosa che serve a poco in quanto in una stringa non possiamo memorizzare tante informazioni. In realtà, se ci pensiamo bene, in una stringa possiamo anche memorizzare molto ma davvero molto semplicemente utilizzando un json, di seguito esempio:\nimport \u0026#39;package:shared_preferences/shared_preferences.dart\u0026#39;; SharedPreferences _preferences = await SharedPreferences.getInstance(); _preferences.setString(\u0026#34;{\u0026#34;name\u0026#34;:\u0026#34;Andrea\u0026#34;,\u0026#34;surname\u0026#34;:\u0026#34;Luciano\u0026#34;,\u0026#34;age\u0026#34;:31,\u0026#34;sex\u0026#34;:\u0026#34;M\u0026#34;,\u0026#34;SurnameCouldBeName\u0026#34;:true}\u0026#34;); In questo esempio ho messo come campo SurnameCouldBeName in quanto il mio cognome è anche un nome. Tutti quelli che non mi conoscono mi chiedono sempre \u0026ldquo;Luciano è il nome o il cognome?\u0026rdquo; E ogni volta vorrei fare qualcosa del genere:\nPossiamo quindi creare una collezione di persone utilizzando, al posto della singola stringa, una lista di stringhe come segue:\nimport \u0026#39;package:shared_preferences/shared_preferences.dart\u0026#39;; SharedPreferences _preferences = await SharedPreferences.getInstance(); List\u0026lt;String\u0026gt; users = new List\u0026lt;String\u0026gt;(); users.add(\u0026#34;{\u0026#34;name\u0026#34;:\u0026#34;Andrea\u0026#34;,\u0026#34;surname\u0026#34;:\u0026#34;Luciano\u0026#34;,\u0026#34;age\u0026#34;:31,\u0026#34;sex\u0026#34;:\u0026#34;M\u0026#34;,\u0026#34;SurnameCouldBeName\u0026#34;:true}\u0026#34;); users.add(\u0026#34;{\u0026#34;name\u0026#34;:\u0026#34;elisa\u0026#34;,\u0026#34;surname\u0026#34;:\u0026#34;luciano\u0026#34;,\u0026#34;age\u0026#34;:32,\u0026#34;sex\u0026#34;:\u0026#34;F\u0026#34;,\u0026#34;SurnameCouldBeName\u0026#34;:false}\u0026#34;); _preferences.setStringList(\u0026#34;users\u0026#34;, users); Questo infine potrebbe essere mappato in un oggetto in modo da accedere ai dati più semplicemente ed infine mostrarli nell’interfaccia:\nClass UserDto() { String name, surname, age, sex, SurnameCouldBeName; UserDto.fromJson(Map\u0026lt;String, dynamic\u0026gt; json) : name= json[name], surname= json[surname], age= json[age], sex= json[sex], SurnameCouldBeName = json[SurnameCouldBeName]; } SharedPreferences _preferences = await SharedPreferences.getInstance(); List\u0026lt;UserDto\u0026gt; UserObj = new List\u0026lt;UserDto\u0026gt;; List\u0026lt;String\u0026gt; users = _preferences.getStringList(\u0026#34;users\u0026#34;); for(String userjson in users) { Map userMap = jsonDecode(userjson); UserDto = new UserDto.fromJson(userMap); print(UserDto.name); UserObj.add(UserDto); } Pensate ai possibili vantaggi e alle possibili applicazioni. Può essere utilizzato per memorizzare dati restituiti da un API. Con questo approccio, l’applicazione è più efficiente e potrebbe funzionare anche offline senza quindi dover utilizzare sempre la rete dati per recuperare i dati dal server.\n","date":"15 maggio 2020","externalUrl":null,"permalink":"/it/coding/flutter_shared_preferences_in_profondit%D0%B0/","section":"Coding","summary":"La \u003ca href=\"https://pub.dev/packages/shared_preferences\" target=\"_blank\"\u003eshared_preference\u003c/a\u003e è un plugin che vi permette di salvare dei dati in memoria dedicata\u0026hellip;","title":"Flutter Shared Preferences in profondità","type":"Coding"},{"content":" Teoria # Flutter è un nuovo linguaggio uscito da non molto dalla beta, implementato da google sulla base del linguaggio Dart, meno noto ad oggi di FLutter. E’ un linguaggio moderno ma basandosi su Dart, la sintassi è molto simile a qualsiasi altro linguaggio moderno ad oggetti. Il concetto principale su cui si basa è Everything is a widget. Ma cosa vuol dire davvero? Tutto ciò con cui abbiamo a che fare sviluppando in Flutter è un widget. Un widget può avere o meno uno stato, che ne può determinare contenuto o forma. Potrebbe essere visto come un oggetto come lo immaginate con la differenza che può avere uno stato per aggiornare la view e può contenere contenuti e forme.\nSì, avete capito bene! forme in quanto un widget oltre a definire proprietà e metodi, può definire forme. Infine un widget può includere o estendere un altro widget. Quindi un\u0026rsquo;applicazione in flutter è la composizione dei widget insieme. Un esempio può essere un form che contiene un widget di input text ecc. e un botton anch\u0026rsquo;esso widget.\nI widget principali che possiamo realizzare sono di due tipi, almeno per adesso prima che google sconvolga tutto, e sono i seguenti:\nWidget privi di stato (statelesswidget): sono immutabili, come una classe statico. Un bottone che non cambia mai colore può essere definito come uno widget statico, può essere utilizzato anche nel caso abbiamo bisogno di mostrare solo descrizioni non interattive.\nWidget dotati di stato (statefulwidget): una (o più) proprietà ad essi afferente, cambiando, può mutare il comportamento, le sembianze o le funzionalità del widget. Una schermata dell’app che cambia in base al contenuto in una risposta http è un widget dotato di stato (proprio perché il contenuto della schermata varia in base alla risposta http). Esempio: nel caso in cui dobbiamo richiedere dei dati agli utenti e poi riaggiornare lo stesso widget per validare o mostrare un ok dati inseriti correttamente. Per aggiornare il widget è necessario utilizzare il setstate con la proprietà aggiornata in modo che venga prorogata la modifica.\nWidget dotati di stato (statefulwidget): una (o più) proprietà ad essi afferente, cambiando, può mutare il comportamento, le sembianze o le funzionalità del widget. Una schermata dell’app che cambia in base al contenuto in una risposta http è un widget dotato di stato (proprio perché il contenuto della schermata varia in base alla risposta http). Esempio: nel caso in cui dobbiamo richiedere dei dati agli utenti e poi riaggiornare lo stesso widget per validare o mostrare un ok dati inseriti correttamente. Per aggiornare il widget è necessario utilizzare il setstate con la proprietà aggiornata in modo che venga prorogata la modifica.\nConsiderazioni # La cosa che ho apprezzato di più di Flutter:\nche possiamo sviluppare tutto tramite un unico linguaggio.\nil live reload funziona davvero bene e ci permette di scrivere il codice più velocemente.\nDobbiamo scrivere e manutenere un’ unica linea di codice fruibile su Android e IOS come nativo.\nda poco con la stessa linea di codice è possibile fare il build anche per web e desktop (Linux e Windows) :)\nAll’inizio ero un pò scettico nell’utilizzare i widget ed è stato un pò complicato e dispersivo comprenderne i vantaggi. Tuttavia, dopo averli utilizzati devo dire che sono più semplici di quello che sembrano da implementare e grazie a questo approccio sarà più semplice ragionare secondo la best practice \u0026ldquo;DRY\u0026rdquo; (Don’t Repeat Yourself). Da un lato aggiunge una nidificazione incredibile in fase di costruzione dell’interfaccia iscatolando un widget dentro un altro e così via, dall’altro ha una logica che di sua natura è modulare e ciò è ottimo per disaccoppiare piccoli widget che saranno consistenti delle loro proprietà e i loro compiti. Disaccoppiando, possiamo testarli e usarli con diversi widget per fare widget più complessi. In questo modo il codice sarà più manutenibile e funzionale.\n","date":"14 maggio 2020","externalUrl":null,"permalink":"/it/coding/flutter_tutto_%D0%B8_un_widget_perch%D0%B8_ma_veramente_/","section":"Coding","summary":"Flutter è un nuovo linguaggio uscito da non molto dalla beta, implementato da google sulla base del linguaggio \u003ca href=\"https://dart.dev/\" target=\"_blank\"\u003eDart\u003c/a\u003e,\u0026hellip;","title":"Flutter tutto è un widget! Perchè? Ma veramente? ","type":"Coding"},{"content":"","date":"14 maggio 2020","externalUrl":null,"permalink":"/it/tags/widjet/","section":"Tags","summary":"","title":"widjet","type":"tags"},{"content":" Ricerca # Eccoci qua finalmente! In questi giorni ho sentito la necessità di creare questo blog che state proprio visitando! Mentre navigavo on line, sono venuto a conoscenza degli static site generator; ho sempre saputo della loro esistenza ma non avevo mai dedicato loro molta importanza. Tuttavia, navigando più a fondo, sono stato attratto da Hugo, uno fra i tanti nuovi motori per generare website statici.\nNo Wordpres # Partivo dall’esigenza di avere qualcosa di statico in quanto non dispongo di un server dove installare Wordpress o altri CMS e, per un piccolo blog personale, non credo sia necessario e oltretutto è troppo costoso. Infine, volevo che il blog fosse efficiente e scalabile e cross platform.\nDRY # La prima cosa a cui ho pensato da programmatore è stata: quante operazioni dovrò fare per eseguire un deploy senza un CMS? come farò a portare i miei nuovi contenuti online? Sono anche un\u0026rsquo;amante di Google Docs e mi piace scrivere ed avere tutto in un unico posto. Allora mi sono chiesto: come posso unire Hugo e Google Docs senza dover girare mille manovelle?\nInnanzitutto, ho studiato la struttura dei contenuti MarkDown e mi sono messo alla ricerca di qualcosa che mi desse la possibilità di convertire i Documenti Google in MarkDown. La cosa più utile che ho trovato sul web è stato questo Google script mangini/gdocs2md: Convert a Google Drive Document to the Markdown format, suitable for publishing. a cui faccio i miei più sentiti ringraziamenti.\nNonostante la comprovata efficacia del suddetto script, avevo bisogno di qualcosa in più rispetto al ricevere la conversione di un articolo via mail. Di conseguenza, per avere qualcosa di più automatizzato, ho modificato un pò lo script e creato il link che vedi sotto:\nLink allo script su github\nLo script converte tutti i documenti elencati in un foglio Google, organizza in cartelle per categorie, estrae immagini da articoli, aggiunge l’intestazione del MarkDown, i tags ed infine crea un file zip contenente tutti i contenuti. Ho deciso di impostare lo zip con visibilità pubblica quindi scaricabile, pronto per il deploy.\nHo successivamente creato una sorta di database utilizzando uno sheet di Google come se fosse una tabella con la seguente struttura:\nToDeploy Title Summary SummaryImage Category Data tag1 tag2 tag3 tag4 tag5 Language 1 Come Inviare File PDF e articoli web al Kindle da Android 0 Kindle 2020-05-09 kindle pdf articolo web send to kindle android it In questo modo ho la possibilità di fare il deploy di tutto o di aggiornare solo ciò che ho modificato utilizzando il primo campo ToDeploy. Successivamente, ho creato un altro google script che riceve in ingresso l’id della cartella su cui è presente lo zip precedentemente creato e restituisce l’url pubblico da cui effettuare il download dello zip con i contenuti.\nfunction doGet(e) { params = JSON.parse(JSON.stringify(e)); var docid = params.parameters.docid; if(docid==null || docid==\u0026#34;\u0026#34;) return; var parentFolder=DriveApp.getFolderById(docid); if(parentFolder==null) return; var url = parentFolder.getFilesByName(\u0026#34;BlogProd.zip\u0026#34;).next().getDownloadUrl(); return ContentService.createTextOutput(url); } Infine ho messo tutte insieme all\u0026rsquo;interno del seguente script linux sh in modo da poter automatizzare build e il deploy:\n#!/bin/bash #ln -s /home/yourname/works/luciosoftsite/blog/ ~/luciosoftsite #ln -s /home/yourname/works/luciosoftsite/blog/content/ ~/luciosoftblogcontent #requirements wget|unzip|hugo folderid=\u0026#34;your google doc folder id” yourscriptid=”your google script id” cd ~/luciosoftblogcontent; retriveurl=\u0026#34;https://script.google.com/macros/s/$scriptid/exec?folderid=$folderid”; downlodUrl=$(wget $retriveurl -q -O -); fileName=\u0026#34;download.zip\u0026#34;; wget -c $downlodUrl -O $fileName; unzip -o $fileName; rm -f $fileName; cd ~/luciosoftblog; #hugo serve -D HUGO_ENV=\u0026#34;production\u0026#34; hugo --config config.yaml firebase deploy Lo script è molto semplice, non fa altro che richiamare lo script google per recuperare l’url di download. Una volta recuperato l’url, a questo punto lo script effettua il download dello zip, estrae i contenuti all’interno del folder dei contenuti di Hugo, esegue il comando per creare Build, ed infine richiama firebase per effettuare il deploy.\nE anche oggi la magia è avvenuta.\nSì, probabilmente avrei potuto seguire mille altre strade, anche più sicure e più efficienti ma questo è un inizio, il mio obiettivo era più grande. Vorrei trasformare lo script linux in un container docker e lo script google in un\u0026rsquo;applicazione dinamica con login google. Ma questa è un\u0026rsquo;altra storia che, se avrà seguito, vedrete prossimamente in un altro link all’interno del mio blog :)\nPoject ghithub link\n","date":"11 maggio 2020","externalUrl":null,"permalink":"/it/coding/come_creare_un_blog_con_hugo_e_google_docs_come_backend/","section":"Coding","summary":"Eccoci qua finalmente! In questi giorni ho sentito la necessità di creare questo blog che state proprio visitando! Mentre navigavo on line,\u0026hellip;","title":"Come creare un Blog con Hugo e Google Docs come BackEnd","type":"Coding"},{"content":"","date":"11 maggio 2020","externalUrl":null,"permalink":"/it/tags/google-app-script/","section":"Tags","summary":"","title":"google app script","type":"tags"},{"content":"","date":"11 maggio 2020","externalUrl":null,"permalink":"/it/tags/google-docs/","section":"Tags","summary":"","title":"google docs","type":"tags"},{"content":"","date":"11 maggio 2020","externalUrl":null,"permalink":"/it/tags/hugo/","section":"Tags","summary":"","title":"Hugo","type":"tags"},{"content":"","date":"11 maggio 2020","externalUrl":null,"permalink":"/it/tags/static-blog/","section":"Tags","summary":"","title":"static blog","type":"tags"},{"content":"Sei pronto per iniziare una nuova esperienza di lettura? Finalmente puoi dire addio alle scomode letture notturne da smartphone.\nLeggere articoli lunghi su uno schermo di uno smartphone può essere scomodo, specialmente se l’articolo è molto lungo e sono presenti molti annunci. Leggere su un Kindle è molto più semplice per gli occhi e si può avere anche un maggiore controllo sulla dimensione e sul carattere usato.\nTrova il tuo indirizzo Kindle con 3 passaggi # 1. Recupera la email del tuo kindle, puoi trovarlo accedendo al seguente link:\nhttps://www.amazon.it/hz/mycd/myx#/home/settings/ ( assicurati che il .it sia l\u0026rsquo;Amazon utilizzato nel tuo paese, quella in cui hai associato il tuo kindle)\n2. Scorri verso il basso fino alle impostazioni del documento personale e fai clic su di esso. Modifica l\u0026rsquo;indirizzo del kindle che ti servirà per accedere all\u0026rsquo;app Invia a Kindle.\n3. Scorri verso il basso, nella sezione mail approvate, aggiungi l\u0026rsquo;indirizzo e-mail che usi tutti i giorni o quello da cui desideri inviare i documenti, verifica che l\u0026rsquo;archiviazione sia abilitata.\nAdesso rilassati e divertiti a inviare documenti con Send to Kindle.\nSend to Kindle \u0026amp; Send to Reader # La migliore app per farlo è Send To Kindle. Questa app non è la stessa di Invia a Kindle fornita da Amazon.\nAggiornamento 2026 — Da Send to Kindle a Send to Reader: Quando ho scritto questo articolo nel 2020 esisteva solo la prima versione di Send to Kindle. Negli anni però tanti di voi mi hanno chiesto un modo per inviare articoli, PDF e persino Manga (fino a 200 MB!) senza dover impazzire con le email approvate di Amazon, con un\u0026rsquo;anteprima pulita dalle pubblicità e compatibile anche con Kobo, Onyx Boox, PocketBook e iPhone/iPad. Così ho creato Send to Reader: date un\u0026rsquo;occhiata alle nuove miniguide su come inviare articoli web da Safari e Chrome, come risolvere i PDF illeggibili e cambiare copertina o come scegliere e usare insieme Kindle, Kobo e Boox!\nInvia a Kindle ti consente di:\ninviare articoli Web al tuo Kindle tramite la funzione Condividi sul tuo browser Web mobile.\nInvia documento pdf / epub / azw convertendolo in mobi.\nArticolo Web Invia a Kindle # Scarica l\u0026rsquo;app Invia a Kindle dal Play Store Send To Kindle. Individua l\u0026rsquo;articolo che desideri inviare al tuo Kindle su qualsiasi browser o app di notizie.\nApri le impostazioni del tuo browser e cerca tre punti nell\u0026rsquo;angolo in alto a destra.\nFai clic su Condividi.\nScegli Send To Kindle come app di condivisione.\nAttendi che l\u0026rsquo;app converta il tuo articolo nel formato corretto.\nFare clic sul pulsante Invia con la freccia gialla.\nSe è la prima volta che usi l\u0026rsquo;app, dovrai impostare il tuo indirizzo e-mail Kindle. Tocca il messaggio per farlo.\nDigita la tua e-mail Kindle e premi Salva.\nScegli il tuo client di posta elettronica.\nInvia l\u0026rsquo;e-mail.\nControlla il tuo Kindle per l\u0026rsquo;articolo.\nInvia a Kindle PDF, EPUB o AZW # Fai clic sull\u0026rsquo;icona più nella barra di ricerca Seleziona il file pdf da inviare\nFai clic su Convert\nInvia la mail utilizzando il tuo client di posta preferito\n","date":"9 maggio 2020","externalUrl":null,"permalink":"/it/kindle/come_inviare_file_pdf_e_articoli_web_al_kindle_da_android/","section":"Kindle","summary":"Sei pronto per iniziare una nuova esperienza di lettura? Finalmente puoi dire addio alle scomode letture notturne da smartphone.  Leggere\u0026hellip;","title":"Come Inviare File PDF e articoli web al Kindle da Android","type":"Kindle"},{"content":"","externalUrl":null,"permalink":"/it/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"}]