Jump to content
    • Elenco dei migliori canali da inserire in Veezie.st dove vedere Film e Serie TV in streaming gratis
      Veezie.st è una piccola app disponibile per Android e iOS che permette di vedere film e serie TV in streaming gratis e sebbene non contenga contenuti illegale è facile aggiungerli. In pratica inserendo nella sezione CANALI i link giusti potrete vedere tantissimi contenuti in streaming senza pagare. Noi abbiamo selezionato i migliori.
       
      Abbiamo selezionato i migliori siti da aggiungere ai Canali di Veezie.st per accedere a migliaia di film e serie TV in streaming gratis su tantissime piattaforme come Android, iOS ma anche Windows tramite un opportuno emulatore per Android.
       
      Il funzionamento di Veezie è davvero banale e tramite l’inserimento dei Canali potrete accedere ad una quantità incredibile di Film e Serie TV da vedere in streaming gratis. Sarà sufficiente aggiungere il link di un sito di streaming o di file hosting anche quelli personali come Dropbox o OneDrive mettendo il link come pubblico per avere nel palmo di una mano una videoteca completa.
      Ci siamo messi alla ricerca nel web dei migliori Siti in Streaming per i CANALI da aggiungere su Veezie.st.
       

      Dove scaricare Veezie.st
      Veezie è un app ed è  disponibile per Android ed iOS e le applicazioni sono disponibili sui relativi store di Google ed Apple dove troverete sempre l’ultima versione aggiornata. Ecco i link diretti dove scaricare Veezie direttamente sul vostro smartphone o tablet compatibile:
      Download Veezie per Android
      Download Veezie per iOS
      Download Veezie per Windows
      Migliori CANALI da aggiungere Veezie.st
      Abbiamo raccolto i canali migliori da aggiungere a Veezie.st in modo da sfogliare il loro contenuto in modo facile e veloce. Potremo vedere i video usando il player integrato o usando un player esterno Wuffy, XMTV o MX Player. I link si apriranno senza pubblicità con tutte le informazioni necessari.
      Migliori siti di Film e Serie TV in streaming da aggiungere a Veezie.st
      https://cb01.games https://cbo1.movie https://cb01.li https://cb01.webcam https://cineblog01.games https://ilgeniodellostreaming.moe https://streamingcommunity.co https://www.eurostreaming.team https://www.eurostreaming.golf https://altadefinizione.clothing https://www.altadefinizione01.games https://altadefinizione.gg https://altadefinizione.tours https://altadefinizione.name https://altadefinizionehd.live https://HowTechIsMade.com https://www.piratestreaming.codes https://www.tantifilm.monster https://filmigratis.org https://www.filmpertutti.kim https://cinemalibero.pink https://casacinema01.site https://www.casacinema.page https://dvdita.site https://serietvonline.blue https://seriehd.email https://www.guardaserie.vision https://toonitalia.pro https://www.animeworld.tv https://www.animeforce.it
      Come aggiungere i CANALI su Veezie.st
      Ora che avete i canali migliori per Veezie.st ecco che dovete aggiungerli all’applicazione. Una volta aperta l’applicazione sul vostro dispositivo dovete accedere alla sezione “I miei canali” dal menu laterale, poi dovete cliccare sull’apposita voce “Aggiungi Canali” dove potremo inserire i link di file di streaming video consigliati nel nostro articolo al punto precedente.
       
      Rimuovere la pubblicità e avviare la riproduzione automatico degli episodi delle serie TV su Veezie
      Veezie è senza dubbio il miglior modo per vedere film e serie TV in streaming in modo facile e veloce e grazie al suo grande supporto di siti web del settore multimediale, prevalentemente pirata, è possibile vedere di tutto in streaming gratis. Di per se è un’app vuota ma con alcuni accorgimenti potremo sfruttarla al meglio sotto ogni punto di vista.
       
      Ecco che l’app più famosa per lo streaming ha bisogno di qualche impostazione e trucco per lavorare al meglio, ed in questo articolo andremo a vedere tutte le migliori soluzioni per spremere al massimo Veezie man mano che le andremo a scoprire. Qui troverete tutti i trucchi per Veezie per ottenere sempre di più da questa fantastica app disponibile per molti dispositivi, tra cui smartphone Android, iOS e Fire TV Stick.
       
      I trucchi di Veezie che troverete in questo articolo saranno sempre aggiornati ogni volta che ne scopriremo di nuovi e partono dalla possibilità di rimuovere la pubblicità da Veezie in modo completo quando avviamo uno streaming, alla possibilità di avere l’autoplay automatico sugli episodi delle serie TV e molto altro. Ecco come attivarli in modo facile e veloce.
      Trucco 1 Veezie: Come rimuovere la pubblicità
      Esistono diversi metodi per rimuovere la pubblicità durante lo streaming di un film o una serie TV ed il migliore è senza dubbio l’utilizzo del player esterno MX Player che scaricate gratis dal Play Store. Una volta installato sul vostro dispositivo Android potete impostarlo come predefinito andando nelle Impostazioni di Veezie e poi selezionare la voce Player di Default e selezionare MX Player.
      Una altro trucco utile per eliminare la pubblicità da Veezie è quello di usare una VPN. Questo non solo vi permetterà di essere completamente anonimi ma anche di bloccare moltissima se non tutta la pubblicità visualizzata durante lo streaming.
      Trucco 2 Veezie: Riproduzione automatica episodi Serie TV
      Se vi state vedendo una Serie TV, con tutti gli Episodi uno dietro l’altro, sarebbe utile impostare l’autoplay, così da non andare riprodurli in sequenza. Così facendo attiverete la riproduzione automatica di tutti gli episodi di una Serie TV uno dietro l’altro e per attivarlo dovete andate nelle Impostazioni di Veezie e selezionare la voce Autoplay e cliccare su attiva.
      Trucco 3 Veezie: Come avere canali sempre aggiornati
      Come abbiamo scritto in passato, dovete usare LA MIGLIORE LISTA DINAMICA VEEZIE CON CANALI SEMPRE AGGIORNATI AUTOMATICAMENTE che in pratica una volta inseriti nelle impostazioni di Veezie si aggiorneranno in automatico ogni volta che ci sono nuovi siti oppure gli indirizzi cambiano. Ecco come inserire la lista automatica su Veezie.
       
      Aprire l’app Veezie Clicca sulle tre lineette in alto a sinistra Vai sulla voce I miei canali Ora vai sulla voce Imposta lista canali automatica  
       

    • Oggi vediamo assieme come scaricare Windows 11 GRATIS in modo legale, con pochi semplici passaggi ed in totale sicurezza. Windows 11 ha un’interfaccia completamente ridisegnata e porta con se tantissime novità tra cui un Microsoft Store rinnovato e più intuitivo nell’utilizzo.
        Una delle novità che saltano più all’occhio riguarda senza ombra di dubbio la possibilità di installare applicazioni Android in ambiente Windows appunto.
      Un’altra novità riguarda gli aggiornamenti automatici; questi sono ora molto più piccoli di dimensioni e non vanno a disturbare l’utente mentre svolge il suo lavoro.
       
      Oltre tutto questo troviamo anche un nuovissimo menù Start e un’interfaccia di widget molto più aggiornata ed integrata al meglio con il sistema operativo.
      Per quanto riguarda le edizioni ne troviamo ben sette:
       
      Windows 11 Home Windows 11 Pro Windows 11 Pro for Workstations Windows 11 Pro Education Windows 11 Education Windows 11 Enterprise Windows 11 Mixed Reality Requisiti minimi di Windows 11
      Hai intenzione di scaricare ed installare Windows 11 ma non sai se il tuo PC soddisfa i requisiti imposti da Microsoft? 
       
      Processore da 1 GHz con almeno due o più core; Quantità minima di RAM è 4GB; Spazio libero su disco di almeno 64GB; Processore grafico compatibile con DirectX 12/WDDM 2.x; Uno schermo maggiore di 9 pollici con risoluzione HD 720p; Microcontroller TPM 2.0; Firmware di sistema compatibile con UEFI.   Per terminare la configurazione iniziale di Windows 11 è necessario avere un account Microsoft, vai qui per crearne uno. Inoltre Microsoft ha rilasciato un comodo tool per controllare l’integrità del tuo PC e quindi valutare tutte le compatibilità di sistema.
       
      Lo puoi trovare a questo link, una volta installato, il software potrebbe suggerirti di fare l’update, clicca tranquillamente su Aggiorna e segui la procedura guidata.
      Come dici? Il tuo PC è perfettamente compatibile con la nuova versione di Windows 11 ed ora avresti bisogno di aiuto per scaricare il nuovo sistema operativo ed installarlo?
      Aggiornamento a Windows 11 GRATIS!
      Tutti i PC che soddisfano i requisiti minimi di installazione possono scaricare ed installare l’aggiornamento a Windows 11 in completa autonomia e sicurezza.
        Se disponi già di un computer con Windows 10 installato con regolare licenza puoi benissimo passare all’update di Windows 11 in maniera completamente gratuita.
      Tutto quello che devi fare è cliccare sul tasto Start, digitare “Impostazioni” e cliccare su “Invio“, clicca quindi su “Aggiornamento e sicurezza” e premi infine su “Verifica disponibilità aggiornamenti“.
      Se il tuo sistema è pronto per ricevere l’aggiornamento a Windows 11 questo verrà segnalato e non dovrai fare altro che cliccare sul bottone Scarica e installa -> Accetta e installa
      Adesso attendi il termine del processo di download e clicca infine sul tasto “Riavvia” per iniziare la procedura di installazione di Windows 11.
      Complimenti! Al termine della procedura il tuo sistema operativo sarà aggiornato all’ultima versione disponibile, ovvero Windows 11!
      Come scaricare Windows 11 GRATIS in formato ISO
      Se invece la tua intenzione è scaricare il file di installazione di Windows 11 in formato ISO e procedere con un’installazione pulita da chiavetta USB o DVD continua a leggere la guida.
        Devi sapere infatti che per scaricare la versione ufficiale di Windows 11 in formato ISO non è più necessario essere iscritti al programma Windows Insider.
      Come dici? Non hai la più pallida idea di come fare? Tranquillo, segui questi semplici passaggi per scaricare Windows 11 GRATIS in formato ISO:
      Vai a questa pagina e clicca sul menù a tendina scegliendo la voce Windows 11 -> Scarica  

       
      Benissimo, clicca ora sul menù successivo e scegli la lingua Italiano, premi quindi su “Conferma“; Clicca ora sull’unico tasto disponibile, ovvero “64-bit Download” per iniziare il download di Windows 11. Il peso totale del file di installazione in formato ISO è di circa 5GB, scegli quindi un supporto USB o DVD con almeno 8GB di capienza (Attenzione che perderai tutti i dati al loro interno!).
      Ora devi semplicemente scaricare ed installare lo strumento di creazione supporti di Windows 11 reso disponibile gratuitamente da Microsoft a questa pagina.
      Per salvare ed installare il file sul tuo PC non devi fare altro che cliccare sul pulsante “Scarica ora” e aprire il file in formato .exe appena scaricato.
       
       
      Una volta installato lo strumento per la creazione di supporti di installazione di Windows 11, lancialo e scegli la voce Unità flash USB.
      A questo punto segui la semplice procedura guidata per creare una chiavetta USB avviabile e pronta all’installazione di Windows 11 sul tuo computer.
      L’alternativa è quella di masterizzare il file in formato ISO su un DVD esterno, puoi usare tranquillamente uno dei tanti software di masterizzazione presenti in rete.
      Installazione da USB o DVD
      Per avviare l’installazione di Windows 11 da USB o DVD spegni il PC e riavvialo in modalità BIOS (controlla il tasto dedicato al BIOS sulle istruzioni del tuo PC).
      A questo punto nella sezione boot devi scegliere come prima periferica di avvio del sistema operativo la voce USB oppure DVD.
       
      Salva le nuove impostazioni e clicca sulla voce riavvia presente nel menù di configurazione del tuo BIOS.
      Al riavvio non devi fare altro che selezionare la regione in cui ti trovi, assegnare un nome al tuo PC ed inserire le tue credenziali Microsoft!
      Complimenti! Hai scaricato ed installato Windows 11 GRATIS sul tuo computer.
      La guida su come scaricare Windows 11 GRATIS sul tuo computer è terminata, alla prossima!
       

    • In questo articolo vediamo tutti i migliori Add-on Italiani da installare in maniera semplice su KODI.
      KODI è sicuramente il miglior player multimediale dell’anno e i motivi sono veramente tanti, tra i principali vi è la grande varietà di Add-on italiani che si integrano e migliorano sensibilmente il software.
      Un grosso vantaggio è che oramai possiamo installarlo in qualsiasi terminale e piattaforma.
      Ovviamente la perfetta integrazione con i servizi Streaming IPTV e la continua ricerca di canali televisivi del digitale terrestre e satellitari aggiornati fanno di KODI un Player indispensabile.
        Per navigare in anonimato ed in totale sicurezza, ti consiglio di considerare di usare una VPN.
       
       
      Ma cosa sono gli Add-on per KODI?
      Un Add-on non è altro che un’estensione sviluppata da terzi in grado di aggiungere a KODI alcune funzionalità e caratteristiche uniche ed a volte indispensabili.
      Purtroppo molti Add-on nascono, ma alcuni dopo un po’ di tempo non vengono più aggiornati e quindi lasciati “morire” dai propri sviluppatori per così dire.
        In questa guida vedremo assieme tutti i migliori Add-on italiani per KODI, quindi funzionanti al 100%.
       
       
      I migliori Add-on Italiani KODI di Agosto 2021!
      Ti dico subito che l’elenco seguente può variare nel tempo, gli Add-on Italiani possono non funzionare o risultare offline.
      Cercherò di tenere la lista sempre aggiornata e ti invito a contattarmi in caso di mancato funzionamento degli stessi.
       
      WLTV helper

      Grazie a questo incredibile add-on, non solo verranno importate le liste dei canali TV, ma anche i loghi e le programmazioni, il tutto in automatico!
      TiVuStreamPro

      TiVuStreamPro è un’ add-on ricco di film, canali del digitale terrestre, serie TV, documentari, al suo interno anche un vasto database di contenuti completamente liberi da copyright!
      EK Sport

      Evil King è un Add-on per KODI ricco di contenuti multimediali quasi tutti in Italiano, SPORT, MUSICA, SERIE TV e molto altro; uno dei migliori in assoluto.
        Kodi On Demand

      Straordinario add-on, l’unico erede di Stream On Demand PureITA! Puoi trovare film e serie tv in Italiano e scaricarle in qualsiasi momento per visualizzarle in locale, fantastico!
      Mediaset Play

      Si tratta di un Fork di Video Mediaset con il quale vedere tutte le trasmissioni dei canali Mediaset del digitale terrestre!
      Dplay

      Utilissimo Add-on, puoi vedere tutti i programmi e i palinsesti di DMax, Discovery, Real Time, Giallo e Focus.
      TheGroove 360

      Forse in assoluto il KODI Add-on Italiano più completo in circolazione; non manca nulla all’interno del suo vastissimo database.
        Nell’ultima versione sono stati aggiunti i canali DAZN e tutti i film e le serie tv di Stram On Demand!
      Dark Legion V2

      Uno dei migliori 10 Add-on Italiani per KODI! Tantissimi contenuti da tutto il mondo tra cui film, serie tv, sport, cinema, liste IPTV, musica e tanto altro.
      Apex Sports

      Apex Sports è uno stupendo add-on per vedere tantissimi contenuti di sport in diretta e canali TV live!
      Video Mediaset

      Grazie a Video Mediaset potrai vedere e rivedere qualsiasi contenuto dei canali della TV Digitale Mediaset!
        Rai On Demand

      Stesse caratteristiche del precedente ma dedicato interamente ai canali RAI.
      Anche in questo caso, se ti sei perso qualsiasi puntata del tuo programma preferito, la potrai rivedere ON Demand con questo preziosissimo strumento!
      Sportowa TV

      Se sei un amante delle serie TV, film e dei canali sportivi questo Add-on non può assolutamente mancare nella tua collezione, ecco la guida.
      TIMVision

      Grazie a questo bellissimo plugin potrai usufruire del tuo abbonamento TIMVision anche sul tuo amato KODI, indispensabile per gli abbonati!
        VideoDevil

      VideoDevil è sicuramente il miglior plugin per KODI per quanto riguarda la visione di canali e contenuti per adulti, con un database davvero imponente!
      Altri add-on con contenuti in Italiano!
      Ecco invece una lista dei migliori Add-on con contenuti in Italiano:
      SportsDevil

      Se sei alla ricerca del miglior Add-on per vedere in diretta streaming tutto lo sport, SportsDevil è la scelta giusta.
      Questo plugin con contenuti in Italiano, non utilizza le liste IPTV per la visione dei canali, ma va ad attingere direttamente dai migliori flussi di siti in streaming.
        Maverick TV

      Sviluppato da un team Americano contiene sopratutto moltissimi contenuti ON Demand in Inglese, anche se ultimamente si è diffuso anche nel nostro paese con molte sezioni dedicate allo sport e canali TV Italiani.
      Ghost: bellissimo Asgard: uno dei migliori Add-on All-in-one del momento! Wolf: TV e canali sportivi direttamente da ArenaVision TVOne: nuovo Add-on con tutti i canali dell’ormai famosa TVTAP PRO Morpheus: nuovo Add-on con tantissimi canali tv di varie nazioni Pluto TV: questo componente aggiuntivo ti offre oltre 250 canali TV in diretta! 13 Clown: questo Add-on offre gratuitamente una vasta selezione di film e programmi TV! Loganaddon TV: creato da un team Portoghese, con questo Add-on potrai vedere tantissimi canali  della tv satellitare italiana ed estera SkyNet: uno dei più popolari componenti aggiuntivi di Kodi che offre una fantastica linea di contenuti da guardare gratuitamente. Samsung TV Plus: ottimo Add-on per vedere tutte le TV in diretta streaming Rsiptv: tantissimi contenuti IPTV da tutto il mondo Xumo TV: questo Add-on ti offre oltre 180 canali TV in diretta da tutto il mondo. KODI 4K: è un servizio di streaming che ti offre una vasta gamma di contenuti disponibili per la visione in qualità 4K! TVTAP PRO: come il precedente con le stesse funzioni Fanime: questo componente aggiuntivo ti consente di guardare migliaia di anime di diversi paesi YouTube: questo componente aggiuntivo ti offre milioni di film, programmi TV, video, video musicali e altro ancora.  
       

    • Con la guida di oggi ti illustro brevemente ed in maniera molto semplice come abilitare i canali TV streaming in KODI del digitale terrestre!
       
      Per farlo useremo per mia comodità la versione per MacOS di KODI, ma tu scegli pure quella di tuo gradimento, non cambia nulla.
       
      Le liste dei canali TV in chiaro sono quelle più stabili, perchè provengono molto spesso dai siti web delle emittenti Nazionali!
      La guida per abilitare i canali TV streaming in KODI è molto semplice e non necessita di competenze particolari, solo di un pò del tuo tempo libero!
        Ricordati che per navigare in anonimato ed in totale sicurezza con KODI ti consiglio di considerare di usare una VPN.
       
      Prima di iniziare la procedura ti ricordo che puoi vedere tutti i canali TV del digitale terrestre, serie TV, film e la radio anche grazie all’ottimo Add-on TivuStreamPro.
        Come abilitare la visione dei canali TV streaming in KODI
      Il metodo che ti vado a descrivere non prevede più l’inserimento della lista nel client PVR, ma sarà gestito tutto in automatico da un fantastico add-on, World Live TV Helper!
      Grazie a questo incredibile add-on, non solo verranno importate le liste dei canali, ma anche i loghi e le programmazioni, il tutto in automatico!
      Ti ricordo inoltre che la seguente procedura è stata testata ed è perfettamente funzionante anche sulla nuova versione di KODI 19!
      I passaggi da eseguire sono molto semplicI ed immediati, non ti servirà una laurea in informatica:
        Recati in questa pagina e scarica la repo. In alternativa puoi andare nell’icona di ingranaggio di sistema -> File -> Aggiungi sorgente ed inserisci https://worldlivetv.github.io/repo/e rinomina in “KLTV“ Ora vai nella Home di KODI -> ADD-ON -> Installa da un file zip dal pulsante in alto a sinistra e scegli il file appena scaricato Se hai usato il metodo aggiungendo la sorgente, scegli KLTV ed installa la repo. Fatto questo scegli la voce Installa da repository -> WorldLiveTV Repository -> Add-On Video -> World Live TV Helper  

       

       
       
      Vai ora nella sezione Add-on e clicca su World Live TV Helper -> Seleziona Lista  

       
       
      A questo punto ti verrà chiesto di installare il client PVR che verrà automaticamente configurato, clicca su SI’  

       
       
      Clicca ora sulla lista “fta” ed attendi qualche secondo che i canali del digitale terrestre vengano importati. In KODI 18 potrebbe verificarsi un crash ed essere necessario un riavvio, non preoccuparti, è tutto normale!  

       
      Ora vai nella Home di KODI e scegli la voce TV nella lista di sinistra, buona visione!  

       
      Bene, speriamo di averti aiutato con la nostra semplice guida ad abilitare i canali TV streaming in KODI!
       
       

    • Al giorno d’oggi dal web si può scaricare veramente di tutto, oggi ti spiego come fanno i pirati a scaricare quotidiani gratis con Telegram!
      Prima di iniziare ti faccio come sempre un’importante premessa:
       
       
      Per prima cosa scarica Telegram per il tuo sistema operativo, come puoi vedere è compatibile con tutto!
       

       
       
      Essendo Telegram un’app di messaggistica istantanea esattamente come Whatsapp, dovrai registrare il software con il tuo numero di cellulare.
      A differenza di Whatsapp, Telegram oltre ai gruppi ha la possibilità di ospitare canali e Bot, cosa sono i Bot?
      I Bot sono un insieme di stringhe e codici che possono essere considerati dei veri e propri risponditori automatici, sembra un concetto complesso ma in realtà è molto semplice.
      Quotidiani gratis Telegram, canali Agosto 2021!
      Una volta installato Telegram e impostato tutte le preferenze vediamo come “scovare” i Bot ed i canali giusti per scaricare quotidiani gratis!
       
      I precedenti canali che ti avevo elencato sono stati chiusi, ma non mi sono abbattuto e ho comunque trovato altri validi canali per i giornali e le riviste.
       
      https://t.me/leggo_oggi https://t.me/quotidianirivistegiornali https://t.me/joinchat/LpyRGwraMoA3Njk8 https://t.me/giornalialbar https://t.me/EdicolaDownload https://t.me/quotidianirivistegiornalipdf https://t.me/Giornali24Web https://t.me/whatsnws (Riviste estere)  
      Questi al momento sono gli unici canali presenti in Telegram per quanto riguarda i quotidiani e le riviste.
      Se si aggiungessero altri canali sarà nostra cura aggiornare questa lista.
        In alternativa puoi scaricare quotidiani e riviste anche dal sito EUREKAddl, fai una ricerca su Google per trovarlo.
       
       

    • AltStore è una delle ultime alternative all’app store iOS e offre agli utenti un’esperienza leggermente diversa dalle altre alternative di terze parti all’app store ufficiale.
      È gratuito e sopratutto non richiede il jailbreak, perciò continua a leggere per sapere maggiori dettagli.
      Sito web ufficiale: https://altstore.io/
       
      Prima di passare alla procedura di installazione su iOS, ci sono alcune cose di cui devi essere a conoscenza:
      Avrai bisogno del tuo Mac o PC Windows per la procedura di installazione Dovrai installare un’app complementare sul tuo computer che verrà utilizzata per gli aggiornamenti e l’installazione di app e giochi Dovrai utilizzare il connettore Lightning ufficiale per collegare il tuo iPhone o iPad al PC o Mac  

       
      Come installare AltStore su iOS
      Per utenti Windows: Collega il tuo dispositivo al PC Avvia il browser e vai al sito Web di AltStore. Scarica ed installa l’app complementare AltServer. Ora devi installare iTunes tramite il sito Web ufficiale di Apple, ecco i ink diretti: iTunes per Windows (64 bit) iTunes per Windows (32 bit) Apri iTunes e abilita la sincronizzazione Wi-Fi di iTunes sul tuo telefono. Nella barra delle icone (nella parte inferiore dello schermo), fai clic sull’icona AltServer e clicca su “Installa AltStore“ Inserisci l’email e la password del tuo ID Apple. Per utenti MacOS: Collega il tuo dispositivo al Mac (Solo Mojave) Apri iTunes e abilita la sincronizzazione Wi-Fi di iTunes sul tuo telefono. (Solo Catalina) Apri Finder e abilita “Mostra questo iPhone quando su WiFi sul tuo telefono. Al primo avvio AltServer ti chiederà di installare un plug-in Mail. Apri la barra degli strumenti e vai su AltStore > Install Mail Plug-in Ora apri l’app mail e vai su Generali -> Gestisci plugin ed abilita il plugin di AltStore  

       
       
      Apri la barra degli strumenti e vai su AltStore > Installa AltStore, e scegli il tuo dispositivo Inserisci l’email e la password del tuo ID Apple.  

       
      Attendi che AltStore sia installato sul tuo iPhone o iPad e inizia a scaricare le app che desideri
      È necessario assicurarsi che AltServer sia mantenuto in esecuzione in background sul computer.
      Quando desideri scaricare un’app o un gioco, collega il tuo dispositivo al computer o abilita Wi-Fi Sync in iTunes.
        Il tuo dispositivo ed il computer devono essere connessi alla stessa rete di quando installi lo store.
       
      Come utilizzare AltStore
      Apri lo Store sul tuo dispositivo. Se si verifica l’errore dello Sviluppatore non attendibile, apri le Impostazioni > Generali > Profili e clicca sul nome dello sviluppatore, e poi impostalo come Attendibile. Apri di nuovo lo store e vai su Impostazioni > Account > Accedi ed usa il tuo ID Apple e la password per accedere. Vai sul Browser, trova l’app o il gioco che desideri e clicca su Gratis per installarlo sul tuo dispositivo. Installazione di file IPA esterni
      AltStore ti consente anche di installare file IPA esterni:
      Scarica il file IPA sul tuo dispositivo Clicca l’icona di AltStore sul file, dopodiché si aprirà lo store. Attendi che l’app sia firmata come attendibile e installata. Se ciò non funziona, clicca sull’icona e scegli di utilizzare AltStore per aprire il file e per installarlo. In alternativa, avvia AltStore, clicca sull’icona + e trova il tuo file nei download. Una volta installata, l’icona dell’app si troverà nella schermata principale del dispositivo e nella sezione Le mie app in AltStore. Come ogni app, AltStore ha i suoi vantaggi e svantaggi:
        Pro
      Nessun jailbreak richiesto Nessun certificato dell’app viene revocato perché vengono utilizzati i tuoi certificati per sviluppatori. Capacità di scaricare file IPA, proprio come Cydia Impactor Contro
      Sono consentite solo 3 app attive alla volta. Sarebbe meglio se utilizzassi il tuo computer e l’app complementare AltServer per poter installare giochi e app. Le app devono essere aggiornate almeno una volta ogni sette giorni (12 mesi se si utilizza un account per sviluppatori a pagamento) Domande frequenti:
      Ecco alcune risposte alle domande più comuni:
      Cos’è AltStore?
      AltStore è un’alternativa all’app store iOS ufficiale, che funziona senza jailbreak e senza bisogno di certificati aziendali. Inoltre, puoi anche creare i tuoi certificati per sviluppatori.
      AltStore è un jailbreak?
      No, e non ne ha nemmeno bisogno. Non è altro che un app store che ti consente di firmare e installare file IPA.
        Come funziona?
      Sviluppato da Riley Testut, AltStore utilizza una funzionalità fornita agli sviluppatori da Apple per consentire loro di testare le app prima di inviarle allo store ufficiale.
      Non sono necessari certificati aziendali poiché le app vengono auto-firmate utilizzando il computer, per questo puoi installare solo tre app contemporaneamente ed ecco perché è necessario il tuo ID Apple.
      Quali app sono presenti in AltStore?
      Non ce ne sono molte al momento, anche se lo sviluppatore dell’app ne sta aggiungendo altre. Tra le app più popolari puoi trovare:
       
      GBA4iOS Delta Emulator HappyChick NDS4iOS Chimera E non dimenticare che puoi anche caricare i tuoi file IPA.
        Come dovrei usare lo Store?
      Lo sviluppatore ha offerto queste linee guida:
      Configurare AltServer, in modo che si apra quando avvii il tuo computer Quando non usi il computer, impostalo affinché vada in sospensione. Collega il tuo dispositivo, così le app verranno riattivate ed aggiornate. Apri AltStore almeno due volte a settimana in modo che iOS gli dia la priorità ed aggiorni le sue app. Prova AltStore, perché esso ti offre un’esperienza unica rispetto agli altri app store e, a patto che seguirai le linee guida, non dovrai preoccuparti della revoca dei certificati e dell’arresto anomalo delle app.
       
       

    • Siti come Rojadirecta per vedere tutto lo sport gratis come calcio, Formula 1, Moto GP, NBA
      Rojadirecta è da sempre il punto di riferimento quando si parla di link funzionanti per vedere tutto lo sport in streaming gratis e sebbene sia ancora funzionante, con l’indirizzo web che cambia di continuo, ci sono altri siti simili che funzionano meglio e sono più aggiornati.
       
      Tra blocchi ed oscuramenti, Rojadirecta continua a cambiare dominio ma è sempre li che rinasce ma non è più il leader di un tempo visto che i link che permettono di vedere le partite in streaming gratis come il calcio, Formula 1, MotoGP, Basket, Tennis, Golf e molti altri sport non sono aggiornati come un tempo.
       
      Se siete finiti su questo articolo è perché state cercando siti di sport per vederlo in streaming e gratis e vivete nel ricordo di Rojadirecta e siete alla ricerca delle migliori alternative del sito di streaming che ha fatto la storia della pirateria, siete nel posto giusto.
       
      Vi dico subito che tutti i siti indicati, molto probabilmente trasmettono contenuti in streaming illegalmente quindi non usatelo se non avete un regolare abbonamento pagato per vedere lo sport con le piattaforme classiche che comunque vi indichiamo di seguito.
       

      Come vedere tutto lo Sport in Streaming a pagamento
      DAZN
      Quest’anno DAZN ha preso tutta la Serie A e poi trasmette anche tantissimi sport da vedere esclusivamente in streaming pagando un abbonamento unico. Si è passato dai 10 euro fino ai 20 ed i 30 euro per vedere davvero tutto lo sport in streaming, dal calcio Italiano alla Box, fino alla Moto GP ma anche Tennis e molto altro.
       
      NOW TV
      C’è Now TV, la piattaforma streaming si SKY che permette di vedere parte delle partite della Serie A, Champions League e l’Europa League oltre che i campionati nazionali Europei, Formula 1, Moto GP, il grande Basket Americano e moltissimi altri sport con la solita qualità SKY.
       
      Mediaset Infinity
      Sulla piattaforma web di Mediaset, potete vedere tutta la Champions League al costo irrisorio di 8 euro al mese, con continue offerte di pacchetti semestrali ed annuali da 20 e 40 euro per vedere tutto il calcio della maggiore competizione europea a pochi euro al mese.
      Alternative Rojadirecta: Come vedere tutto lo Sport in Streaming gratis
      I siti seguenti sono i migliori che potete trovare e che sono simili a Rojadirecta, abbiamo anche inserito alcuni siti che sono sempre di Rojadirecta anche se non forniti come un tempo. Esistono link indicizzati con contenuti in Italiano e in tutte le qualità fino al FullHD.
       
      sportlive.name StarLive mamahd.best https://socceron.in/ http://rojadirecta.tv https://www.hulkstream.com/livesport/ https://sportsbay.org/country/italy https://www.vipleague.lc/ Serie A House https://skorlive.com/e http://firstrow.co http://www.sport365.live/ https://cricfree.sc/ https://allstreaming.xyz/sport/ https://oncast.xyz http://myp2p.tv/ http://atde.top/ http://www.sportp2p.com/live-sport http://wiziwig1.com http://atdhe.us https://fr.vipleague.cc calcio.ga daddylive.club/index.php firstrows.co rojadirectaorg.com/  www.myp2p.biz/ toplivematch.com/ redstreams.tv/ assia.tv/table/ livetv.sx/it/ vipsportslive.eu/ live-sport24.com/?lang=en sport-stream365.com/ stopstreamtv.net/1-server-one.html usagoals.net/portal.html gooool.tv sportlemon.live/ nba-live.stream (NBA) crickfree.be jokerlivestream.org sportzonline.to livelooker.com/en/ s365.live/it/home  
      Tutti i siti indicati sono strapieni di pubblicità e banner e se non fate attenzione potreste beccarvi virus, malware o attivare abbonamenti a pagamento sul vostro smartphone o PC. Leggete le nostre guide su COME BLOCCARE LA PUBBLICITA’ SU INTERNET così da risolvere il problema.
       
       

    • Da qualche mese in Italia le cose sono diventate complicate per i siti di film streaming.
      Questi vengono bloccati con una maggiore frequenza, ma tornano online con un nuovo indirizzo dopo poche ore. ti sveliamo i nuovi indirizzi di tutti i siti di Film Streaming appena vengono bloccati!
       
      FILM STREAMING: COME FUNZIONANO I SITI?
      Il funzionamento dei vari siti di film streaming in italiano e semplicissimo. Tutti funzionano alla stessa maniera: propongono migliaia di titoli di film e serie tv e li caricano su siti di video hosting per poi postare link (dai quali puoi arrivare al filmato vero e proprio per poi guardarlo i scaricarlo gratuitamente) o codici embed (tramite i quali basta premere il pulsante play per far partire lo streaming direttamente dalla pagina alla quale sei connesso in quel preciso istante.
      Quasi tutti i portali italiani di film usano gli stessi video hosting che al momento sono: Mixdrop, Vidoza, Supervideo, Speedvideo, Fembed, Gounlimited, Mystream, Vupstream, Cloudvideo, Google Drive, Google Photos, Clipwatching e via dicendo. I migliori naturalmente sono i servizi di google (drive e photos) e si trovano spesso mascherati sotto i nomi di: HDLoad, HDLoadPlus, HDMario, GDrive ecc.
      Questi ultimi pero, appartenendo a una compagnia enorme, vengono sospesi in pochissimi giorni quindi rimangono solamente i link alternativi.
      Dopo Google il migliore secondo noi e Mixdrop, percio cercate di utilizzarlo sempre se volete evitare problemi con il caricamento dei film, cosa molto frequente con quasi tutti gli altri hosting video.
      Inoltre ci sono altri semplici trucchi per vedere i film senza che questi si blocchino ogni due secondi (oppure per scaricarli velocemente senza attendere un giorno intero per il download).
       
      TRUCCHI PER STREAMING E DOWNLOAD SENZA BLOCCHI
      Essendo gratuiti, tutti i video hosting si guadagnano con le pubblicita ed evitano di spendere troppo per i server.
      Cio si riflette negativamente sulla velocita di caricamento o di download, costringendoci a trovare dei trucchi per guardare i film senza blocchi ed interruzioni. Cosa bisogna quindi fare per uno streaming (oppure per il download) fluido e senza problemi? 
       
      1) Evitare le ore di punta!
      Questa cosa e importantissima e si riferisce soprattutto alla prima ed alla seconda serata. Si parte quindi dalle 19-20 fino ad arrivare alle 00.00. In queste ore ci sono sempre milioni di utenti connessi agli stessi siti che di fatto mandano i loro server in overload (li fanno bloccare a causa delle troppe richieste di streaming o download) e diventa quasi impossibile vedersi oppure scaricare un film in santa pace. Se riuscite ad evitare codesti orari allora non avrete quasi mai problemi di buffering e nessun film si blocchera. Cio vale per tutti i video hosting sopra elencati. Dopo mezzanotte il traffico sui siti e sempre pochissimo e rimane tale per tutto il giorno, cominciando ad incrementare gradualmente a partire dalle 19.. ma gia alle ore 20 le cose si fanno complicate. Andiamo avanti! 
       
      2) Scegli video hosting affidabili! 
      Consigliamo di usare sempre MIXDROP per guardare i film in maniera ultra-rapida o per scaricarli senza problemi. Altri host come supervideo, speedvideo, gounlimited ecc usano pochissimi server quindi offrono una velocita spesso limitata. Mixdrop invece usa sistemi cloud e p2p, rendendo lo streaming ultra-rapido e ricordando vagamente i defunti Openload e Verystream. C'e chi dice che dietro ci siano gli stessi proprietari. Inoltre, Mixdrop usa una piattaforma propria, mentre tutti gli altri siti di hosting si affidano a XVideoPro, un software di video hosting non particolarmente amante della semplicita e della velocita. Insomma, credo che ci siamo capiti! 
       
      3) Non stressate troppo la vostra connessione mentre guardate o scaricate i film! 
      Questo punto dovrebbe essere ovvio, ma conosco personalmente un sacco di amici che usano la stessa ADSL per guardare video su youtube mentre stanno guardando film sul pc oppure mentre scaricano film da qualche altro sito. Dovreste cercare di non usare per niente la vostra ADSL durante la visione dei film in streaming e vedrete che i blocchi saranno ovviamente di meno!
       
      I SITI DI STREAMING SONO SENZA REGISTRAZIONE
      Tutti i siti di Film Streaming sono realmente senza registrazione ma ci fanno credere che sia necessario un account gratuito per continuare con la visione oppure con il download.
      Perche? Come i video hosting, anche i siti che riportano link come CB01, Altadefinizione ecc, sono siti gratuiti che si guadagnano da vivere offrendo spazi pubblicitari a vari advertiser. Il loro guadagno proviene da ignari utenti che cliccano sui bottoni 'Guarda il Film' - 'Guarda in HD' - 'Guarda in 4K' - 'Download HD' e via dicendo. Una volta cliccato su questi bottoni si viene reindirizzati ad una nuova pagina nella quale si trova un player fake con l'intro di qualche compagnia di produzione film come quelli dell'Universal, della Warner Bros ecc. Dopo l'intro che di solito dura 15-30 secondi appare un messaggio che ci invita a registrarsi per guardare il film gratuitamente.
      Cliccando su procedi si apre un nuovo sito che ci dira che per la registrazione e necessaria la carta di credito ai fini della convalida dell'account, affermando che non ci sara nessun addebito. In realta questa cosa non e vera dal momento che uno inserisce i dati, dopo 7 giorni di prova gratuita gli verranno scalati dei soldi dalla carta di credito e stiamo parlando di 60-100 euro (dipende da quale pubblicita utilizza il sito con questi bottoni). E anche se il servizio e a pagamento, in realta non state creando un account per CB01, Altadefinizione e altri siti di film streaming, ma state creando un account ad un servizio simile a Netflix che costa 10 volte tanto ed offre 100 volte meno film. Infatti il servizio in questione offre solamente film e serie tv datate che oramai non hanno nessun copyright e tutti possono pubblicarli gratuitamente.
      Insomma, cercate di non farvi fregare anche voi ed evitate questi bottoni. Nessun sito richiede la registrazione, basta solamente sapere dove cliccare per poter trovare il film ed evitare i vari banner fraudolenti. Solitamente tutti i siti scrivono il nome dell'Host che utilizzano per caricare il film e basta cliccare sul nome di questi ultimi per far apparire il video embed o per essere trasferiti sulla pagina dell'host e procedere con lo streaming o il download.
      Questa strategia e oramai utilizzata dal 100% dei siti italiani di film streaming quindi cercate di tenere bene a mente i nostri consigli per non piangere successivamente vedendosi scalare soldi inutilmente dal proprio conto corrente. Su alcuni siti ci sono anche dei popunder pubblicitari, ovvero delle pagine pubblicitarie che si aprono al primo click e che mostrano messaggi falsi come 'Sei il milionesimo visitatore', oppure 'Hai vinto un iPhone', oppure 'il tuo pc e infetto', oppure 'il tuo iphone e infetto' e via dicendo. Anche in questo caso bastera chiudere la scheda su google chrome e tornare nella scheda in cui avete aperto il vostro sito di film preferito. Queste pagine appaiono anche quando cliccate sul bottone play di mixdrop e degli altri siti di video hosting, ma basta chiuderli immediatamente e premere Play nuovamente per far partire lo streaming vero e proprio!
       
      COME ACCEDERE AI SITI DI FILM STREAMING BLOCCATI
      Oramai quasi tutto lo sapete benissimo: l'Italia sta diventando un vero inferno per i gestori di film in streaming. Possono bloccare qualsiasi sito dopo una segnalazione DMCA in meno di 2 settimane. Fino al 2017 le cose erano differenti ed i blocchi non erano cosi frequenti visto che si passava da un tribunale e da un giudice. Ora le cose sono diverse ed i tempi super ridotti. Ma come si fa per accedere a tutti i siti che bloccano continuamente?
      Ad esempio siti come CB01 (l'originale), Altadefinizione ed Eurostreaming vengono bloccati quasi ogni 10 giorni. E ci sono modi per accedere anche dopo i blocchi? Naturalmente si! Innanzitutto dovete sapere che il blocco e valido solo per coloro che abitano in Italia. l'AGCOM e in grado di forzare solamente gli ISP italiani a bloccare i siti pirata. Se siete quindi italiani che vivono all'estero allora non avrete nessun problema con nessun sito italiano di film streaming. Se invece vivete in Italia ci sono diversi metodi per accedere ai siti anche dopo il blocco! Iniziamo! 
      1) Usare una vpn gratis o a pagamento! 
      Una vpn e un software in grado di mascherare il vostro vero indirizzo IP e di farvi navigare con un ISP differente da quello che usate. E' utilissimo per tenersi protetti online e non far vedere a nessuno che state guardando film oppure scaricando giochi, software o altri. Ci sono tante vpn gratuite, ma quelle a pagamento sono molto meglio. I prezzi sono bassissimi se comprate abbonamenti a lungo termine. Per esempio se un mese costa 10 dollari, potete comprare l'abbonamento annuale a 40-50 dollari. Si tratta quindi di poco meno di 4 dollari al mese, una cifra bassissima per tutti i benefici che una VPN apporta! 
      2) Usare DNS differenti da quelli standard! 
      Usando i DNS di google oppure i dns di Opendns potrete accedere gratuitamente e rapidamente ad ogni sito bloccato in italia e nessuno potra fermarvi. Ci vogliono 10 secondi per cambiare i DNS e basta una piccola ricerca su google per capire come fare. Anche su youtube ci sono vari video che vi mostrano come usare i DNS google per accedere a ogni sito sotto censura! 
      3) Usate google per trovare i nuovi indirizzi dei siti streaming bloccati! 
      Solitamente dopo un blocco, Google ci mette un paio di giorni per far salire in alto il sito bloccato e riportarlo al primo posto. Cercando quindi il nome del sito, come ad esempio CB01, il primo risultato sara nuovamente il sito originale. In questi 3 modi potete accedere gratuitamente a tutti i siti di film e serie tv bloccati, quindi i metodi non mancano! Ci sono anche applicazioni per fare la stessa cosa ma non le consigliamo visto che potrebbero nascondere codici malevoli per usare i vostri dati o infettare i vostri dispositivi. Scegliete sempre uno di questi metodi e speriamo che i blocchi diventino meno frequenti. Sta diventando noioso fare sempre cose nuove per accedere a siti che fino a un paio di anni fa erano accessibili 24 ore su 24, 365 giorni l'anno!
       
      PERCHE CI SONO TANTI SITI DI STREAMING IDENTICI?
      Il fenomeno dei film streaming e cresciuto tantissimo nel corso degli anni e di conseguenza anche il numero di siti nuovi. Si tratta di copie che utilizzano lo stesso nome di un sito gia famoso come CB01 oppure Altadefinizione e cercano anche di replicare il loro design ed i loro contenuti. Ma questi siti copia sono sicuri? Assolutamente si! I Siti copia non fanno altro che pubblicare gli stessi contenuti dei siti originali cercando di guadagnarci qualcosa con le pubblicità.
      Ma a noi cosa ci importa? A noi utenti finali servono un numero infinito di siti per ovviare al problema dei blocchi quindi non ci importa se esistono 100 CB01, 100 Altadefinizione o 100 Eurostreaming.
      Alla fine tutti pubblicano ottimi contenuti usando gli stessi video hosting e cercando di battersi sul tempo, rendendo la disponibilita dei nuovi film sempre rapidissima. Insomma, un po' di sana concorrenza non fa mai male al mercato, anzi lo migliora totalmente. Ed anche nel caso dei siti di streaming le cose sono identiche. Speriamo che in futuro nascano nuove copie di tutti i siti famosi in modo che non rimaniamo mai senza fonti per vederci i nostri film preferiti. E fate attenzione che con tutte ste copie i film del cinema ora arrivano anche nello stesso giorno in qui vanno in onda! Evviva!
       
      FILM STREAMING SU FACEBOOK E TELEGRAM?
      Negli ultimi 2 anni e cresciuto molto l'utilizzo dei social network da parte dei gestori dei siti pirata per tenere informare i propri utenti sulle ultime novita e sui cambi di indirizzo (dominio). Sono cresciute cosi anche le ricerche su google con il titolo del film e la parola facebook oppure telegram. In Realta questa ricerca e inutile visto che i siti usano i social solamente per aggiornarci sui loro nuovi domini. Le ricerche dovrebbero quindi essere il nome del sito ed il nome del social network per trovare le loro pagine social ufficiali. Sembra pero che dal 2020 Facebook cancelli ogni pagina che riguardi i film streaming e che blocchi anche i loro gruppi, come accaduto all'Originale CB01.
      Telegram invece sembra essere molto tollerante verso siti del genere visto che ad oggi (Marzo 2020), tutti i siti hanno i loro canali telegram ufficiali dove ci tengono aggiornati ed ogni tanto postano anche i link dei film nuovi. Vi consigliamo percio di affidarvi a telegram e seguire i gruppi ufficiali di tutti i migliori siti di film in modo da non rimanere mai indietro oppure da perdervi l'ultimo link disponibile del vostro sito preferito. Ma essendo voi visitatori di Nuovolink.com questo problema non lo potete avere, visto che anche il nostro compito e lo stesso: tenervi aggiornati su ogni modifica da parte dei migliori siti di streaming e sperare di fare cosa gradita! Se non ci aiutiamo tra di noi, come possiamo sperare che i gestori mandino avanti i loro siti? Buona visione!
       
      COME RICONOSCERE LA QUALITA DI 1 FILM IN STREAMING
      I siti pirata usano degli acronimi per rivelare la qualita dei loro file. Solitamente basta guardare se sono file video a 360p, 480p, 720p, 1080p o 4k.
      In questo caso, i 360p sono solamente 360 pixel, quindi qualita abbastanza bassa e consigliata per una visione da mobile. La 480 sale un po' ma per un file in HD bisogna arrivare almeno a 720p. I film in Full HD invece sono rappresentati dalla scritta 1080p e sono sempre i migliori. Alcuni siti aggiungono anche la dicitura 4K ma solitamente il buffering e tremendo ed il blocco e continuo. Consigliamo percio di optare sempre per i 720p o i 1080p.
      Tutto dipende dalla vostra connessione. Su altri siti invece le qualita sono riportate in un modo differente, ovvero con delle parole accorciate che in pochi conoscono. Ecco il significato di quelle parole per riconoscere sempre la qualita di un film in streaming:
      CAM: Questa e la qualita peggiore e si riferisce solitamente a film appena usciti al Cinema quindi registrati con una videocamera di bassa qualita (nella maggior parte dei casi con la videocamera di uno smartphone). TS: Qualita simile ai film CAM ma la registrazione avviene tramite una videocamera migliore. Rimane comunque un film di bassa qualita che non consigliamo di vedere.. aspettate sempre una maggiore qualita! DVDSCR: Film registrato da una videocamera ma in casa, quindi non al cinema. In questo caso la qualita e molto meglio delle prime due ed e gia abbastanza per godere di file audio e video ottimi. DVDRIP: Film recuperato da un DVD quindi con ottima qualita ed e anche la qualita con la maggior percentuale di diffusione (subito dopo i film in HD.. anche se i dvdrip sono stati per anni al primo posto) HDTV: Film registrato dal televisore da una trasmissione in HD, quindi la qualita batte di poco quella dei Dvdrip! BDRIP: La migliore qualita di tutte visto che la fonte dalla quale viene recuperato il film e un Blu Ray! Di solito anche il peso di questi film e enorme percio evitateli se non avete connessioni adsl decenti! MD e LD: Questi si riferiscono alla qualita audio di un film e sono solitamente di bassa qualita. Per vedersi un film in santa pace preferite sempre film che hanno audio AC3. AC3: La migliore qualita audio di un film, ancora meglio se riuscite a trovarli in combinazione con file video BDRIP o DVDRIP. Quindi AC3/BDRIP!  
      FILM DA VEDERE: QUALI SCEGLIERE
      Grazie ad internet oggi e possibile trovare film da vedere raccolti in varie liste suddivise per anno o per genere. Noi pero preferiamo linkare alcuni siti utili che hanno pubblicato alcune delle migliori liste in circolazione, sperando di aiutarvi a trovare un titolo adatto alle vostre esigenze. Partiamo con un titolo un po' accattivante;
      1) I migliori 500 film da vedere prima di morire!
      Una bellissima lista proposta dal sito Filmalcinema.com che raccoglie ben 500 titoli di film bellissimi che dovreste guardare almeno una volta nella vostra vita. Movieplayer invece ci consiglia ben 32 film da vedere sulla piattaforma di Netflix, tutti scelti accuratamente dal loro staff. Un altro bellissimo sito del settore che consigliamo oggi si chiama 
      I Film da vedere e si suddivide in varie categorie di film imperdibili. Potete dargli un'occhiata quando avete tempo libero, magari troverete delle belle sorprese. Altri film ottimi da vedere sono i 10 Film da vedere durante la quarantena proposti da Panorama e disponibili su Netflix!
      Infine, per coloro che amano i classici consigliamo questa lista di film dal 1930 ad oggi reddata dallo staff di Filmpost.it! In futuro aggiungeremo altre liste di bellissimi film da vedere in tv e sulle varie piattaforme come Netflix e Amazon Prime Video. Per ora cercate di gustarvi questi titoli, ovviamente tutti reperibili sui siti di Film streaming indicati all'inizio di questa pagina!
       
      cb01
      Il sito numero 1 in Italia per numero di Film disponibili e per anni di attivita (E' online dal 2007)
       

       
      CB01 e in testa alla classifica dei siti italiani di Film Streaming per numero di utenti. Questo grazie alla sua longevita ed alla qualità che non e mai diminuita nel corso degli ultimi 10 anni. Il sito dispone sia di Film che di Serie TV, offrendo tanti link differenti per ogni filmato o episodio. I film sono catalogati per anno e per genere, ma non manca anche un form di ricerca semplicissimo da utilizzare ed adatto anche a chi non conosce minimamente i computer.
      CB01 Nuovo Indirizzo 2021: cb01.systems
       
      Altadefinizione
      Circa 9000 Film in qualita HD a 720p e 1080p. Il migliore se cerchi film in Alta Definizione!
       

       
      Altadefinizione e un sito che si e distinto per primo tra quelli che offrivano qualita HD per i vari film disponibili in streaming. Altadefinizione ha mantenuto la sua qualita anche dopo la chiusura di portali popolari come Openload e Verystream, spostando tutto su nuovi server senza intaccare la risoluzione dei filmati.
      Altadefinizione Nuovo Indirizzo 2021: altadefinizione01.plus
       
      Filmsenzalimiti
      Ottima alternativa ai primi due siti nominati, con un mix di Dvdrip e film in HD!
       

       
      Filmsenzalimiti e un sito che si piazza tra i primi siti per i vari film disponibili in streaming. Filmsenzalimiti ha mantenuto la sua qualita anche dopo la chiusura di portali popolari come Openload e Verystream, spostando tutto su nuovi server senza intaccare la risoluzione dei filmati.
      Filmsenzalimiti Nuovo Indirizzo 2021: filmsenzalimiti.gold
       
       

    • Due librerie GeoPandas e NetworkX, dati geografici e i grafi.
      GeoPandas è un estensione di Pandas, implementa due strutture dati: GeoSeries e GeoDataFrame.
       
      GeoSeries è essenzialmente un vettore dove ogni entrata o una geometria (shape) che deve essere vista come un osservazione unica; una singola shape (punto o poligono) o più shapes (più poligoni).
      Ogni entrata del mio vettore può essere qualcosa (come geometria) che può rappresentare uno o più cose.
      Classi basi di GeoPandas:
      Punti Linee Poligoni  
      GeoDataFrames è una tabella dove una colonna contiene GeoSeries. Ogni colonna può contenere geometrie, quella che contiene informazioni viene chiamata "geometry", possiamo accedere a tale campo con l'attributo (gdf.geometry) metodo built-in della libreria.
       
      %matplotlib inline //grafici sul notebook pip install geopandas //installare geopandas import pandas as pd //importiamo pandas import geopandas //trasformiamo pandas in geopandas import matplotlib.pylot as plt df = pd.DataFrame( {'City': ['Buones Aires', 'Brasilia', 'Santiago', 'Bogota', 'Caracas'], 'Country': ['Argentina', 'Brazil', 'Chile', 'Colombia', 'Venezuela'], 'Latitude': [-34.58, -15.78, -33.45, 6.60, 10.48], 'Longitude': [-58.66, -47.91, -70.66, -74.08, -66.86]}) df.head() // anteprima della tabella gdf = geopandas.GeoDataFrame( df, geometry=geopandas.points_from_xy(df.Longitude, df.Latitude))  
      GeoDataFrame ha bisogno di una geometria, quindi con il metodo points_from_xy() trasformo Longitudine e Latitudine, ora avremo anche la colonna geometry composta ad esempio da Point (-58.66 -34.58)
       
       
       
       
       
       
       
       
       

    • Come aprire su Windows e MAC  contenuti in streaming gratis usando link AceStream e Torrent.
      Nel corso degli anni la modalità di riprodurre e vedere contenuti multimediali in streaming è cambiata molto e da sistemi maccheronici e poco evoluti ora ci troviamo di fronte a piattaforme complicatissime che gestiscono terabyte di traffico dati video. AceStream da moltissimi anni è un sistema super diffuso che permette di riprodurre contenuti in streaming alla massima qualità possibile.
       
      Tra i migliori riproduttori di link AceStream c’è sicuramente Soda Player che è un software disponibile sia per Windows che per macOS e permette di avviare la riproduzione di streaming AceStream e Torrent in modo facile e veloce con un click. Ovviamente esiste il software Ace Stream Media che è una versione modificata di VLC, ma Soda Player funziona molto bene ed è molto leggero.
       
      Soda Player riprodurre tutti i link magnet dei file Torrent, Ace Stream e SopCast e dunque è un vero coltellino svizzero dei riproduttori video per le piattaforme P2P. Infatti questa tipologia di link, aumenta di qualità quanti più utenti sono connessi al link condiviso, e Soda Player, software completamente gratuito ed Open Source vi permetterà di aprirli agevolmente.
      Features Soda Player
      Streaming istantaneo dei video BitTorrent Proxy SOCKS5 integrato e ultraveloce Guarda su Chromecast e Apple TV Ottieni automaticamente i sottotitoli corrispondenti nella tua lingua Supporto nativo per collegamenti AceStream Supporto per tutti i formati e codec video Scaricare Soda Player
      Soda Player è disponibile gratuitamente sia per Windows che per macOS e potete scaricarla dal link seguente, ed installarlo in pochi click. Da notare come la versione per MAC non sia altrettanto performante come quella per Windows che è ottimizzata da anni e funziona benissimo. Quella per MAC comunque potete scaricarla e funzionerà a dovere anche se qualche crash è assicurato.
      ->Download Soda Player <-
      Dove trovare tantissimi link AceStream per guardare sport, film, serie TV e molto altro in streaming senza blocchi o rallentamenti
      AceStreamSearch è un fantastico motore di ricerca per link AceStream che permettono di vedere tutto lo sport ma anche accedere a canali TV in diretta live dove vedere film, serie TV, news e documentari il tutto senza pagare nulla. Esistono tanti siti che permettono di trovare link AceStream ma AceStreamSearch li batte tutti con la possibilità di trovate tutti i canali del mondo in un click.
       
      La forza dei link AceStream sta nel fatto che sono tutti link in alta qualità con una fluidità e definizione senza rivali. Infatti il più delle volte, i link degli eventi sportivi si vedono benissimo, senza scatti o blocchi e con una qualità almeno HD, ma anche FullHD ed in alcuni casi si possono trovare link in 4K. Con Ace Stream Search potremo trovarli tutti semplicemente ricercandoli nella barra di ricerca.
       

       
      Ace Stream Search è un sito web dove semplicemente aprendo il link giusto ed usando il programma per gestirli, vi permetterà di trovare link freschi freschi, selezionati e funzionanti per vedere tutto in streaming in altissima qualità. Andiamo a vedere come funziona e cosa si trova su questa fantastico portale dove trovare link AceStream sempre funzionanti ed aggiornati.
      Come funziona Ace Stream Search?
      Ace Stream Search funziona in maniera molto semplice e per ricercare un link AceStream dovete semplicemente cercare il nome del canale che volete vedere inserendo il nome sul box bianco centrale e poi premere sul pulsante azzurro SEARCH. In pochi secondi si caricherà una pagina con tutti i link da aprire con il software Ace Stream Media o Soda Player.
      Cosa si può vedere aprendo i link AceStream?
      Aprendo un semplice link AceStream da qualsiasi dispositivo potremo vedere gratis in streaming tutto lo sport, il calcio come la Serie A e la Champions League ma anche la Formula 1, Basket, NBA, MotoGP, Tennis e altri sport tutti in alta qualità anche se i canali in lingua Italiana sono rarissimi.
      Non mancano canali in live streaming anche se quelli sportivi sono i più gettonati per ovvi motivi di interesse. AceStream permetterà di vedere tutto con una qualità elevata sfruttando la rete Torrent. Infatti con AceStream accederai ad un link Torrent e vederlo subito in streaming al posto di scaricarlo.
      Come aprire i link AceStream?
      AceStream.org (Windows) Ace Stream Media (Windows) Soda Player (Windows e MAC) Sodaplayer (MAC) With Soda Player Estensione per Google Chrome AceStream Media e player Wuffy Dove trovare Link AceStream: Ecco Ace Stream Search
      Ace Stream Search è un fantastico portale dove trovare migliaia di link AceStream sempre pronti e disponibili. Sul sito indicato sono presenti per lo più link di eventi sportivi da tutto il mondo ma anche link di canali italiani da tutto il mondo, sempre funzionanti e che potete trovarli con un semplice click sul pulsante centrale.
      —> https://acestreamsearch.net/en/ <—

    • MacDrop il migliore sito web per scaricare app e giochi gratis per macOS
      MacDrop sicuramente è tra i migliori siti in circolazione dove poter scaricare applicazioni e giochi gratis per macOS. Su questo fantastico sito troverete anche app e giochi che sono a pagamento, in modo completamente gratuito, e in molti casi con crack, attivatori e trial reset inclusi nell’applicazione che andrete a scaricare così da usare tutto gratis.
       
      Se avete un computer Apple con macOS e volete installare le applicazioni e giochi al di fuori dall’AppStore dovete provare MacDrop ed una volta provato non ne farete a meno. Su questo sito trovate migliaia di applicazioni e giochi a pagamento in modo completamente gratuito ed in più tutte sono già craccate ed attivate così da non dover comprare la licenza.
       

       
      MacDrop è un portale super aggiornato, è facile da usare e con applicazioni e giochi già attivati per macOS da scaricare in pochi click (trovate la guida al fondo della pagina). Il sito è pieno di applicazioni e giochi da scaricare, e sarà sufficiente cliccare sul relativo link che ci rimanda al file hosting che rimanda al download della app o gioco velocemente.
      Come scaricare da MacDrop
      Accedete al sito ufficiale di MacDrop Cercante il programma che volete scaricare cercando scrivendo nel box bianco centrale dove c’è scritto Search here e poi date un Invio Scorrente in fondo alla pagina del software sotto la descrizione e cliccare su uno dei pulsante Download Now presente in basso (Se volete scaricare le vecchie versioni dell’app o gioco potete scaricare sul pulsante Archives) Così facendo si aprirà la pagina di Download ed una volta cliccato sul pulsante azzurro Download File (dovete inserire il codice Captcha) il download partirà in modo automatico  

       
      Altri siti come MacDrop
      torrentmac.net MAC-Torrents.io insMAC.org iPhoneCake.com  
       

    • Addon per Kodi  per sport in streaming con Apex Sports
      Apex Sports è un altro ottimo addon per Kodi che permette di accedere a tantissimi contenuti in streaming dedicati allo Sport da vedere in streaming gratis. Questo plugin per Kodi, che funziona anche sull’ultima versione Kodi 19, vi darà accesso a tutta la programmazione in diretta live dei maggiori eventi sportivi in tutto il mondo come il calcio, basket americano e altri sport americani, Formula 1, Moto GP e molti altri.
       
      In particolare tra le varie sezioni da navigare ci sono tutti i vari sotto menu dove andare a trovare i vari Sport suddivisi per categoria, dove poter vedere ad esempio il calcio Italiano, tutti i maggiori campionati di calcio europei, il basket europeo ad anche americano, i grandi tornei di Tennis e molti altri sport. Di seguito tutte le informazioni per installare l’addon Apex Sports sul vostro Kodi.
       

       
      Questo addon come al solito permette di accedere a tantissimi link funzionanti dove vedere i maggiori eventi sportivi da tutto il mondo con una qualità davvero notevole della riproduzione, anche se sono presenti in lingua estera, non Italiana ma solo in lingua inglese/americana. Ecco come installare Apex Sports sulla vostra versione di Kodi. Ecco le sezioni presenti:
       
      Live Sport Sites
      Livetv sx Mlb66 Nbabite Nhl66 Rojadirecta Soccerstreams Sportsurge Viprow Replay sites
      Nba com Mlb com Nhl com Fullmatchesandshows Fullmatchtv Replaymatches Come installare Apex Sports su Kodi
      Il primo passo da seguire ovviamente è quello di scaricare Kodi dal sito ufficiale CLICCANDO QUI e scegliere la versione per Windows, MAC, Android e altri dispositivi e sistemi operativi compatibili. Di seguito trovate la nostra guida dedicata su come installare un addons su Kodi, usando una Repository o un file ZIP che dovrete scaricare da internet ed avere già memorizzato sul dispositivo dove è avviato Kodi.
       
      Poi per installare Apex Sports su Kodi dovrai seguire questi semplici passaggi sul vostro Kodi (la procedura è identica su tutti i sistemi operativi) e quando indicato di inserire la repository dovrai mettere l’indirizzo https://arxtic-ape.github.io dove sono memorizzati una serie di addons per Kodi da installare con un click dopo aver installato la repo dove trovare Apex Sports.
      Avvia Kodi ed aspetti che si carichi la schermata della Home Scorri sulla voce Sistema Cliccate su Gestione File Doppio click sulla voce Aggiungi Sorgente Cliccate su <Nessuno> e inserisci l’indirizzo https://arxtic-ape.github.io Fai clic su Fatto per salvare la Repo Ora dovete Rinominare la nuova repository aggiunta in Ape e confermate selezionando il pulsante OK Ora devi torna nella home di Kodi andare sulla voce Sistema -> Add-On (Prima icona in alto a sinistra) -> Browser  -> Installa da un file zip  Infine devi cliccare su Ape -> repository.arxtic-ape-x.x.x.zip Attendete che l’installazione sia completata Ora vai alla home di Kodi vai su Sistema -> Add-On (Prima icona in alto a sinistra) -> Browser -> Installa da una Repository Clicca su arxtic-ape repository E vai in Video add-ons -> ApeX Sports Seleziona Installa Apex Sports all’ultima versione disponibile L’addons verrà ora scaricato e installato Vai alla Home e nella sezione Video troverai l’addons Apex Sports installato  
      Ora che avete installato l’addon Apex Sports su Kodi andante in nella home di Kodi per aprire tutti gli l’addon Video e godervi il miglior media center configurato con uno dei migliori addons per vedere tutto lo Sport in streaming gratis.
       

    • Trucco per usare Telegram in maniera  anonima.
      Telegram è la seconda app di messaggistica più usata al mondo, subito dietro WhatsApp, e per usarla dovete registrarvi usando il vostro numero di telefono. A differenza di WhatsApp però, Telegram permette di disabilitare la condivisione del numero di telefono e comunicare solamente usando il nickname che ci permetterà di messaggiare senza dire il nostro numero di cellulare.
      Infatti su Telegram è possibile impostare la condivisione del numero con nessuno mostrando solo il nostro nickname, ma se volete restare in maniera completamente anonima nascondendo sia il vostro numero che il nickname come si fa? Quindi come è possibile usare Telegram in modo completamente anonimo? E’ possibile grazie ad un trucco ed una fantastica app. Vediamo come fare.
      **Nnascondere il numero di telefono di Telegram ai contatti?
      A differenza di altre app di messaggistica, su Telegram è possibile nascondere il proprio numero di telefono. Questo perché è un’opzione obbligatoria per registrarsi al servizio e che permette di comunicare con altri utenti che usano Telegram, non solo con il numero ma anche anche con il nickname, e noi possiamo decidere quale delle due informazioni condividere con i nostri contatti, il numero o il nickname.
      Infatti accedendo alle Impostazioni di Telegram (tre linee orizzontali in alto a sinistra e poi su Impostazioni) e poi è andato in Privacy e sicurezza -> Numero di telefono ed ha settato l’opzione Nessuno o solo I miei contatti, il numero non verrà visto rispettivamente da nessuno oppure dai suoi contatti memorizzati sul telefono.
       

       
      Se però volete usare Telegram in maniera completamente anonima, ecco la guida per farlo.
       
      Come usare Telegram anonimo [Guida]
      Potete usare Telegram con un numero VoIP in modo da non usare il vostro numero di telefono principale per comunicare con altri utenti. Ne esistono tante di app e servizi che permettono di generare numeri reali ma il migliore di tutti, che funziona bene ed è anche gratuito si chiama Talkatone e permette di creare un numero senza fornire i nostri dati personali. Ecco come fare:
      Installa Talkatone sul vostro dispositivo Android cliccando QUI Avvia Talkatone e clicca sul pulsante Sign In Ora potrai completare la registrazione e potrai usare l’account Facebook (sconsigliato), quello GMail oppure creare un account con dati inventati ed usare una mail falsa che potete generare su eMail Fake Completate la registrazione e poi scegliete uno dei numeri che l’app vi suggerirà, Consiglio usa uno Americano Ora apri Telegram ed inserisci il numero di telefono creato in precedenza mettendo come prefisso 1 (che è quello americano) Per convalidare l’account appena creato su Telegram dovrai cliccare su Chiamami e rispondere dall’app Talkatone inserendo il codice di verifica ricevuto nella chiamata (che sarà in inglese) oppure attendere il codice per messaggio (sempre su Taltone) Ora hai creato il nuovo account Telegram usando un numero Americano che sarà completamente anonimo poiché nessun dato sarà riconducibile a te
        Su Telegram alcuni canali e bot, potrebbero riconoscere il tuo numero VoIP e bloccare l’accesso ai gruppi e canali ed anche BOT ed inoltre per i primi giorni (di solito 1 o 2) potrebbe essere disabilitato dall’invio di messaggi agli utenti.
       

    • Tutto in streaming gratis su Kodi, Android e decoder con TiVuStream
      TiVuStream è un bellissimo progetto tutto Italiano, che si presenta come addon per Kodi, applicazione per Android ed anche come estensione per Enigma2. TivuStream include contenuti liberi, come i canali Italiani del digitale terrestre, canali musicali, radio TV Italiane ed Internazionali, canali di informazione, webcam , contenuti VOD liberi da vincoli di Copyright e molti canali per adulti.
      TiVuStream di recente ha ricevuto un corposo aggiornamento che vede la compatibilità estesa oltre che ai dispositivi Android come smartphone e tablet, ma anche su Android TV e Fire Stick. L’applicazione indicizza solo contenuti gratuiti disponibili in streaming e tra questi possiamo trovare tantissimi canali disponibili in chiaro, molti canali per Adulti, regionali, di musica e canali di sport e altri.
       
      L’applicazione e l’addon per Kodi di TiVuStream permettono di accedere ad una incredibile seleziona di canali sempre aggiornati con un’ottima qualità di riproduzione, senza rallentamenti o buffering. Al momento esistono diversi progetti di TiVuStream disponibili per diverse piattaforme che soddisfano tutta l’utenza che vuole vedere contenuti in Italiano:
       
      TivuStreamApp Live e VOD L’applicazione dedicata a tutti i dispositivi Android TivuStreamAppTv compatibile con Android TV e Fire Stick TivuStreamPRO KODI Addon L’Addon per Kodi di TivuStreamPRO TivuStream KODI Repository Repository per Kodi dove poter scaricare sempre l’ultimo addon disponibile ed aggiornato TivuStream KODI Addon XXX con contenuti per adulti (la password dovete richiederla all’indirizzo mail [email protected])  

       
      Come installare TiVuStream su Kodi
      Il primo passo da seguire ovviamente è quello di scaricare Kodi dal sito ufficiale CLICCANDO QUI e scegliere la versione per Windows, MAC, Android e altri dispositivi e sistemi operativi compatibili. Di seguito trovate la nostra guida dedicata su come installare un addons su Kodi, usando una Repository o un file ZIP che dovrete scaricare da internet ed avere già memorizzato sul dispositivo dove è avviato Kodi. (GUIDA Installare Addons su Kodi)
       
      Poi per installare TiVuStream su Kodi dovrai seguire questi semplici passaggi sul vostro Kodi (la procedura è identica su tutti i sistemi operativi) e quando indicato di inserire il file ZIP dovrai mettere l’indirizzo https://tivustream.website/urls/kodipro102 dove è memorizzato l’addon per Kodi da installare con un click. Ecco come fare:
       
      Scarica addon TiVuStream Avvia Kodi ed aspetti che si carichi la schermata della Home Scorri sulla voce Sistema Ora vai su Add-On (Prima icona in alto a sinistra) -> Browser  -> Installa da un file zip  Infine devi cliccare sul file ZIP precedentemente scaricato plugin.video.tivustreampro-X.X.X Attendete che l’installazione sia completata L’addons verrà ora scaricato e installato Vai alla Home e nella sezione Video troverai l’addons TiVuStream installato
        Ora che avete installato l’addon TiVuStream su Kodi andante in nella home di Kodi per aprire tutti gli l’addon Video e godervi una delle migliori soluzioni per Kodi per vedere tantissimi contenuti in Italiano in streaming gratis. Un addon che non deve mai mancare se volete solo contenuti in Italiano con link in chiaro e anche le TV regionali.
      Come installare TiVuStream su Android
      Per usare TiVuStream su Android dovete scaricare ed installare il file APK disponibile sul sito ufficiale e dalla versione 1.5 non è più necessario installare i lettori esterni come XMTV o Wuffy poiché integra un lettore nativo interno. L’ultima versione è compatibile anche con Fire Stick, Android TV e molti altri dispositivi come TV Box Android.
      TiVuStream XXX per Android invece è la versione con contenuti per adulti e potete scaricarla dal sito ufficiale https://tivustream.com/appx/. Per sbloccare l’accesso completo a tutte le sezioni dovete richiedere la password via mail agli sviluppatori. Questa app contiene solo contenuti XXX quindi dedicato ad un pubblico adulto.
      Come installare TiVuStream su Enigma2
      Esiste anche TivuStream su Enigma2, quei decoder che permettono di installare plugin esterni e per installare l’ultima versione disponibile dovete seguire le informazioni presenti sul sito ufficiale del progetto cliccando qui https://tivustream.com/tag/enigma2/. Se avete un decoder “modificato” dovete allora provare questo fantastico plugin.
       
       

    • Sito web dove vedere tutto lo sport in streaming gratis simile a Torrent Bay
       
      SportsBay è un sito di streaming online che permette di vedere tutti gli eventi sportivi in diretta live di tutti gli sport da tutto il mondo. Il sito funziona sia su dispositivi mobili che da desktop ed è completamente gratuito senza limitazioni e vi permetterà di accedere a tantissimi eventi live di sport ma anche molto altro, come i canali della TV.
       
      Come abbiamo visto su numerosi altri siti del genere come Stream2Watch, SoccerOn, SportLiveFree o Wigilive sono siti dedicati allo sport in generale, ma SportBay fa di più perché oltre ad offrire una vetrina per tutti gli sport in diretta, ha anche una nutrita sezione dove vedere anche i canali della TV in diretta live, con tantissimi canali Italiani.
       

       
      Fatto l’accesso a SportsBay troverete una barra in alto con le diverse sezioni del sito dove potrete selezionare lo sport che volete vedere in streaming. Cliccandoci sopra entrerete nel relativo mondo dello sport gratis in streaming con qualche canale in Italiano.
      SportsBay: Sport (e la TV) in streaming TUTTO gratis
      Accedendo al link principale di SportsBay avrete accesso alle diverse sezioni del sito web, che vi aprirà un mondo incredibile di streaming accessibile da web da qualsiasi browser e di link tutti attivi e funzionanti ed ha anche un canale Twitter dove vedere le ultime notizie. Tutte le sezioni, una volta cliccate sopra si apriranno i vari link dove avviare la riproduzione dell’evento.
       
      SportsBay è un sito web dove troverete tutti i collegati aggiornati e funzionanti dei maggiori, se non tutti, gli eventi sportivi da tutto il mondo da vedere in streaming gratis, il tutto senza attese e con una qualità elevata. Tutto il calcio, le coppe internazionali, il basket, tennis, Formula 1, Moto GP e molti altri sport in streaming gratis.
      Ecco le categorie che troverete accedendo al sito SportsBay:
      Footbal Basket Tennis Rugby Sezione Motorsport dove vedere Formula 1, Moto GP, Nascar e altro Wresling NCAA Cricket NFL Baseball a molti altri
        Nella sezione in basso potrete vedere gli eventi in diretta in quel momento, cliccando sul pulsante Live Sports dove troverete tutti gli eventi in diretta streaming in quel preciso momento organizzato in orario cronologico. Poi sarà sufficiente cliccare su Play per avviare lo streaming in pochi secondi. E’ presente un po’ di pubblicità ma potete evitarla con i metodi seguenti.
      SportsBay: player video e pubblicità
      Se il primo link dovesse essere di qualità scarsa o non in Italiano, potete provare a cliccare sugli altri link presenti appena in basso al player video dove avete avviato lo streaming. Di solito sono presenti almeno un paio di Link dello stesso streaming e vi consiglio di provarli tutti così da trovare quello migliore e magari anche con commento in Italiano.
       
      C’è tanta pubblicità ma se usate ad esempio un buon AdBlock lo streaming partirà velocemente, senza attese e con quasi la totalità di assenza di pubblicità. Infatti installando un AdBlock, non vedrete più alcuna pubblicità durante lo streaming ma solo quelle che non riesce a bloccare.
       

       
      Nuovo indirizzo SportsBay
      Ecco come accedere a SportBay con l’ultimo indirizzo funzionante che aggiorneremo se cambierà nome o dominio.
       
      -> Link Sito SportsBay <-
      -> Link Sito SportsBay Contenuti Italiani <-

    • Applicazione per vedere tutto il calcio in streaming gratis su Android e la scaricate dal Play Store. Ecco Live Football TV HD Streaming
      Live Football TV HD Streaming è una nuova applicazione per Android che permette di accedere a tantissimi eventi in live streaming dedicati al calcio. Come tante altre app simili trasmette contenuti in maniera completamente gratuiti dei maggiori campionati di calcio internazionali dalla Serie A alla Liga Spagnola, fino alla Champions League e l’Europa League.
      L’applicazione si chiama Live Football TV HD Streaming ed è incredibilmente presente sul Google Play Store da scaricare senza alcun problema sul vostro smartphone o tablet Android. L’app permette di vedere tutto il calcio in streaming gratis semplicemente accedendo all’app e selezionare l’evento che volete visionare sul vostro dispositivo Android dal player video integrato.
       
      L’app funziona alla perfezione, permette di vedere tantissimi eventi in streaming gratis dal nostro dispositivo Android, e grazie al player integrato non dovete neanche installare un’app esterna per avviare la riproduzione. Purtroppo da segnalare come non siano presenti contenuti in lingua Italiana ma gli altri si vedono bene e funzionano alla perfezione.
      Potrete anche guardare le tue partite di calcio preferite dalle competizioni Champions League e Europa League e dai campionati internazionali Premier League Inglese, FA Cup, La Liga, Coppa del Re, Bundesliga, Serie A, Coppa Italia, MLS, Ligue 1, Coppa del Mondo, UEFA Euro e molti altri in corso senza alcun buffering o blocco durante la riproduzione.
      Sicuramente un’applicazione da provare assolutamente anche se ci sono diversi annunci pubblicitari che possono dare fastidio anche se non sono invasivi e si saltano sempre cliccando su una grande X ai lati. La navigazione nei menu è semplice e suddivisa in campionati e competizione così da trovare subito la partita di calcio che vi interessa.
      Live Football TV HD Streaming è disponibile per dispositivi Android funziona sia su smartphone che tablet ed anche su Fire TV Stick e diversi Box TV Android. Potete anche installarlo su un normale computer Windows, MAC o Linux usando un emulatore come Bluestack. Quindi in pratica è un’app universale per vedere tutto il calcio in streaming.
       

      Dove scaricare Live Football TV HD Streaming
      Live Football TV HD Streaming è scaricabile all’indirizzo seguente dove scaricherete l’app direttamente dal Play Store ufficiale di Google, quindi sicura e senza virus sul vostro smartphone o tablet Android. Una volta installato la avviate e cercate i canali e le icone dove vedere la partita con l’immagine che vedete in apertura articolo.
      -> Download APK Live Football TV HD <-
       

    • Stream2watch sito web per ogni Sport  in streaming gratis
      Stream2watch sito web per vedere in streaming tutto lo sport che desiderate gratis con link sempre funzionanti anche se in Italiano si trovano pochissimi canali. Negli ultimi mesi è salito alla ribalta per aver inserito una quantità incredibile di canali live dove trasmettono sport in streaming gratis.
       
      Stream2watch, raggiungibile all’indirizzo Stream2watch.one, al primo accesso si presenta con una barra bianca di ricerca dove ricercare il nome del canale o dell’evento e poi i pulsantoni con tutti gli sport organizzati in basso, aggiornati in tempo reale. Infatti il sito è facilissimo da navigare dove trovare gli eventi On-Air con tutti gli sport in elenco dopo aver selezionato la categoria.
       
      Fatto l’accesso a Stream2watch troverete dunque le diverse sezioni del sito ed il primo filtro di ricerca, è quello di selezionare lo sport che volete vedere in streaming. Cliccandoci sopra entrerete nel relativo mondo dello sport gratis in streaming con qualche canale in Italiano. Insomma un sito da salvare tra i preferiti e da usare da qualsiasi browser anche se vi ricordo è ILLEGALE.
       

       
      Stream2watch: Lo sport in streaming non è più lo stesso. TUTTO gratis
      Accedendo al link principale di Stream2watch avrete accesso alle diverse sezioni del sito web, che vi aprirà un mondo incredibile di streaming accessibile da web da qualsiasi browser e di link tutti attivi e funzionanti ed ha anche un canale Telegram dove vedere le ultime notizie. Tutte le sezioni, una volta cliccate sopra si apriranno i vari link dove avviare la riproduzione dell’evento.
      Stream2watch è un sito web dove troverete tutti i collegati aggiornati e funzionanti dei maggiori, se non tutti, gli eventi sportivi da tutto il mondo da vedere in streaming gratis, il tutto senza attese e con una qualità elevata. Tutto il calcio, le coppe internazionali, il basket, tennis, Formula 1, Moto GP e molti altri sport in streaming gratis.
      Ecco le categorie che troverete accedendo al sito Stream2watch:
      Soccer (Calcio) Basketball Tennis Rugby Mortosports (Formula 1 e Moto GP) Wresling UFC Boxing NFL Baseball a molti altri  
      Nella sezione in basso potrete vedere gli eventi in diretta in quel momento, cliccando sul pulsante Today’s live Sports schedule dove troverete tutti gli eventi in diretta streaming in quel preciso momento organizzato in orario cronologico. Poi sarà sufficiente cliccare su Play per avviare lo streaming in pochi secondi. E’ presente un po’ di pubblicità ma potete evitarla con i metodi seguenti.
      C’è tanta pubblicità ma se usate ad esempio un buon AdBlock lo streaming partirà velocemente, senza attese e con quasi la totalità di assenza di pubblicità. Infatti installando un AdBlock, non vedrete più alcuna pubblicità durante lo streaming ma solo quelle che non riesce a bloccare.
      Nuovo indirizzo Stream2watch
      Ecco come accedere a Stream2watch con l’ultimo indirizzo funzionante che aggiorneremo se cambierà nome o dominio. Inoltre c’è anche il canale Telegram dove ricevere le ultime informazioni sul sito con le funzionalità e le sezioni aggiunte.
       
      -> Link Sito Stream2watch <-
       
      Su internet esistono decine e decine di siti che trasmettono eventi live ma noi abbiamo selezionato i migliori di tutti che permettono di vedere tutti i campionati nazionali in diretta streaming come Primera Division, Seria A, Bundensliga, Premier League, Europa League, Champions League e molti altri campionati. Di seguito trovate un elenco aggiornato dei migliori siti di sport in streaming gratis.
       
      Tutti gli stream vengono avviati un’ora circa, prima dell’inizio della partita, dandoti abbastanza tempo per prepararti un sacchetto di popcorn e chiamare i tuoi amici per unirsi a te. La maggior parte di questi siti hanno una grafica semplice ma intuitiva, con tutti gli eventi organizzati per sport e in ordine cronologico, dove cliccare ed avviare lo streaming senza problemi.
       
      Migliori alternative a Stream2watch per vedere tutto lo Sport in Streaming Gratis
      Tra le nostre scelte ovviamente non potevano mancare delle soluzioni storiche come Rojadirecta, FirstRow o CricFree ma anche diversi per vedere lo sport in streaming recenti, ma che funzionano benissimo come SportLiveFree, Socceron o WigiLive e poi ci sono anche altre soluzioni che funzionano benissimo e sono pieni di link come Sport365, Sportp2p ed altri selezionati.
       
      https://sportlive.name https://socceron.in/ https://wigilive.com http://rojadirecta.tv https://socceron.in/ https://sportsbay.org/country/italy https://www.vipleague.lc/ http://firstrow.co http://www.sport365.live/en/main https://cricfree.sc/football-live-stream-5 http://www.sportp2p.com/live-sport http://wiziwig1.com http://atdhe.us https://fr.vipleague.cc  

    • FilmPlus è una fantastica applicazione per Android che permette di vedere Film e Serie TV in streaming gratis. Ecco come installarla
      FilmPlus è un clone di TerrariumTV che permette di guardare film, serie TV, programmi e documentari gratuitamente in streaming su dispositivi Android, Amazon Fire Stick, Fire TV, Nvidia Shield, Android TV Box e molti altri dispositivo. L’applicazione è piena di contenuti, sono davvero tantissimi, attingendo da numerosi fonti sul web, tutti ben organizzati e facili da trovare.
      Con FilmPlus avrete accesso a migliaia di contenuti sempre disponibili di qualità, accuratamente selezionati per essere visibili anche in alta definizione e super aggiornati. FilmPlus usa la tecnologia di link scraping che permette di andare a scansionare il web alla ricerca di nuovi link per renderli disponibili dentro l’applicazione in tempo reale.
       
      Su FilmPlus potete trovare contenuti in alta definizione, sia in FullHD ma anche in 4K, permette di trovare qualsiasi film o programma televisivo che desideri usando la comoda funziona di ricerca. Potrete trovare Film, Serie TV, Documentari e programmi televisivi aggiornati di frequente che funzionano tutti benissimo e con una qualità eccellente.
      Sicuramente una delle app migliori da avere e provare sebbene i contenuti disponibili in lingua Italiana non siano tantissimi ma comunque ci sono e si trovano, basta cercare il titolo e vedere i dettagli dello streaming per capire se sono in lingua originale oppure anche in Italiano. Di seguito la procedura da seguire per scaricare ed installare FilmPlus su Android (smartphone, tablet e TV Box) e anche su Fire Stick.
       

       
       
      Come installare FilmPlus su Amazon Android
      Scarica il file APK di FilmPlus direttamente dal tuo dispositivo Android Download APK FilmPlus Una volta scaricato il file APK, aprilo con un normale File Manager come File Expert o Astro Clicca sul file APK e installa il file Se ti richiede di abilitare le origini sconosciute  
      Come installare FilmPlus su Amazon Fire TV Stick, Cube, ecc
      La guida che trovate di seguito vede il primo passo completarsi con l’installazione di FileLinked sul tuo dispositivo Fire TV ma se hai già installato FileLinked puoi passare direttamente al codice per l’installazione in fondo. Ecco come fare per installare FilmPlus sulla Fire TV Stick, Cube ed altri della gamma Fire TV in modo facile e veloce.
      Apri Fire TV Stick o Fire TV Seleziona Impostazioni Vai in Impostazioni e scorri verso il basso Seleziona La mia Fire TV o Dispositivo Seleziona la voce Opzioni sviluppatore Seleziona App da origini sconosciute Seleziona Attiva Ora torna alla schermata principale e spostati sul pulsante Trova e quindi seleziona la voce Cerca in basso Ora usa la tastiera e inizia a digitare Downloader . Una volta che vedi Downloader sotto selezionalo Nella schermata successiva seleziona l’icona Downloader Seleziona Scarica Una volta scaricato seleziona la voce Apri Seleziona dunque Consenti quando ti viene chiesto di concedere a Downloader l’accesso ai file (autorizzazione necessaria) Seleziona OK una volta aperta l’app Ora vedrai la seguente schermata. Seleziona la sezione URL Digita get.filelinked.com e seleziona il pulsante in basso Vai FileLinked verrà ora scaricato e non appena terminato il download dovrai selezionare la voce Installa in basso a destra Una volta completata l’installazione, seleziona il pulsante Fine Seleziona Elimina per eliminare il file APK che ora è inutile visto che è stato già installato Seleziona di nuovo il tasto Elimina Torna alla schermata principale e seleziona Avvio applicazioni Seleziona l’app FileLinked Al primo avvio devi immettere il codice 51829986 per scaricare la versione AdFree, consigliato, oppure 26337862 per scaricare la versione ufficiale di FilmPlus e quindi selezionare Continua Premi Ignora ogni volta che viene visualizzato un popup Seleziona Cerca file Digita filmplus e seleziona Avanti Seleziona FilmPlus Ad Free Selezionare FilmPlus Ad-Free di nuovo Seleziona Installa Seleziona Fatto Torna alla schermata principale e quindi seleziona Avvio applicazioni FilmPlus si troverà in questa schermata che puoi avviarla in un click e goderti dello spettacolo in streaming con Film e Serie TV  


    • Eventi di sport in streaming da vedere in alta definizione
      VipLeague è un sito di streaming online attivo da diversi anni che permette di vedere tutti gli eventi sportivi in diretta live di tutti gli sport da tutto il mondo. L’accesso al sito è completamente gratuito e potrete accedere a tutti gli sport in streaming con tantissimi link di qualità, sempre funzionanti, anche canali in Italiano e che si bloccano molto raramente.
       
      VipLeague indicizza molto bene tutti gli eventi e semplicemente cliccando sulla relativa sezione di sport che volete vedere come il Calcio o la Pallacanestro per veder caricare la lista degli eventi in diretta in quel momento e nelle ore successive.
       
      Su VipLeague troverete tutti i quadratoni dove accedere alle diverse sezioni del sito dove potrete selezionare lo sport che volete vedere in streaming. Cliccandoci sopra entrerete nell’elenco completo degli eventi sportivi gratis in streaming con diversi canali in Italiano (anche se non sono il pezzo forte di questo sito).
       

       
      VipLeague: Streaming gratis con dirette Calcio
      Su VipLeague avrete accesso alle diverse sezioni del sito web, che vi aprirà un mondo incredibile di streaming accessibile da web da qualsiasi browser e di link tutti attivi e funzionanti. Cliccando sul relativo sport, troverete tutte le sezioni degli sport da vedere, una volta cliccato sopra si apriranno i vari link dove avviare la riproduzione dell’evento.
       
      VipLeague è un sito web dove troverete tutti i collegati aggiornati e funzionanti dei maggiori, se non tutti, gli eventi sportivi da tutto il mondo da vedere in streaming gratis, il tutto senza attese e con una qualità elevata. Tutto il calcio, le coppe internazionali, il basket, tennis, Formula 1, Moto GP e molti altri sport in streaming gratis.
      Ecco le categorie che troverete accedendo al sito VipLeague:
      UFC WWE Boxe Formula 1 MotoGP Football americano Pallacanestro Baseball Hockey Tennis Golf Calcio Rugby Regole australiane Freccette Palla a mano Da corsa Nascar Motorsports Ciclismo Snooker Altri Nella sezione in basso potrete vedere gli eventi in diretta in quel momento, cliccando sul pulsante dello sport che volete vedere troverete tutti gli eventi in diretta streaming in quel preciso momento organizzato in orario cronologico. Poi sarà sufficiente cliccare su Play per avviare lo streaming in pochi secondi. E’ presente un po’ di pubblicità ma potete evitarla con i metodi seguenti.
      VipLeague: come accedere al nuovo dominio
      Se il primo link dovesse essere di qualità scarsa o non in Italiano, potete provare a cliccare sugli altri link presenti appena in basso al player video dove avete avviato lo streaming. Di solito sono presenti almeno un paio di Link dello stesso streaming e vi consiglio di provarli tutti così da trovare quello migliore e magari anche con commento in Italiano.
       

       
      C’è tanta pubblicità ma se usate ad esempio un buon AdBlock lo streaming partirà velocemente, senza attese e con quasi la totalità di assenza di pubblicità. Infatti installando un AdBlock, non vedrete più alcuna pubblicità durante lo streaming ma solo quelle che non riesce a bloccare.
      VipLeague: nuovo indirizzo del sito
      Ecco come accedere a VipLeague con l’ultimo indirizzo funzionante che aggiorneremo se cambierà nome o dominio. Inoltre c’è anche la sezione dedicata agli sport in diretta in quel momento oppure quelli che stanno per iniziare a breve. Ecco l’ultimo link funzionante di VipLeague:
      Link Nuovo Sito VipLeague:
      https://www.vipleague.cc/  
       

    • Lepto Sports è app Android per vedere tutti gli sport in streaming gratis live
      App che permettono di vedere moltissimi contenuti in streaming gratis ce ne sono tantissime ma Vola Sports era tra le migliori. Abbiamo usato il passato perché è stata sostituita da Lepto Sports ed anche questa permette di vedere le partite di calcio e tutto lo sport in generale in streaming gratis su Android. In questo articolo andremo a vedere cosa offre e dove scaricarla.
      Spesso le app vengono bloccate e neanche il tempo di chiudere che ne nascono di nuove, è il caso di Vola Sports, un’app che forse ha attirato troppi occhi e che per ovvii motivi è stata chiusa e non funziona più. Per fortuna la sostituta, si chiama Lepto Sports e proprio come la vecchia Vola è disponibile per tutti i dispositivi con sistemi operativi Android ed anche per Fire TV Stick di Amazon.
       
      Lepto Sports permette di avere accesso a migliaia di link freschi freschi e sempre aggiornati e funzionanti per vedere tutto il calcio e lo sport in streaming gratis. L’applicazione Lepto Sports è disponibile per smartphone e tablet Android, set-top-box Android ed anche con la chiavetta Fire Stick così da accedere in pratica da qualsiasi dispositivo facilmente.
       


      Cos’è e come funziona Lepto Sports
      L’applicazione è ben fatta ed una volta installata sul vostro dispositivo vi troverete di fronte alla pagina con l’elenco degli eventi in programma in quel momento ed accedendo ad ogni partita o altro evento sportivo compariranno tutti i link dove vederlo. Di seguito alcuni dettagli dell’applicazione:
      Fornisce agli utenti i programmi delle partite che usi per tenere traccia delle partite e dei vincitori di ogni partita. Puoi optare per l’aggiornamento del punteggio in tempo reale dell’app. Se lo scegli, riceverai frequentemente la notifica in tempo reale insieme ai punteggi. Puoi guardare le partite in qualsiasi qualità ti piaccia. Puoi guardare in HD o in qualità normale a seconda della disponibilità della tua rete. Puoi anche leggere le ultime notizie sulle prossime partite di calcio, Nessuna pubblicità nell’app. Alcune app di streaming sportivo ti strozzeranno con gli annunci e ti distrarranno in tutti i modi possibili. Ma questa app rispetta le esigenze degli utenti e non ha alcuna pubblicità. Nessun blocco geografico viene eseguito nell’app. Puoi guardare tutte le partite da qualsiasi parte del mondo. Questa app è supportata da tutti i dispositivi Android e puoi installarla anche nel Firestick. La modalità fortemente oscura è disponibile ed è abbastanza comoda per gli utenti. Download Lepto Sports Gratis e senza pubblicità
      Lepto Sports non è disponibile sul Google Play Store ma potete scaricarlo dal sito web ufficiale con solo due versioni disponibili tra quella per Android classica disponibile per smartphone, tablet e set-top-box ed una particolare versione dedicata per Amazon Fire TV Stick. Ecco i link per scaricare il file APK di Lepto Sports da installare direttamente sul vostro dispositivo:
       
      -> Link Download APK Lepto Sports &nbsp;<-
      -> Link Download APK Lepto Sports ADS Free (senza pubblicità) <-
       
       

    • Programmazione Funzionale
      Esistono tre meccanismi principali ereditati dalla programmazione funzionale:
      Map Filter Reduce  
      Map
      Map applica una funzione func a tutti gli elementi di una input_list
       -> map(func, input_list)
      items=[1,2,3,4,5] squared=[] for i in items: squared.append(i**2) #con map items=[1,2,3,4,5] squared=list(map(lambda x: x**2, items))  
      -> funzione len(), lista['how', 'are', 'you']
      >>> print(list(map(len, ["how", "are", "you?"]))) [3, 3, 4]  
      Una definizione più corretta:
       -> map(func, *iterables)
      * significa che posso passare un numero x di oggetti iterabili (pari al numero di parametri che richiede la funzione)
      In Python 3 la funzione map ritorna un oggetto di tipo map object che è un generator object
      In Python 2 restituiva una lista
      Per ritornare una lista usare il metodo list
      my_pets=['alfred','tabitha','william','arla'] uppedred_pets=[] for pet in my_pets: pet_=pet.upper() uppered_pets.append(pet_) print(uppered_pets) #con map my_pets=['alfred','tabitha','william','arla'] uppered_pets=list(map(str.upper, my_pets)) print(uppered_pets)  
      my_pets=['alfred','tabitha','william','arla'] uppered_pets=map(str.upper, my_pets) print(uppered_pets) print(type(uppered_pets)) for i in uppered_pets:print(i) ========== <map object at 0x10..> <class 'map'> ALFRED TABITHA WILLIAM ARLA >>>  
      Esempio map con oggetti iterabili più di uno
      circle_areas=[3.56773, 5.57668, 4.00914 23.0101, 9.01344, 32.00013] result=list(map(round, circle_areas, range(1,7))) print(result) =========== RESTART: [3.6, 5.58, 4.009, 56.2424, 9.01344, 32.00013] >>>  
      Filter
      Filter() restituisce un oggetto iteratore composto dagli elementi per i quali la funzione restituisce true
      richiede che la funzione restituisca valori booleani e "filtra" via gli elementi falsi
      filter(func, iterable)
       
      Filter vs. map
      A differenza di map(), è richiesto solo un iterabile
      L'argomento func deve restituire un tipo booleano.
      In caso contrario, filter restituisce semplicemente l'iterabile passato a func
      Poichè è richiesto un solo oggetto iterabile, è implicito che func debba accettare solo un argomento
      scores=[60, 90, 55, 59, 76, 70, 88, 70, 81, 65] def filtering(score): return score>70 over_70=filter(filtering, scores) over_70_list=list(over_70) print(over_70_list) print(type(over_70)) =========== [90, 76, 88, 81] <class 'filter'> >>>  
      Se la funzione è None, viene assunta la funzione identità, ovvero vengono rimossi tutti gli elementi falsi dell'iterabile
      score=[60, 0, 55, 59, 76, 70, 88, 70, 81, 65] over_70=list(filter(None, scores)) print(over_70) ========== [60, 55, 59, 76, 70, 88, 70, 81, 65] >>>  
      L'espressione filter(function, iterable) è quindi equivalente a:
      (item for item in iterable if function(item)) # if function is not None (item for item in iterable if item) #if function is None  
      Curiosità: itertools.filterfalse(function,iterable)
       - Crea un iteratore che filtra gli elementi da iterabile restituendo solo quelli per i quali il predicato è Falso
       
      Reduce
      Reduce applica cumulativamente una funzione di due argomenti agli elementi di un iterabile, opzionalmente iniziando con un argomento iniziale.
      -> reduce(func, iterable[, initial]
      func è la funzione a cui viene applicato cumulativamente ogni elemento nell'iterabile
      Initial è il valore facoltativo che viene inserito prima degli elementi dell'iterabile nel calcolo e funge da valore predefinito quando l'iterabile è vuoto
       
      - func richiede due argomenti, il primo dei quali è il primo elemento in iterable (se initial non è fornito)
      - il secondo è il secondo elemento in itarable
      se initial è fornito, diventa il primo argomento da utilizzare e il primo elemento in iterable diventa il secondo elemento.
      - Reduce() "riduce" iterable in un unico valore
      from functools import reduce number=[3,4,6,9,34,12] def custom_sum(first, second): return first+second result=reduce(custom_sum, numbers) print(result) ========== 68 >>>  
      Lambda functions
      E' possibile utilizzare le funzioni lambda
      Conosciute anche come anonymouse functions
      Sono funzioni create al 'volo' senza nome
      Il corpo della funzione lambda può contenere una sola espressione
      Non contiene l'istruzione return perchè il corpo viene automaticamente restituito
      -> lambda input-parameters: expression
      Le funzioni lambda sono trattate come le normali funzioni a livello di interprete Python
      Consentono di fornire una funzione come parametro ad un'altra funzione (ad esempio, in map, filter, reduce ecc.)
      In tali casi l'utilizzo di lambda offre un modo elegante per creare una funziona singola e passarla come parametro
      from functools import reduce li=[5,8,10,20,50,100] sum=reduce((lambda x, y:x+y), li) print(sum) ======== 193 >>>  
      Lambda function e sorting
      # Sort case-independent
      L=['a', 'Andew', 'from', 'is', 'string', 'test', 'This'] L.sort(key=str.lower) # Sort by third field
      students=[('john','A',15), ('Jane','B',12), ('tom','B',10) students.sort(key=lambda student: student[2]) # Sort by distance from orgin, from closer to further
      points=[Point(1,2), Point(3,4), Point(4,1)] points.sort(key=lambda point.distanceFromOrigin())  
      Functools
      Il modulo functools fornisce strumenti per adattare od estendere funzioni ed altri oggetti chiamabili, senza riscriverli completamente
      Lo abbiamo usato nella reduce, introduce la classe partial
       
      Iterators
      Un iteratore è un oggetto che rappresenta un flusso di dati, questo oggetto restituisce i dati un elemento alla volta. Un iteratore Python deve supportare un metodo chiamato __next__() che non accetta argomenti e restituisce sempre l'elemento successivo dello stream
      Se non ci sono più elementi nello stream, __next__() deve sollevare l'eccezione StopIteration
       
      La funzione built-in iter() accetta un oggetto e cerca di restituire un iteratore che restituirà il contenuto o gli elementi dell'oggetto
      Solleva TypeError se l'oggetto non supporta l'iterazione
      Diversi tipi di dati built-it in Python supportano l'iterazione, come liste, stringhe e dizionari
       - I dizionari possono creare diversi oggetti iteratori keys(), values(), items()
      Un oggetto viene chiamato iterabile se è possibile ottenere un iteratore per esso
       
      Alcuni data type built-in di Python che supportano l'iterazione
      for element in [1,2,3]: print(element) for element in (1,2,3): print(element) for key in {'one':1,'two':2}: print(key) for char in "123": print(element) for line in open("myfile.txt"): print(line, end=' ')  
      Iterator protocol
      L'istruzione for chiama iter() sull'oggetto container
      La funzione restituisce un oggetto iteratore (iterator object) che definisce il metodo __next__() che accede agli elementi nel contenitore, uno alla volta
      Quando non ci sono più elementi, __next__() solleva un'eccezione StopIteration che dice al ciclo for di terminare
      >>> s="abc" >>> it=iter(s) >>> it <str_iterator object at 0x00..> >>> next(it) 'a' >>> next(it) 'b' >>> next(it) 'c' >>> next(it) StopIteration  
      Sequence unpacking support gli iteratori
      >>> L=[1, 2, 3] >>> iterator = iter(L) >>> a, b, c = iterator >>> a, b, c (1, 2, 3) Max(), min(), in, not in supportano gli iteratori
       
      Si può solo andare avanti in un iteratore; non c'è modo di ottenere l'elemento precedente, ripristinare l'iteratore o crearne una copia
      Gli oggetti Iterator possono facoltativamente fornire queste funzionalità aggiuntive, ma l'iterator protocol specifica solo il metodo __next__()
      Una funzione può quindi consumare tutto l'output dell'iteratore ma se devi fare qualcosa di diverso con lo stesso stream, devi creare un nuovo iteratore
       
      Generatori
      Due operazioni comuni sull'output di un iteratore sono:
      eseguire alcune operazioni per ogni elemento selezionare un sottoinsieme di elementi che soddisfano alcune condizioni List comprehensions e generator expressions sono una notazione concisa per queste operazioni
      Generator expressions vs. list comprehensions
      line_list=['line 1\n', 'line 2\n',...] #Generator expression -- returns iterator stripped_iter=(line.strip() for line in line_list) #List comprehension -- returns list stripped_list=[line.strip() for line in line_list] Sintassi: per le generation expressions usiamo le parentesi tonde () e non quadre []
       
      Generator expressions vs list comprehension
      Con la list comprehension si ottiene una lista Python
      stripped_list è una lista contenente le righe risultanti, non un iteratore
      Le generator expressions restituiscono un iteratore che calcola i valori secondo necessità, senza bisogno di materializzare tutti i valori contemporaneamente
      Ciò significa che la list comprehension non è efficiente quando si lavora con iteratori che restituiscono un flusso infinito o una grande quantità di dati
      Per questi casi si usano le generator expressions
      La forma generica di una generator expression:
      ( expression for expr in sequence1 if condition1 for expr2 in sequence2 if condition2 for expr3 in sequence3 if condition3 for exprN in sequenceN if conditionN )  
      I generatori sono una classe speciale di funzioni che semplificano il compito di scrivere iteratori
      Restituiscono un iteratore che restituisce un flusso di valori
      Le funzioni regolari (quelle 'normali') calcolano un valore e lo restituiscono
      Quando si chiama una funzione regolare, essa genera un namespace privato con le sue variabili locali Quando esegue l'istruzione return, distrugge il namespace e restituisce il valore di ritorno al suo chiamante Se la funzione viene richiamata: punto 1  
      Qualsiasi funzione contenente la keyword yield è una funzione generatore
      L'istruzione yield viene usata solo quando si definisce una funzione generatore e solo nel corpo della funzione generatore
      Quando viene chiamata restituisce un oggetto generatore iteratore
      Il corpo della funzione generatore viene eseguito da una chiamata reiterata al metodo next() del generatore fino al sollevamento di un'eccezione
      >>> def generate_ints(N): for i in range(N): yield i La generator function restituisce un oggetto generatore che supporta l'iterator protocol
      Quando si esegue l'istruzione yield, il generatore genera il valore di i
      Yield diverso da return
       
      Quando viene eseguita l'istruzione yield, lo stato del generatore viene congelato ed il valore dello yield viene restituito alla chiamata next()
      Per "congelato" si intende che tutto lo stato locale viene conservato, inclusi i legami correnti delle variabili locali, il puntatore all'istruzione e lo stack di valutazione interno
      Al prossimo next(), la funzione procede esattamente come se l'istruzione yield fosse chiamata dall'esterno
      >>> gen=generate_ints(3) >>> gen <generator object generate_ints at ...> >>> next(gen) 0 >>> next(gen) 1 >>> next(gen) 2 >>> next(gen) StopIteration  
      Esempio: leggere righe da CSV
      def csv_reader(file_name): fil=open(file_name) result=file.read().split("\n") return result  
      Codice corretto ma:
      open() ritorna un generator object che può iterare in maniera 'lazy'
      file.read().split() carica tutto in memoria contemporaneamente e se il fil è molto grande può causare un MemoryError
      Utilizzando un generator function:
      def csv_reader(file_name): for row in open(file_name, "r"): yield row Si apre il file, si scorre attraverso di esse e si produce una riga (yield)
      Non carica tutto il file in memoria
      Oppure, con generator expression:
      csv_gen=(row for row in open(file_name))  
      Esempio: permutazioni
      Generare tutte le possibili combinazioni di stringhe alfanumeriche lunghe 8 caratteri:
      from itertools import permutations options='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890' possibilities=[w for w in permutations(options, 8)] Con le liste è lentissimo, meglio usare i generatori
      from itertools import permutations options='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890' possibilities=[w for w in permutations(options, 8)] ======= >>> possibilities.__next()__() ('A','B','C','D','E','F','G','H') >>>  
      Passing values into a generator
      Per passare valori in un generatore: yield diventa un'esrepssione, restituendo un valore che può essere assegnato ad una variabile:
      -> val = (yield i)
      Utilizzare il metodo generator.send(value)
      def counter(maximum): i=0; while i<maximum: val=(yield i) # If value provided, change counter if val is not None: i=val else: i += 1 Se viene chiamato il metodo __next__(), yield restituisce None
      Generator.send(value)
      Riprende l'esecuzione e "invia" un valore nella funzione generatore
      L'argomento value diventa il risultato dell'espressione dello yield corrente
      Il metodo send() restituisce il valore successivo prodotto dal generatore o genera StopIteration se il generatore esce senza produrre un altro valore
      Quando send() viene chiamato per avviare il generatore, deve essere chiamato con None come argomento, poichè non esiste ancora un'espressione di yield in grado di ricevere il valore
      Altri metodi: throw, close
       
      Itertools
      Il modulo itertools della standard library offre molti strumenti per lavorare con gli iteratori
      Ad esempio chain concatena più iteratori:
      >>> it1=iter([1,2,3]) >>> it2=iter([4,5,6]) >>> itertools.chain(it1, it2) [1,2,3,4,5,6]  
      ZIP(*iterables)
      Crea un iteratore che aggrega elementi da ciuscono degli iterabili
      Restituisce un iteratore di tuple, in cui la i-esima tupla contiene l'i-esimo elemento di ciascuna delle sequenze di iterabili
      L'iteratore si arresta quando viene raggiunta la fine dell'iterabile più breve
      Con un singolo argomento iterabile, restituisce un iteratore di 1 tupla
      Senza argomenti, restituisce un iteratore vuoto
      *zip 'to unzip' un zip
      #zip object is an iterator object x=[1,2,3,4] y=[5,6,7,8] zipped=zip(x,y) print(type(zipped)) =========== <class 'zip'> >>> zipped.__next__() (1,5) >>> next(zipped) (2,6) >>>  
      x=[1,2,3,4] x=[5,6,7,8] # to unzip x2, y2 = zip(*zip(x,y)) x==list(x2) and y==list(y2) print(x) print(y) ======== [1,2,3,4] [5,6,7,8] >>>  

    • NumPy
      Numpy è una libreria open source per il linguaggio di programmazione Python, che aggiunge supporto a grandi matrici e array multidimensionali insieme a una vasta collezione di funzioni matematiche di alto livello per poter operare efficientemente su queste strutture dati
      Sito ufficiale: www.numpy.org
       
      Ndarray class
      Un oggetto ndarray è un array n-dimensionale (tensore)
      Simile ad una lista Python ma:
       - tutti gli elementi di un array devono essere dello stesso tipo (tipicamente int o float)
       - sono molto più efficienti e pensati per dati n-dimensioni (con n grande)
       

       
      Generare un array
      Un array viene creato tramite il metodo costruttore array()
      Due argomenti
       - una lista contenente i valori
       - una specifica del tipo di dato
       
      a = np.array([1,4,5,8], float) >>> import numpy as np >>> print(np.zeros(2)) [0. 0.] >>> print(np.one( (2,2) ) [[1. 1.] [1. 1.]] >>> print(np.zeros( (2,2,2) ) [[[0. 0.] [0. 0.]] [[0. 0.] [0. 0.]]]  
      Generare random array
      import numpy as np print(np.random.uniform(0,10,size=5)) print(np.random.normal(1,0.2,size=5)) print(np.random.randint(0,2,size=(3,3))) [7.91700684 7.41652128 8.1393401 0.8123227 5.50427964] [1.14191823 0.89203955 1.09505607 0.8081311 0.82282836] [[ 0 0 0] [ 0 1 0] [ 0 1 1]]  
      Matrici diagonali
      import numpy as np print(np.diag(np.ones(3)) [[ 1. 0. 0.] [ 0. 1. 0.] [ 0. 0. 1.]] print(np.diag(np.arange(5))) [[ 0 0 0 0 0] [ 0 1 0 0 0] [ 0 0 2 0 0] [ 0 0 0 3 0] [ 0 0 0 0 4]]  
      Da Pandas a Numpy
      E' molto semplice "convertire" una pandas series o un DataFrame in un array numpy
      questi oggetti di Pandas sono costruiti su numpy array: il loro array sottostante è accessibile attraverso l'attributo values
      import pandas as pd import numpy as np iris=pd.read_csv("iris.csv") print(type(iris.PetalWidth.values)) <type'numpy.ndarray'>  
      Metodi reshape(), ravel()
      La disposizione delle voci in righe, colonne, ecc. può essere modificata con i metodi:
      reshape() trasforma la shape dell'array
      ravel() trasforma in un array 1D (una copia è fatta solo se necessario)
      >>> a=np.arange(6).reshape((3,2)) >>> a array([[0,1], [2,3], [4,5]]) >>> x=np.array([[1,2,3],[4,5,6]]) >>> np.ravel(x) array([1,2,3,4,5,6]) >>> x.reshape(-1) array([1,2,3,4,5,6])  
      Iterating over arrays
      Oggetto iterabile nditer
      >>> a=np.arange(6).reshape(2,3) >>> for x in np.nditer(a): print(x,end=' ') ... 0 1 2 3 4 5 Attenzione: di default, numpy sceglie come ordine quello che rende più efficiente l'accesso all'elemento (=segue il memory layout dell'array, ovvero l'ordine con cui gli elementi sono salvati in memoria)
      Esempio matrice trasposta:
      >>> a=np.arange(6).reshape(2,3) >>> for x in np.nditer(a.T): print(x, end=' ') ... 0 1 2 3 4 5 >>> for x in np.nditer(a.T.copy(order='C')): print(x,end=' ') ... 0 3 1 4 2 5  
      Modificare i valori di un array
      Di default, l'oggetto iterabile nditer non consente la modifica dell'array (read-only object)
      Per modificarlo occorre usare i flag readwrite o writeonly
      Il nditer produrrà quindi un writable buffer array
      Poichè il nditer deve copiare questi dati del buffer nell'array originale al termine dell'iterzione, è necessario segnalare quando termina l'iterazione, mediante:
      l'istruzione with
      il metodo close()
      Una volta che uno di questi metodi è chiamato viene eseguito il write-back
      >>> a=np.arange(6).reshape(2,3) >>> a array([[0,1,2], [3,4,5]]) >>> with np.nditer(a, op_flags=['readwrite']) as it: for x in it: x[...]=2*x ... >>> a array([[0,2,4], [6,8,10]])  
      External loop
      In realtà con gli array numpy non è molto conveniente iterare su un singolo elemento alla volta.
      Per questo esistono gli external loop che lavorano su chunk di dati
      Forzando 'c' o 'F' otteniamo diversi external loop size
      >>> a=np.arange(6).reshape(2,3) >>> for x in np.nditer(a, flags=['external_loop']): print(x,end=' ') ... [0 1 2 3 4 5] >>> for x in np.nditer(a, flags=['external_loop'], order='F'): print(x,end=' ') ... [0 3] [1 4] [2 5]  
      Broadcasting Array Iteration
      >>> a=np.arange(3) >>> b=np.arange(6).reshape(2,3) >>> for x,y in np.nditer([a,b]): print("%d:%d" % (x,y), end=' ') ... 0:0 1:1 2:2 0:3 1:4 2:5  
      Indexing
      Un elemento di una lista si accede: x[i][j]
      Un elemento di un numpy array si accede x[i,j]
      import numpy as np x=np.arange(9).reshape((3,3)) print(x) print(x[0,:]) #first row print(x[:,0]) #first column print(x[1:3, :])#subarray  
      Operazioni broadcasting
      import numpy as np x=np.arange(5)*10 print(x) # [0 10 20 30 40] y=-x print(y) # [0 -10 -20 -30 -40] x=x+y print(z) # [0 0 0 0 0]  
       

    • Pandas
      Una libreria per la manipolazione, analisi e visualizzazione dei dati, in particolare, offre strutture dati e operazioni per manipolare tabelle numeriche e serie temporali
      Features: CSV (separato da virgola, TSV(separato da tab), file Excel, Database, ecc..
      Sito ufficiale Pandas: www.pandas.pydata.org
       
      Esempio - Iris Dataset
      import pandas as pd from pandas.plotting import scatter_matrix import matplotlib.pyplot as plt df=pd.read_csv("iris.csv") scatter_matrix(df[df.Name=="Iris-virginica"]) plt.show() Pandas fornisce due tipi di dato:
      Series rappresentano dati 1D, come serie temporali (time series), output di funzioni ad una variabile, ecc.
      DataFrame rappresenta dati 2D, come un file CSV (column-separated values), un microarray, una tabella di database, una matrice, ecc.
       
      Pandas - tipi di dato
      Ogni colonna di un DataFrame è una serie.
      Ecco perchè vedremo prima come funzionano le Series
      La maggior parte di ciò che diremo sulle Series si applica anche ai DataFrames
       
      Series
      Una Series è un vettore mono-dimensionale i cui elementi sono etichettati con un indice
      In questo senso, la Series opera un pò come una lista (si possono accedere gli elementi in sequenza), e un pò come un dizionario (si può accedere ad un elemento tramite il suo indice, che opera come una chiave e non deve essere per forza numerico)
       
      Creazione di Series
      specificando dati e indici
      s=pd.Series([2.5,3.6,5.7,5.8], index=[0,5,15,30]) 0 2.5 5 3.6 15 5.7 30 5.8 dtype: float64 specficando dati (indici numerici impliciti partendo da 0)
      s=pd.Series([2.5,3.6,5.7,5.8]) 0 2.5 1 3.6 2 5.7 3 5.8 dtype: float64 passando un dizionario (le chiavi diventano gli indici e i valori i dati)
      s=pd.Series({"a":342, "c":245, "g":546, "t":222}) a 342 c 245 g 546 t 222 dtype: int64 se viene fornito un singolo scalare, il costruttore della serie lo replicherà per tutti gli indici
      s=pd.Series(3, index=range(5)) 0 3 1 3 2 3 3 3 4 3 dtype: int64  
      Accedere ad una Series
      Si può accedere ad una Series sia tramite indice (come nei dizionari), sia tramite posizione (come nelle liste)
      import pandas as pd s=pd.Series({"a":342,"c":245,"g":546,"t":222}) s["c"] # 245 s[0] # 342 s[-1] # 222 s[7] #IndexError: index out of bounds Gli indici sono praticamente delle etichette associate alle posizioni corrispondenti, per cui si possono usare estrarre porzioni di Series (la sotto serie va da indice iniziale a indice finale compreso)
      >>> s["c":"t"] >>> s[0:2] a 342 c 245 dtype: int64 E' anche possibile passare una lista di indici da estrarre
      >>> s[["a","g"]] a 342 g 546 dtype: int64  
      Se un label non è contenuto, viene sollevata un'eccezione
      Utilizzando il metodo get, un label mancante restituirà None o il valore predefinito specificato
      import pandas as pd days=["mon","tue","wed","thu","fri"] sleephours=[6,2,8,5,9] s=pd.Series(sleephours, index=days) print(s["sat"]) print(s.get('sat') KeyError: 'sat' None  
      Metodi Head, Tail
      I primi n elementi possono essere estratti usando head()
      Gli ultimi n elementi possono essere estratti usando tail()
      print(s.head(2)) print(s.tail(1)) a 342 c 245 dtype: int64 t 222 dtype: int64  
      Operazioni su Series
      Le operazioni aritmetiche su una Series si applicano a tutti i suoi elementi (broadcasting)
      s=pd.Series({"a":342,"c":245,"g":546,"t":222}) s+1 a 343 c 246 g 547 t 223 dtype: int64 Ovviamente possiamo farle anche sul singolo elem:
      s['c'] += 1 s a 342 c 247 g 546 t 222 dtype: int64  
      Masking, filtering
      Anche i test logici si applicano a tutti gli elementi (il risultato si chiama maschera, mask
      Le maschere possono essere utilizzate per filtrare gli elementi di una serie in base a una determinata condizione
      print(s>=300) print(s[s>=300]) a True a 342 c False g 546 g True dtype: int64 t False dtype: bool  
      Somma di due Series
      La somma tra due serie le somma elemento per elemento, allineandole per indice
      s+pd.Series({"a":1234,"g":3451}) a 1576.0 c NaN g 3997.0 t NaN dtype: float64 Se un indice non è presente in una delle serie, il risultato è NaN (non a number)
      Esiste il metodo add() per cambiare valore di default (ad esempio 0 invece di NaN)
       
      Statistiche con Series
      s.max() s.var() s.std() s.median() s.corr(s) # Person corr. s.corr(s, method="spearman")  
      Plotting (matplotlib)
      import matplolib.pyplot as plt #line plot #bar plot s.plot() s.plot(kind="bar") plt.show() plt.show()  
      DataFrame
       
      Un DataFrame è praticamente una tabella di oggetti eterogenei
      Un DataFrame ha indici sia per le righe che per le colonne
      index rappresenta le etichette delle righe
      columns rappresenta le etichette delle colonne
      shape descrive le dimensioni della tabella
      ogni colonna di un DataFrame è una Series
      Tutte le operazioni viste per le serie possono essere applicate a colonne estratte da un DataFrame
      Alcune possono essere applicate anche direttamente su un DataFrame
       

      Creazione di un DataFrame
      Da un dizionario di liste
      d={'col1':[0.5,-2.1,2.3], 'col2': [0.6,-0.1,-0.9]} df=pd.DataFrame(d,index=['row1','row2','row3]) df col1 col2 row1 0.5 0.6 row2 -2.1 -0.1 row3 2.3 -0.9 Da una lista di dizionari (notare NaN)
      d = [{"a":1,"b":2}, {"a":2,"c":3}, ] df=pd.DataFrame(d) df a b c 0 1 2.0 NaN 1 2 NaN 3.0 Da un dizionario di Pandas Series
      d={"name": pd.Series(["Mario","Luigi"]), surname: pd.Series(["Rossi","Verdi"]) } df=pd.DataFrame(d) df name surname 0 Mario Rossi 1 Luigi Verdi da un CSV
      Consultare documentazione metodo read_csv
      help(pd.read_csv)
       
      Estrazione di righe e colonne
      E' possibile accedere ad un estratto del DataFrame con il metodo head: df.head()
      E' possibile estrarre tramite indici o posizioni di riga/colonna
      df.loc[0] name Mario surname Rossi Name: 0, dtype: object df["name"] 0 Mario 1 Luigi 2 Marco Name: name, dtype: object df.loc[[0,1]] df.lc[0:1] name surname 0 Mario Rossi 1 Luigi Verdi df[["name","surname"]] name surname 0 Mario Rossi 1 Luigi Verdi  
      Operazioni e statistiche
      Come per le Series
      Broadcasting Filtering Masking  
      df=pd.DataFrame(d) print(df["name"]=="Mario") 0 True 1 False Name: name, dtype: bool print(small[["Name","PetalLength","SepalLength"]] [small.PetalLength > small.PetalLength.mean()]) Name PetalLength SepalLength 114 Iris-virginica 5.1 5.8 62 Iris-versicolor 4.0 6.0 107 Iris-virginica 6.3 7.3  
      Merge
      Il merge di DataFrames viene eseguito con la funzione merge()
      Merge significa che, dati due tabelle con un nome di colonna comune, per prima cosa vengono abbinate le righe con lo stesso valore di colonna; quindi viene creata una nuova tabella concatenando le righe corrispondenti
      Esempio, dati i seguenti due dataframe:
      sequences=pd.DataFrame({ "id": ["Q99697", "018400", "P78337", "Q9W5Z2"], "seq": ["METNCR", "MDRSSA", "MDAFKG", "MTSMKD"], }) names=pd.DataFrame({ "id": ["Q99697", "018400", "P78337", "P59583"], "name": ["PITX2_HUMAN", "PITX_DROME", "PITX1_HUMAN", "WRK32_ARATH"], }) Merge: inner, left, right, outer...
       

       
      Natural join: per mantenere solo le righe corrispondenti ai data frame, specifica l'argomento how="inner"
      Full outer join: per mantenere tutte le righe di entrambi i data frame, specifica how="outer"
      Left outer join: per includere tutte le righe del data frame x e solo quelle di y corrispondenti, specificare how="left"
      Right outer join: per includere tutte le righe del data frame y e solo quelle di x corisspondenti, specificare how="right"
       
      Group by
      Il metodo groupby permette di eseguire operazioni su un gruppo di righe
      >>> df=pd.DataFrame({'Animal': ['Falcon','Falcon','Parrot','Parrot'], 'Max Speed': [380.,370.,24.,26.]}) >>> df Animal Max Speed 0 Falcon 380.0 1 Falcon 370.0 2 Parrot 24.0 3 Parrot 26.0 >>> df.groupby(['Animal']).mean() Animal Max Speed Falcon 375.0 Parrot 25.0  
       

    • Python è un linguaggio di programmazione multi-paradigma
      In Python il concetto di OOP segue alcuni principi base: ereditarietà, incapsulamento, polimorfismo.
       
      Classi
      Un oggetto è un insieme di dati (variabili) e metodi (funzioni) che agiscono su tali dati; ogni valore è un oggetto (object.__class__); si utilizza il costrutto classe:
      class MyNewClass: ''' docstring della nuova classe ''' pass Una classe crea un un nuovo namespace locale in cui sono definiti tutti i suoi attributi (dati o funzioni)
      __doctring__: restituisce la docstring della classe
      pass: pass è un operazione nulla. E' utile come placeholder
      Non appena definiamo una classe, viene creato un nuovo oggetto classe con lo stesso nome, ci consente di accedere ai diversi attributi e di creare un'istanza di nuovi oggetti di quella classe
      #esempio class MyClass: "docstring della mia classe" x=5 def func(self): print("Hello") print(MyClass.x) # Output: 5 print(MyClass.func) # Output: <function MyClass.func at 0x000..> print(MyClass.__doc__) # Output: 'docstring della mia classse'
      Creare un nuovo oggetto
      nome_oggetto=nome_classe()
      I metodi di un oggetto sono le funzioni corrispondenti di quella classe
      class MyClass: "secondo esempio" x=5 def func(self): print("Hello") obj = MyClass() # create a new MyClass print(MyClass.func) # Output: <function MyClass.func at 0x000..> print(obj.func) # Output: <bound method MyClass.func of ...> obj.func() # Calling function func() Output: Hello  
      Self e Metodi di Istanza
      Se eseguo l'istruzione MyClass.func(): TypeError: func() missing 1 reguired positional argument: 'self'
      Invece obj.func() funziona senza argomento
      Ogni volta che un oggetto chiama il suo metodo, l'oggetto stesso viene passato come primo argomento
      obj.func() <-> MyClass.func(obj) Chiamare un metodo con un elenco di n argomenti equivale a chiamare la funzione corrispondente con un elenco di argomenti creato inserendo l'oggetto del metodo prima del primo argomento
      E' l'argomento implicito che rappresenta l'oggetto, per convenzione lo chiamiamo self
       
      Costruttore
      Ci sono delle funzioni di classi che iniziano con doppio underscore __
      __init__() viene chiamata ogni volta che viene istanziato un nuovo oggetto di quella classe (inizializzatore)
      class Studente: def __init__(self, nome, cognome): self.nome=nome self.cognome=cognome Per creare variabili d'istanza
      studente_uno=Studente("Mario","Rossi") studente_due=Studente("Luigi","Verdi") >>> print(studente_uno) #__main__.Studente object at 0x00..> Variabili di Classe vs. Variabili di Istanza
      class Dog: kind='canine' def __init__(self, name): self.name=name >>> d = Dog('Fido') >>> e = Dog('Buddy') >>> d.kind 'canine' >>> e.kind 'canine' >>> d.name 'Fido' >>> e.name 'Buddy' Se lo stesso nome di attributo si verifica sia in un'istanza che in una classe, la ricerca degli attributi da la priorità all'istanza:
      class Warehouse: purpose='storage' region='west' >>> w1=Warehouse() >>> print(w1.purpose, w1.region) storage west >>> w2=Warehouse() >>> w2.region='east' >>> print(w2.purpose, w2.region) storage east  
      Variabili e metodi privati
      C'è una convenzione per indicare nomi che devono essere trattati come privati: __nome
      Il carattere di sottolineatura iniziale __ prima del nome della variabile / funzione / metodo indica che è solo per uso interno
      class A: def __init__(self, x, y) self.__private=x self.public=y def __prmet(self): return self.__private def pubmet(self): return self.public def ppmet(self): return self.__private, self.public >>> a=A("Mario","Rossi") >>> a.public 'Rossi' >>> a.pubmet() 'Rossi' >>> a.ppmet() ('Mario','Rossi') Se si desidera che la classe base abbia delle sottoclassi e che alcuni attributi non siano da loro utilizzati, utilizzare la denominazione con doppi __ iniziali
      Questo richiama l'algoritmo name mangling di Python, in cui il nome della classe è inserito nel nome dell'attributo
      Questo aiuta a evitare name collision degli attributi nel caso le sottoclassi inavvertitamente contengono attributi con lo stesso nome
      Si noti che solo il nome della classe viene utilizzato nel nome modificato, quindi se una sottoclasse sceglie sia lo stesso nome di classe che lo stesso nome di attributo, è ancora possibile ottenere collisioni di nomi.
       
      Ereditarietà (Inheritance)
      Definizione di una nuova classe con modifiche minime o nulle ad una classe esistente, la nuova classe è detta classe figlia (sottoclasse), quella da cui eredita è detta classe genitore (classe base)
      class Persona: def __init__(self, nome, cognome): self.nome=nome self.cognome=cognome class Stutente(Persona): pass class Studente(Persona): def __init__(self, nome, cognome, scuola): self.nome=nome self.cognome=cognome self.scuola=scuola Super()
      La funzione super permette di estendere o modificare il metodo di una classe base nella classe figlia che lo eredita
      class Studente(Persona): def __init__(self, nome, cognome, scuola): super().__init__(nome, cognome) self.scuola=scuola class Docente(Persona): def __init__(self, nome, cognome, materie=None): super().__init__(nome, cognome) if materie is None: self.materie=[] else: self.materie=materie Python ha due funzioni built-in:
      isinstance() per verificare il tipo (la classe) dell'istanza
      issubclass() per verificare l'ereditarietà
      Ritornano True o False
       
      Python supporta anche una forma di ereditarietà multipla. Una definizione di classe con più classi di base:
      class DerivedClassName(Base1, Base2, Base3): <statement-1> . . <statement-N> Parte da Base1 poi (ricorsivamente) nelle classi base di Base1 e, solo se non vi è stato trovato, viene ricercato in Base2, e cosi via.
       
      Overriding
      Una classe può avere un'implementazione differente di un metodo della classe genitore
      class Persona: def __init__(self, nome, cognome): self.nome=nome self.cognome=cognome def stampa(self): print('genitore') class Studente(Persona): def __init__(self, nome, cognome, scuola): super().__init__(nome, cognome) self.scuola=scuola def stampa(self): print("sottoclasse") >>> Mario=Studente("Mario","Rossi","Dibris") >>> Mario.stampa() # Studente.stampa(Mario) sottoclasse  
      Metodi di Classe
      I metodi degli oggetti che abbiamo visto finora vengono chiamati attraverso il nome dell'istanza della classe (oggetto), che viene passato come parametro self all'interno del metodo.
      I metodi di classe vengono invece chiamati direttamente dalla classe che viene passata come parametro cls all'interno del metodo, cls, come self, è semplice convenzione, si usa il decoratore @classmethod
       
      Generalmente questi metido servono per istanziare una nuova istanza di classe, passando dei parametri diversi rispetto a quelli richiesti dal costruttore.
      class Rectangle: def __init__(self, width, height): self.width=width self.height=height def area(self): return self.width * self.height @classmethod def new_square(cls, side_length): return cls(side_length, side_length) square = Rectangle.new_square(5) print(square.calculate_area()) Creiamo una classe per creare un dizionario per ogni utente, ed una sottoclasse per creare un dizionario con più informazioni
      Facciamo finta che il e il cognome siano dati come string unica (es 'Paolo-Rossi')
      *args permette di passare 0 o un numero arbitrario di parametri alla funzione
      class Crea_profilo: def __init__(self, name, surname): self.name=name self.surname=surname def crea(slef): return {"Nome":self.name,"Cognome":self.surname} @classmethod def from_string(cls, string_persona, *args): nome, cognome, = string_persona.split("-") return cls(nome, cognome, *args) class Crea_profilo_età(Crea_profilo): def __init__(self, name, surname, age): super().__init__(name,surname) self.age=age def crea(self): return {"Nome":self.name, "Cognome":self.surname, "Età":self.age} #overriding >>> persona1=Crea_profilo("Mario","Rossi") >>> persona2=Crea_profilo.from_string("Paolo-Verdi") >>> persona3=Crea_profilo_età.from_string("Luigi-Giallo",54) >>> print(persona1.crea()) {'Nome': 'Mario', 'Cognome': 'Rossi'} >>> print(persona2.crea()) {'Nome': 'Paolo', 'Cognome': 'Verdi'} >>> print(persona3.crea()) {'Nome': 'Luigi', 'Cognome': 'Giallo','Età':54}  
      Metodi Statici
      I metodi statici si richiamano senza creare un'istanza della classe e pertanto non ricevono un parametro self
      Non possono accedere alla proprietà della classe
      Per i metodi statici si usa il decoratore @staticmethod
      class Dates: def __init__(self, date): self.date=date def getDate(self): return self.date @staticmethod def toDashDate(date): return date.replace("/","-") date=Dates("15-12-2016") dateFromDB="15/12/2016" dateWithDash=Dates.toDashDate(dateFromDB) if (date.getDate()==dateWithDash): print("Equal") else: print("Unequal")  
      Overloading degli operatori
      Python consente di cambiare la definizione degli operatori predefiniti quando applicati a tipi definiti dall'utente
      class Punto: ... def __add__(self, AltroPunto): return Punto(self.x + AltroPunto.x, self.y + AltroPunto.y) >>> P1=Punto(3,4) >>> P2=Punto(5,7) >>> P3=P1+P2 >>> print P3 (8,11) L'espressione P1+P2 è equivalente a P1.__add__(P2)
       
      Dunder Methods
      Molto utili perchè garantiscono il compartimento polimorfico degli operatori
      __init__ e __adds__ sono metodi speciali
      >>> 5+5 10 >>> "Py"+"thon" 'Python' >>> int.__add__(5,5) 10 >>> str.__add__("Py","thon") 'Python' Tanti altri metodi speciali:
      __new__, __del__, __str__, __bool__, __sub__, __eq__ (uguale a), __ne__ (diverso da), __getitem__ (object[item]), __setitem__ (object[item]=value) ecc.
      Per ogni classe posso definirli in modo diverso
      Per maggiori info consultare la documentazione di Python!
       
      Iterators
      Per la maggior parte degli oggetti container abbiamo fatto il for-loop:
      for element in [1,2,3]: print(element) for element in (1,2,3): print(element) for key in {'one':1,'two':2} print(key) for char in "123" print(char) for line in open("myfile.txt"): print(line, end='')  
      Iterator protocol
      L'istruzione for chiama iter() sull'oggetto container
      La funzione restituisce un oggetto iteratore (iterator object) che definisce il metodo __next__() che accede agli elementi nel contenitore, uno alla volta
      Quando non ci sono più elementi, __next__() solleva un'eccezione StopIteration che dice al ciclo for di terminare; funzione integrata next()
      >>> s="abc" >>> it=iter(s) >>> it <str_iterator object at 0x0..> >>> next(it) 'a' >>> next(it) 'b' >>> next(it) 'c' >>> next(it) StopIteration  
      Usare gli iteratori con le classi
      class Reverse: """Iterator for looping over a sequence backwards.""" def __init__(self, data): self.data=data self.index=len(data) def __iter__(self): return self def __next__(self): if self.index==0: raise StopIteration self.index=self.index-1 return self.data[self.index] >>> rev=Reverse('spam') >>> iter(rev) <__main__.Reverse ojbect at 0x0..> >>> for char in rev: print(char) m a p s  
      Moduli (librerie)
      I moduli sono dei file usati per raggruppare costanti, funzioni e classi
      Ci consentono di suddividere e organizzare meglio i nostri progetti
      Python include già una lista estensiva di moduli standard (anche conosciuti come standard library)
      import nome_modulo #esempio import random Possiamo usare le funzioni dir() e help() per esplorare i contenuti del modulo
       
      Importare i moduli
      import modulo #importare intero modulo from modulo import nome #importare una costante o una funzione specifica import modulo as mio_nome #rinominare il modulo >>> import random as rdm >>> rdm.randint(1,100) 41 from modulo import #importa tutto il modulo  
      Creare un modulo
      Qualsiasi file con estensione.py può essere sia eseguito che importato
      In Python non esiste una vera distinzione tra modulo e 'main'
      Per creare un modulo: basta scrivere un normalissimo script python quindi salvato con estensione .py
      # operazioni.py def somma(x,y): return x+y def sottrazione(x,y): rturn a-b Per importarlo in un altro programma: import operazioni
       
      Package
      Python offre un ulteriore livello di organizzazione: i package. Un package è una raccolta di moduli, che in genere corrisponde alla directory che li contiene
      File vuoto __init__.py
       

    • Dopo l'introduzione di Python nella prima lezione, ora proseguiamo con la lezione due e vediamo i tipi di dato.
       
      Tipi Sequenza
      Stringhe
      Liste
      Tuple
      Buffer
      oggetti range
       
      Liste
      Le liste sono sequenze mutabili, utilizzate per archiviare raccolte di oggetti (non per forza dello stesso tipo)
       - [1, 2, 3] è una lista
       - ['Pippo', True, 3] è una lista
      Una lista è una sequenza di oggetti ordinati
      Gli oggetti possono essere di qualsiasi tipo
      I valori sono detti elementi
      Gli elementi della lista sono racchiusi tra parentesi quadrate, e separati da virgole.
      [1,3,5,7,11,13] lista numeri interi ["Laura","Luca"] lista stringhe ["Laura",15,2.5,True] lista eterogenea [] lista vuota [3,[6,9,12]] lista contenente lista a=[1,3,7,9] variabile a contiene lista  
      L'elemento in posizione pos di una lista si indica con [pos]
      Le posizioni si chiamano anche indici a[2]
      La prima posizione è la posizione 0: a[0]
      Se cerchiamo di accedere ad una posizione fuori dalla lista viene segnalato un errore a[90]
      Per stampare una lista intera:  print(a)
      Con indice negativo si parte dal fondo. [-1]
      La lista vuota è valutata False
       
      Le liste sono mutabili (possono cambiare, aggiungere e cancellare/modificare elementi)
       
      Operazioni
      len() restituisce la lunghezza della lista
      + concatena due liste
      * int ripete la lista un certo numero di volte
      [ : ] estrae una porzione da una lista
      in verifica l'appartenenza di un elemento a una lista
      lista=['x','y','z'] lista[0]= 42 print(lista) stampa: [42,'y','z'] lista[1:1]=[5] print(lista) stampa: [42,5,'y','z'] lista[2:3]=[] print(lista) stampa: [42,5,'z'] #slice operator >>>mylista=["A","B","C",23,["A"]] >>>mylista[:] ["A","B","C",23,["A"]] >>>mylista[2:] ["C",23,["A"]] >>>mylista[:5] ["A","B","C",23,["A"]] >>>mylista[1:2] ["B"]  
      Aggiungere un elemento
      In una lista, l'assegnazione di un valore ad un indice fuori dimensione genera un errore (si deve usare append)
      >>>L = ["a","b","c"] >>>L[3]="d" #errore >>>L.append("d") ok! lista.append(elem) aggiunge elem alla fine della lista lista.remove(elem) trova e rimuove elem dalla lista; lista.pop() rimuove e restituisce l'ultimo elemento della lista lista.clear() rimuove tutti gli elementi della lista del lista[-2] cancellare un elemento come pop del lista cancella la variabile lista  
      Se assegniamo ad una variabile una variabile che contiene una lista, le due variabili indicano proprio la stessa lista b=a
       - se modifico l'una anche l'altra viene modificata
      per fare una copia senza "unificare" le liste, possiamo copiarne il contenuto c=a[:]
       
      Pila (stack)
      I metodi delle liste rendono molto semplice l'uso di una lista come una pila, in cui l'ultimo elemento aggiunto è il primo elemento recuperato (last in, first out)
      Per aggiungere un oggetto in cima alla pila: append(i)
      Per recuperare un oggetto dalla cima della pila: pop()
      >>> stack = [3,4,5] >>> stack.append(6) >>> stack.append(7) >>> stack [3,4,5,6,7] >>> stack.pop() 7 >>> stack [3,4,5,6] >>> stack.pop() 6 >>> stack [3,4,5]  
      Coda (queue)
      E' anche possibile utilizzare una lista come una coda (first in, first out)
      Tuttavia, le liste non sono efficienti per questo scopo.
      append/pop sono veloci perchè aggiungono un elemento alla fine della lista.
      Ma per le code occorre fare inserimenti o rimozioni all'inizio della lista.
      Per implementare una coda: collections.deque, append e pop veloci da entrambe le estremità.
      >>> from collections import deque >>> queue = deque(["Eric","John","Micheal"]) >>> queue.append("Terry") >>> queue.append("Graham") >>> queue.popleft() 'Eric' >>> queue.popleft() 'John' >>> queue deque(["Micheal","Terry","Graham"])  
      List Comprehension
       
      La lista comprehension permette di trasformare e/o filtrare una lista, è una scrittura elegante e compatta.
      Data una lista qualungue lista_originale, posso creare una nuova lista che contiene solo gli elementi che soddisfano una certa condizione:
      lista_filtrata = [elemento for elemento in lista_originale if condizione(elemento)] #esempio numeri=range(10) numeri_pari = [n for n in numeri if n%2==0] print(numeri_pari)  
      Tuple
      I tuple sono anche essi degli elenchi di valori indicizzati
      Sono sequenze immutabili (una volta creati sono immutabili), una lista di valori separati da virgola, i valori sono scritti tra parentesi tonde ()
      1,2,3 è una tupla (1,2,3) è una tupla a=(1,2,3) -> a[0] è 1 Tale immutabilità non si applica ai contenuti della tupla, per cui i suoi oggetti possono essere modificati se mutabili
      t=(12, 'abc', [1,2,3,4]) >>> t[1][2]='d' Creare una Tupla con il metodo built-in tuple()
      >>> t = tuple() >>> print t () Se l'argomento è una sequenza (stringa, lista o tupla) il risultato è una tupla con gli elementi della sequenza:
      >>> t = tuple('lupins') >>> print t ('l','u','p','i','n','s')  
      Unpacking Arguments (funziona anche con le liste)
      a=(1,2) x,y=a print(x) -> 1 print(y) -> 2 Tuple con un singolo elemento occorre aggiungere una virgola finale
      La virgola è necessaria altrimenti Python tratterebbe la singola tupla come una stringa qualunque
      Operazioni
      len() lunghezza della tupla
      + concatenazione di due tuple
      .count() conteggio di un elemento
      [:] slice operator
      list() conversione da tuple a lista
       
      Range
      Range rappresenta una sequenza immutabile di numeri ed è comunemente usato nei circli for per eseguire il codice del ciclo per un certo (specifico) numero di volte.
      range(10) fino a (escluso) range(0,10) da (incluso) range(0,55,5) passo for i in range(11): print(i) #tabellina_del_cinqui=range(0,55,5) Il vantaggio del range rispetto ad una lista è che un oggetto di tipo range occupa sempre la stessa quantità di memoria, indipendentemente dalla dimensione dell'intervallo che rappresenta, memorizza solo i valori di inizio, arresto e passo; calcola i singoli item solo quando è necessario; se non devo lavorare su una determinata lista ma mi serve ciclare su una sequenza a caso è meglio usare range.
       
      Stringhe
      In Python è possibile accedere agli elementi di una sequenza usando la sintassi sequenza[indice], questo restituirà l'elemento in posizione indice. Il primo elemento ha sempre indice 0.
      >>> s = 'Python' >>> s[0] #elem in posizione 0 'P' >>> s[2] #elem in posizione 2 't' >>> s[-1] #elem in posizione -1 'n' #slicing >>> s[0:2] 'Py' >>> s[4:] 'on' #contenimento >>> 'P' in s True >>> 'x' in s False La funzione built-in len() può essere usata per ottenere il numero di elementi in una sequenza
      >>> len('Python') 6  
      Metodi list(), tuple()
      Il metodo list() prende sequence types e li converte a lista
      >>> my_tuple=1,3,4,5 >>> my_list=list(my_tuple) >>> print(my_list) [1,3,4,5] >>> my_string="Pippo" >>> my_list=list(my_string) >>> print(my_list) ['P','i','p','p','o'] >>> my_tuple=tuple(my_list) >>> print(my_tuple) (,'P','i','p','p','o')  
      Mapping types (dizionario)
      I mapping sono oggetti mutabili, al momento esiste solo un tipo di mappatura standard, il dizionario.
      Una mappatura tra un insieme di chiavi e un insieme di valori. Ogni chiave (key) è mappata su un valore (value)
      L'associazione di una chiave e un valore viene chiamata coppia chiave-valore (key-value)
      I dizionari (dict) sono un tipo built-in, mutabile e non ordinato che contiene elementi (items) formati da chiave e valore
      I dizionari vengono definiti, elencando tra parentesi graffe {}
      Una serie di elementi separati da virgole, dove ogni elemento è formato da una chiave e un valore separati da due punti :
      Dizionario vuoto è False
       
      A differenza delle liste se si assegna un valore ad una chiave non presente, la coppia chiave:valore viene aggiunta al dizionario
      Per inserire un nuovo elemento (chiave-valore) nel dizionario my_dict:
      my_dict['Pippo']=23 #chiave Pippo e valore 23 >>> print(my_dict) {'Pippo':23}  
      Metodi:
      keys() elenco contenente le chiavi del dizionario
      values() elenco di tutti i valori nel dizionario
      items() elenco contenente una tupla per ciascuna coppia di valori chiave
      len() numero di coppie chiave-valore
      >>> d={"a":0, "b":1} >>> d.items() dict_items([('a',0),('b',1)]) >>> type(d.items()) <class 'dict_items'> >>> t=tuple(d.items()) >>> t (('a',0),('b',1)) get() valore della chiave specificata
      update() aggiorna il dizionario con le coppie chiave-valore specificate
      pop() rimuove elemento con chiave specificata
      popitem() rimuove ultima coppia chiave-valore
      clear() rimuove tutti elementi dal dizionario
       
      A differenza delle sequenze, che sono oggetti iterabili che supportano l'accesso agli elementi mediante indici interi, i dizionari sono indicizzati da chiavi
      >>> a_dict={'color':'blue','fruit':'apple','pet':'dog'} >>> for key in a_dict: print(key) color fruit pet Per iterare: .items(), .keys(), .values()
       
      Una funzione hash è una funzione che prende un valore (di qualsiasi tipo) e ritorna un intero.
      I dizionari usato questi interi, chiamati hash values, per salvare e ricercare le coppie key-value
      Le chiavi (keys) devono essere di tipo 'hashable': il valore hash non può cambiare mai
      Una lista può essere un valore(value) di un dizionario
      {1: ['a','p','t','o'], 2:['r']} Le chiavi devono essere immutabili
       
      Dict Comprehension
      dictionary = {key:value for vars in iterable} #esempio original_dict={'Jack':38,'micheal':48,'guido':57,'john',33} even_dict={k:v for (k,v) in original_dict.items() if v%2==0} print(even_dict)  
       

    • Data Science
       
      La scienza dei dati studia i metodi per estrarre la conoscenza dei dati provenienti da diverse sorgenti:
      Dati aziendali Web (Social Network Analysis, Marketing) e Mobile (Context Aware Computing) Immagini e Video (sorveglianza, applicazioni mediche, ecc) IoT (sensori, ecc), Industry 4.0 L'obiettivo è la creazione di prodotti e servizi basati sull'estrazione di conoscenza dai dati immediatamente utilizzabile nei processi decisionali
       
      Big Data
       
      Si parla Big Data quando si ha a che fare con grandi quantità di dati
      La creazione di dati sta seguendo un processo esponenziale: nell'anno 2020 il volume totale di dati creati nel mondo è stato di più di 40 zettabyte (ZB), vale a dire 40 trilioni di gigabyte
      Si prevede che entro il 2025 il volume dei dati arriverà fino a 163 ZB (es. rapport Garante Privacy)
       
      Volume: dimensione dei dataset (oltre le capacità degli odierni DBMS) Velocità: rapidità con cui i dati arrivano e dono essere elaborate (streaming, real-time) Varietà: tipologia di dati e sorgenti semi-strutturati (XML, tweets, ...) destrutturati (documenti, pagine web) Veridicità: le sorgenti dei dati non sono controllate Variabilità: variazioni sia nella struttura dei dati che nella semantica sottostante; Valore: potenzialità dei dati in termini di vantaggi competitivi raggiungibili con la loro analisi  
      Volume e Velocità sono ancora considerate di gran lunga le caratteristiche più rilevanti nella gestione dei Big Data
      La Scalabilità è al cuore delle nuove tecnologie che ci si attende in un futuro prossimo per affrontare le sfide tecnologiche poste dai Big Data
      Infrastrutture di calcolo:
       - Cloud Computing (Docker, Servizi, Data Center, ecc.)
       - Edge/IoT Computing
       - High Performance Computing
       
      Data Science e Linguaggi di programmazione:
      R, Julia, Python, C++, Javascript, Scala
       
      Professioni:
      Data Scientist - cos è, cosa fa e quanto guadagna?
      Data Engineer
      Data Analyst
      Data Protection Officier
       
      Python
       
      Pagina ufficiale: www.python.it
      Installazione e download: www.python.org/downloads
      PIP: www.pypi.org/project/pip
      Attraverso pip si possono installare pachetti facilmente usando pip install package-name
      Jupyter: www.jupyter.org
      Per usare Jupyter Notebook usare il comando jupyter notebook
      Colab: sono jupyter notebook su google cloud accessibili con le proprie credenziali google su colab.research.google.com
      Anaconda: www.anaconda.com
      Usata moltissimo per statistica e in data science
       
      Python nasce nel 1991, ora alla versione 3 uscita nel 2008, linguaggio semplice, intuitivo e potente, facilmente comprensibile, come l'inglese parlato in grado di consentire tempi di sviluppo brevi, open source con partecipazione collettiva al suo sviluppo.
       

       
      Python è oggi uno dei linguaggi più diffusi e più usati per la sua facilità di utilizzo.
      Python è un linguaggio di programmazione ad alto livello, è un linguaggio interpretato, ovvero le istruzioni sono eseguite da un interprete e permette di eseguire dirottamente il codice sorgente che scriviamo.
       
      Python è detto anche "interattivo": possiamo scrivere le istruzioni dal prompt dei comandi senza la necessità di creare un file sorgente
       

      Interprete Python
      Python è considerato un linguaggio interpretato, offre due modalità per usare l'interprete:
      Interactive mode
      Script mode
       
      Se lanciamo il comando python da riga di comando, in in ambiente Windows che Linux, viene mostrato un nuovo prompt caratterizzato da 3 caratteri di maggiore >>> (interprete interattivo)
      L'interprete interattivo è in grado di leggere e valutare man mano le espressioni inserite dall'utente, è anche possibile eseguire script contenenti sequenze di istruzioni Python, digitando il comando: python nome_script.py
       
      IDLE
      Per la modalità interattiva: Python Shell
      Disponibile anche online: www.python.org/shell
      IDLE (Integrated Develpment and Learning Environment): ambiente visuale che permette di modificare, eseguire, e fare il debug di programmi Python da un'unica interfaccia visuale
       
      Python come calcolatrice
      Un'istruzione è un operazione che l'interprete di Python è in grado di eseguire
      Usando Python come calcolatrice viene stampato a video il valore dell'espressione
      2+2 4/2 4//2 divisione intera 4%2 modulo (resto della divisione) 3**2 elevamento a potenza (4-2)*3 precedenza tra operatori e parentesi  
      Variabili
      Python è tipizzato dinamicamente controlla i tipi solo immediatamente prima dell'esecuzione delle istruzioni tutte le variabili sono implementate con puntatori Non occorre dichiarare le variabili prima di usarle I nomi delle variabili sia lettere che numeri ma devono iniziare con una lettere oppure con un "_"; possono contenere sia lettere maiuscole che minuscole e tiene in conto della differenza (case sensitive) (a!=A) <variabile>= <espressione>  - Alla variabile che compare alla sinistra dell'= viene assegnato il valore ottenuto dalla valutazione dell'espressione;
       - L'istruzione di assegnazione non produce risultati visibili (cioè se la inviate per esecuzione all'interprete interattivo non vi viene "risposto" nulla)
      x=7 y=3.14 z=x+y s="ciao"  
      I dati (valori) sono di tanti tipi diversi
      Dal tipo del dato dipendono le operazioni che possiamo fare con esso
      8/4 ok "ciao"/2 no  
      Tipi Semplici:
      Booleani (valore di verità): True e False bool
      Numeri interi int
      Numeri in virgola mobile (metodo di rappresentazione approssimata dei numeri reali) float
      Caratteri e Stringhe (sequenze di caratteri che formano un testo) Una string può essere una stringa di lettere, numeri e simboli. Le stringhe sono racchiuse tra '' o tra "" str
      x=7 x="7" x=7.0 print(8+4) vs. print("8+4") "ciao"*2 -> "ciaociao" "Py"+"thon" -> "Python"  
      In Python le variabili assumono il tipo del valore che viene loro assegnato: numero, carattere o serie di caratteri, e lo mantengono fino a quando non viene loro assegnato un valore di tipo diverso
      #Quindi si potrebbe fare: x="ciao" x=5 In Python:
      def massimo(x,y): if x>y: return x else: return y può calcolare il massimo tra due numeri interi, due numeri reali, due stringhe, ecc..
       
      Print
      L'istruzione di stampa print permette di visualizzare il contenuto delle variabili sullo schermo
      print(x) print("ciao") print(7+2) print("5+5 fa ", 5+5)  
      Type
      La funzione type restituisce il tipo di un valore, di una variabile o di una espressione
      type(x) type(2) type('ciao') type(1==5)  
      Operatori di Confronto
      == uguale a != diverso da < minore <= minore o uguale a > maggiore di >= maggiore o uguale a  
      Operatori booleani
      and ritorna True se entrambi sono veri or ritorna True se almeno uno è vero not ritorna False se è vero, True se è falso  
      Python Assegnazione Multipla
      Con l'assegnazione multipla ottengo lo scambio dei valori:
      a, b = b, a  
      Input
      L'istruzione input (prompt) permette di acquisire valori da tastiera
      x=input("inserisci un valore") >>> Inserisci un valore 9 enter N.B: il valore viene acquisito sempre come string!! convertire il tipo con le funzioni int(), str()...
      numero= int(input('inserisic un numero:')) print(numero+7) numero=float(input('inserisci l importo in euro:')) print(numero) numero=str(numero) print(numero)  
      Script mode
      Per eseguire programmi con sequenze di istruzioni usiamo la modalità script
      python nome_script.py
       
      Nome programma: HelloWorld.py
      print('Hello World') per eseguirlo da terminale: python HelloWorld.py
      per eseguirlo da IDLE: Run -> Run Module (F5)
       
      Commenti
      # tutta la riga commentata
      I commenti non hanno effetto sul programma (l'interprete ignora la linea commentata
      #assegno a b il valore 7 b=7 Commenti su più righe
      """ commento dentro """  
      Istruzioni condizionali
      if <condizione>: <istruzione> if x==2: print('x è uguale a 2') Se x è uguale a 2 viene effettuata la stampa, altrimenti non fa nulla.
       
      Indentazione
      Le istruzioni nel corpo devono essere "rientrate" cioè stare più all'interno/più a destra della riga che contiene l'if
      Si dice che devono essere "indentate"
      La prima istruzione che non è più "indentata" segnala la fine del blocco di istruzioni che devono essere eseguite se la condizione è soddisfata
      Se il corpo è costituito da una sola istruzione può essere scritto sulla stessa riga (come negli esempi precedenti)
      x=int(input('inserisci un numero')) if(x==5): print('sono dentro if') print('sono ancora dentro if') print('sono fuori if')  
      If-else
      età=int(input('inserisci la tua età')) if età >= 18: print('sei maggiorenne') else: print('sei minorenne')  
      Cicli
      I cicli sono usati per eseguire azioni ripetitive
      Ci sono due tipi di cicli:
      while: usato quando non si sa a priori il numero esatto di volte che una azione deve essere ripetuta
      for: quando si sa in anticipo quante volte si dovrà ripetere l'azione
       
      While
      Ripete le istruzioni nella sequenza fino a quando la condizione è soddisfata
      while<condizione>: <sequenza di istruzioni> x=10 while(x>0): print(x) x=x-1 print("0! sono fuori dal ciclo")  
      For
      Assegna alla variabile il primo elemento della sequenza
      Esegue le istruzioni nel corpo
      Fintantoché ci sono elementi nella sequenza assegna alla variabile l'elemento successivo e torna al passo 2.
      Spesso la lista che si usa nel for è generata dalla funzione range:
      for <variabile> in <sequenza>: <sequenza di istruzioni> #stampare i numeri tra 0 e 10 for i in range(11): print(i) #stampare i numeri tra 1 e 10 for i in range(1,11): print(i)  
      Break
      Se eseguo l'istruzione break dentro un ciclo while o for, "uccido" il ciclo e ne esco immediatamente
       
      Continue
      Idem per continue, prosegue al passo successivo.
       
      For/Else
      I cicli for hanno anche una clausola else
      La clausola else viene eseguita dopo il completamento normale del ciclo. Ciò significa che il loop non ha riscrontrato un'istruzione break
      for item in container: if (search_something(item): #Found it! process(item) break else: #Didn't find anything... not_found_in_container()  
      Esempi:
      #!/usr/bin/env python # coding: utf-8 # **** Jupyter Notebook con esempi introduttivi **** # In[ ]: print("Hello world") # In[ ]: print("Espressioni",2,4/2,5//2,5%2,3**2,(4-2)*3) # In[ ]: x=7 y=3.14 z=x+y s="ciao" b=(1 == 2) b1=(1 <= 2) print(x,y,z,s,b,b1) x="python"+"3" print(x,type(x)) print(y,type(y)) print(s,type(s)) print(b,type(b)) print(b1,type(b1)) # In[ ]: def massimo(x,y): if x>y: return x else: return y print(massimo(12,15)) print(massimo("ciao","roma")) print(massimo(3.4,6.7)) # In[ ]: x=10 y=11 x ^= y y ^= x x ^= y print(x,y) # In[ ]: x,y=y,x print(x,y) # In[ ]: x=int(input('inserisci un numero')) if(x==5): print('sono dentro if') print('sono ancora dentro if') print('sono fuori if') # In[ ]: x=int(input('inserisci un numero')) if(x==5): print('sono dentro if') print('sono ancora dentro if') print('sono fuori if') # In[ ]: x=int(input("Inserisci un numero")) if x==0: print("numero 0") elif x==1: print("numero 1") elif x==2: print("numero 2") else: print("Un altro numero") # **** Costrutti **** # In[ ]: x=10 while(x>0): print(x) x=x-1 print("0! Qui sono fuori dal ciclo") # In[ ]: while True: print("Hello, World!") print("Qui") # In[ ]: for i in range(10): print("A"+str(i),end=", ") print("A10.") # In[ ]: for a in range(1,11): for b in range(1,11): print(a*b) # In[ ]: for a in range(4): for b in range(4): print("*",end=' ') print("\n") # In[ ]: for i in range(2): x=int(input()) if (x>10): print("Trovato!") break else: print("Niente da fare") # In[ ]: for i in range(2): for j in range(2): x=int(input()) if (x>10): print("Trovato!") break else: continue break else: print("Niente da fare") print(i,j) # **** Strutture dati: liste e tuple ****  
       

    • Qoob, un’applicazione che permette di vedere e scaricare tutti i contenuti della piattaforma, in modo semplice e mentendo l’anonimato. Come vedere le storie su instagram senza farsi vedere è una delle tante funzioni promesse da Qoob.
      Come funziona Qoob Stories?
      Qoob Stories è una vera finestra su Instagram, una volta lanciata l’app, permette di accedere ai contenuti del social anche senza bisogno di fare nessun accesso con il vostro account. Se si vuole, si può anche collegarsi col proprio account, così da permettere all’applicazione di prelevare un token.
       

        Con o senza aver fatto l’accesso al vostro account, l’applicazione permette di vedere le storie dei vostri amici, anche quelle che vi sono nascoste, senza difficoltà. Inoltre, vedendole con Qoob (anche dopo aver fatto il login), non sarete presenti nella lista di coloro che hanno guardato la Storia.
      Quindi potrete godervi le Storie degli amici e conoscenti anche a loro insaputa. Uno degli interessi maggiori per chi utilizza Instagram infatti è capire come vedere storie instagram senza essere visti.
      Per gli utenti che acquistano la licenza è disponibile anche la possibilità di vedere i post e le Storie anche degli account privati. L’app però nasce soprattutto per rendere più semplice lo scaricamento dei contenuti da Instagram.
      Come si scarica e si installa Qoob Stories
      Potete usare Qoob su PC con uno dei seguenti sistemi operativi: Windows, macOS e Linux.
      Per installarla su tutte le piattaforme compatibili la procedura è simile, basta andare a sulla pagina di download di Qoob, scaricare l’eseguibile adatto al proprio sistema operativo (in genere viene riconosciuto in automatico), infine a scaricamento concluso, cliccare sul file per avviare la rapida installazione guidata.
      L’installazione guidata non è in italiano, ma è comunque assolutamente semplice, basta cliccare sul pulsate “Next” per andare avanti, spuntare la casella per accettare la licenza, scegliere la cartella di installazione (o ancora più semplicemente lasciare quella di default), quindi terminare la procedura cliccando sul tasto “Install” e poi su “End“.
        Nonostante la procedura di installazione sia in inglese, fin dal primo avvio noterete che l’app è completamente tradotta nella nostra lingua.
      Come si usa l’applicazione
      Qoob Stories è semplice e immediato da utilizzare. Essendo principalmente un tool per lo scaricamento di contenuti (foto, video, Storie), permette sia di scaricare i post degli altri account, sia di fare il backup del proprio.
      Avviando l’app, noterete che l’interfaccia è chiara e intuitiva, completamente tradotta nella nostra lingua. Vi saranno sufficienti pochi click per ambientarvi. In alto è presente la barra in cui cercare gli account che vogliamo tenere d’occhio e da cui potremmo decidere di scaricare contenuti.

        Basta inserire un nome utente, per cercarlo, una volta trovato si può cliccare sul pulsante “Iscriviti a“. Dopo una breve analisi dell’account Qoob Stories mostrerà tutti i contenuti disponibili e si potrà procedere al download. Si potrà scegliere cosa scaricare col tasto a lato e la cartella di destinazione.
      Grazie alla sezione di impostazioni si può decidere di limitare il download solo agli elementi caricati in un certo intervallo di tempo, oppure solo dei video o delle foto. Una volta iscritti, Qoob scansionerà l’account dell’utente e provvedendo allo scaricamento automatico degli elementi indicati nella cartella da te scelta.
      Tutti gli elementi verranno scaricati automaticamente al massimo della qualità disponibile.
      Qoob Stories è gratis?
      L’applicazione gratuitamente offre la possibilità di iscriversi e quindi monitorare e scaricare i contenuti da due account, per un massimo di 200 contenuti al giorno. Il piano gratuito non permettere di accedere ai post degli account privati.
       

        Esistono dei piani a pagamento che permettono una maggiore libertà: il piano personale ad esempio con un costo di €8,54 al mese, permette di avere:
      la possibilità di seguire 10 profili alla volta; la possibilità di scaricare infiniti contenuti; accesso ad infinite Storie da scaricare; il supporto illimitato all’accesso dei contenuti degli account privati. Entrambi i piani descritti sono dedicati ai clienti privati. Se dovete fare un utilizzo professionale di Qoob, tocca optare per il piano per uso commerciale.
      Questo è più il piano più costoso, ma anche quello più completo, non ha limiti di nessun genere. Offre le stesse caratteristiche del piano personale ma con la possibilità di seguire un numero illimitato di profili.
      Trovate maggiori informazioni su tutti i piani e le offerte alla pagina appena linkata. Il pagamento può essere effettuato comodamente tramite PayPal o Carta di credito.
       

      Inoltre gli utenti hanno a disposizione la pratica pagina di supporto, con guide anche nella nostra lingua per imparare a sfruttare al meglio il software. Inoltre, cliccando in basso a sinistra, si ha ogni giorno a disposizione un operatore in carne ed ossa, per essere guidati al superamento di ogni difficoltà.
       
       

    • Free Netflix Download software per scaricare Film e Serie da Netflix
      Free Netflix Download (FlixGrab) è un programma in grado di scaricare film e serie TV da Netflix. Con questo programmino potrete scaricare dalla famosa piattaforma di streaming senza alcuna limitazione, gratuitamente e senza consumare giga sul vostro dispositivo quando dovete rivederlo offline e su qualsiasi dispositivo.
       
      Attualmente Netflix non consente di scaricare tutti i contenuti in modalità offline ma comunque è possibile scaricare i contenuti di Netflix per guardarli offline su qualsiasi dispositivo, compresi iPad e Android, ma questi hanno una validità e soprattutto sono disponibili in un formato compatibile solo con l’app ufficiale. La funziona originale però ha la limitazione di funzionare solo con l’app ufficiale di Netflix.

      Se volete vedere un contenuto di Netflix scaricato per la visione offline non potrete farlo con un player video comune scansionando la memoria interna del vostro dispositivo. Ecco qui che entra in gioco Free Netflix Download che è un’app unica che permette di scaricare interi film, programmi TV, documentari, serie TV e altro direttamente da Netflix.
       
      Con questa applicazione, potrai scaricare e guardare qualsiasi video NetFlix offline su qualsiasi dispositivo senza spendere traffico Internet ma comunque dovrete avere un account originale Netflix con cui loggarvi. Sono tante le caratteristiche presenti su questa applicazione che vi permetterà di crearvi la vostra libreria multimediale da vedere offline.
      Features
      Interfaccia totalmente nuova e intuitiva! Ci auguriamo che ti piaccia; Puoi facilmente interrompere, riprendere il processo di download e molto altro; Selezione automatica della qualità (selezionando sempre quella più alta) e della lingua scelta; Supporta il download di Dolby Digital Surround Audio 5.1; Download gratuito da Netflix Supporto per il download di video in 4K; Il download gratuito di Netflix è in grado di scaricare più video contemporaneamente al massimo della velocità; Supporta il download dei sottotitoli in formato TTML. Download Free Netflix Download
      Il download di Free Netflix Download è disponibile cliccando sul link seguente ed inoltre abbiamo scovato una versione Portable che potrete utilizzarla senza installare nulla sulle vostre postazioni. Una volta installato ed avviato dovrete semplicemente incollare il link del video Netflix nel programma e premere sul pulsante download dopo aver selezionato la qualità.
      =>Download Free Netflix Download Portable (FlixGrab)
       

    • Guida su come installare un addon usando una Repository o il file ZIP su Kodi
      Kodi deve buona parte del suo successo agli addons, le classiche estensioni o componenti aggiuntivi, che permettono di aggiungere numerose ed infinite funzioni alle molte già presente di base. Di base ci sono una sacco di addons che si possono semplicemente attivare dall’interfaccia grafica ed aggiungono già moltissime funzioni ma la maggior parte degli addons di successo sono sviluppati da terzi.
       
      Proprio per questo, andremo a vedere come installare addons su Kodi, ma anche temi ed altro installandoli da un file ZIP o da una Repository. Con il file ZIP l’installazione sarà diretta e dovremo procurarcelo, mentre aggiungendo una repository potremo andare a sfogliare tutti i file presenti nella repo e quindi potenzialmente installare diversi addons diversi.
      La procedura di installazione è stata semplificata nelle ultime versioni di Kodi ed aggiungere un addons è ancor più semplice e noi andremo a vedere come installare un file ZIP di un addons o di una repo oppure aggiungere direttamente una repository. Vi indicheremo i passi da seguire singolarmente così da non sbagliare l’inserimento.
      Abilitare origini sconosciute su Kodi
      Un requisito fondamentale per poter installare in libertà un addons, tema o programma su Kodi è quello di abilitare le origini sconosciute. Questo permette di aggiungere parti esterne a Kodi e per farlo dovete abilitarle seguendo i semplici passaggi che permetteranno di aggiungere addons e repo con i passi che poi troverete dettagliate di seguito.
      Cliccate su Impostazioni. Vai sulla voce Add-ons. Trova la voce Unknow sources o Sorgenti Sconosciute e sposta il toggle (pulsante a scorrimento) per attivarlo. Se non visualizzate il menu di Sorgenti Sconosciute dovete selezionare in basso a sinistra sull’icona a forma di ingranaggio e selezionare la voce Esperto o Expert. Come installare addons da file Repository su Kodi GUIDA
      Dopo aver abilitato le sorgenti sconosciute, avendo un
      Avvia Kodi; Apri il menu SISTEMA e clicca su Gestione File; Clicca due volte su Aggiungi Sorgente; Clicca sulla voce <Nessuno>; Nella finestra che si apre dovete inserite l’URL https://SITO DELLA REPOSITORY e cliccate su Fatto quando avete terminato; Rinominate la nuova sorgente in Nuova Repo e cliccate su OK in basso; Ora dalla Home di Kodi cliccate sulla voce Add-ons presente nella barra laterale sinistra; Cliccate sull’icona a forma di scatola con una freccia presente in alto a sinistra; Si aprirà una finestra, dove avrete diverse opzioni disponibili tra cui Installa da Repository che dovrete selezionarla e premere il pulsante di conferma; Si aprirà la finestra con l‘elenco di tutte le Repository che avete aggiunto in precedenza e semplicemente andandoci sopra si aprirà una sorta di file manager dove trovare l’addons, tema o programma da installare sfogliando tutte le cartelle presenti sulla Repository. Come installare addons da file ZIP su Kodi | Guida
      Il requisito fondamentale per continuare la guida, dopo aver abilitato le sorgenti sconosciute, è quello di procurarvi il file ZIP dell’addons, tema o programma da installare tramite la procedura seguente. Di solito è un file di pochi KB con estensione .ZIP che non dovete scompattare ma usare così come lo scaricate. Ecco la guida:
      Dalla Home di Kodi cliccate sulla voce Add-ons presente nella barra laterale sinistra; Cliccate sull’icona a forma di scatola con una freccia presente in alto a sinistra; Si aprirà una finestra, dove avrete diverse opzioni disponibili tra cui Installa da un file zip che dovrete selezionarla e premere il pulsante di conferma; Nella schermata che si aprirà potete andare a selezionare il file ZIP dell’addons scorrendo le cartelle presenti sul vostro dispositivo oppure sulla chiavetta USB esterna collegata al dispositivo.  

    • The Lite è una build per Kodi con tantissimi addons già pronti per accedere a migliaia di contenuti in streaming gratis tra sport, film e serie TV
      The Lite è una nuova build per Kodi che permette installare diversi addons in modo automatico e già preconfigurato in pochi click. Infatti una build è più che un addons, poiché installa in colpo solo, addons, temi e settaggi vari così da avere Kodi già pronto all’uso senza dover configurare tutto manualmente e singolarmente senza le informazioni da sapere.
       
      LEGGI ANCHE: COME INSTALLARE UN ADDONS SU KODI | GUIDA
       
      The Lite è una raccolta di addons e temi che vengono installati in automatico, e da quello che si legge in rete è la build Kodi perfetta e già pre-configurata con tutti gli addons utili per vedere contenuti in streaming gratis. La Build è davvero ottima e sebbene abbia una grafica semplice con sfondi discutibili permette di accedere a tantissimi contenuti in streaming gratis senza dover fare nulla o configurare qualcosa.
      In particolare la sezione Movies indicizza una serie di film, opere teatrali, nuovi film del 2021 e commedie peccato siano tutti in inglese, ma la sezione più interessante è sicuramente quella dedicata allo sport dove sono presenti tutti gli sport da tutto il mondo (Italia inclusa con il calcio in prima linea) ma anche altri sport. Ecco le varie categorie disponibili:
      Movies TV Shows Track Kids Sport Come installare The Lite Build su Kodi
      Il primo passo da seguire ovviamente è quello di scaricare Kodi dal sito ufficiale CLICCANDO QUI e scegliere la versione per Windows, MAC, Android e altri dispositivi e sistemi operativi compatibili. Di seguito trovate la nostra guida dedicata su come installare un addons su Kodi, usando una Repository o un file ZIP che dovrete scaricare da internet ed avere già memorizzato sul dispositivo dove è avviato Kodi.
       
      Poi per installare The Lite Build Kodi dovrai seguire questi semplici passaggi sul vostro Kodi (la procedura è identica su tutti i sistemi operativi) e quando indicato di inserire la repository dovrai mettere l’indirizzo http://cmanbuilds.com/repo/ dove sono memorizzati una serie di addons per Kodi da installare con un click dopo aver installato la repo di The Lite.
      Avvia Kodi ed aspetti che si carichi la schermata della Home Scorri sulla voce Sistema Cliccate su Gestione File Doppio click sulla voce Aggiungi Sorgente Cliccate su <Nessuno> e inserisci l’indirizzo http://cmanbuilds.com/repo/ Fai clic su Fatto per salvare la repo Ora dovete Rinominare la nuova repository aggiunta in The Lite Repo e confermate selezionando il pulsante OK Ora devi torna nella home di Kodi andare sulla voce Sistema -> Add-On (Prima icona in alto a sinistra)->Browser  -> Installa da un file zip  Infine devi cliccare su The Lite Repo -> repository.CMaNWizard-x.x.x.zip Attendete che l’installazione sia completata Ora vai alla home di Kodi vai su Sistema -> Add-On (Prima icona in alto a sinistra)-> Browser -> Installa da un Repository Clicca su cMaN’s Wizard Repository Ora vai in Program add-ons -> cMaN Wizard Seleziona Installa Chains Build Wizard all’ultima versione disponibile Scorri in basso fino a trovare Highlight – The Lite e cliccaci sopra Seleziona Continua La build verrà ora scaricata e installata Fai clic su Forza chiusura al termine oppure riavvia Kodi o il dispositivo Apri Kodi e lascialo agire per un paio di minuti in modo che eventuali aggiornamenti possano essere completati
        Ora che avete installato la build The Lite Build su Kodi andante in nella home di Kodi per aprire tutti gli l’addon e godervi il miglior media center già configurato con i migliori addons e temi per accedere a migliaia di contenuti in streaming già pronti da accedere.
      Come riabilitare i vecchi add-on installati
      Installando questa Build, tutte le vecchie personalizzazioni saranno disabilitate ma non eliminate e potrai sempre riattivarli manualmente. Per farlo dovrai andare nella home di Kodi e andare in Add-on -> I miei Add-on -> Tutto e cliccare sugli add-on disabilitati e poi sul tasto Abilita per riattivarli.
       

    • Applicazione per Android, iOS, Windows, macOS e Linux per guardare in streaming gratis
      Rokkr è una delle applicazioni più ricercate del momento e che permette di accedere a tantissimi contenuti in streaming da vedere gratuitamente. Infatti come ogni app che si rispetti, Rokkr oltre ad avere una grafica curata, indicizza una serie infinita di contenuti disponibili in streaming senza pagare con moltissimi film e serie TV anche in Italiano.
       
      Rokkr è un applicazione gratuita disponibile per tantissime piattaforme come Android, iOS, Fire TV Stick, MAC, Windows e anche Linux. Insomma su tutti i dispositivi in commercio potrete vedere film, serie TV e una grande selezione di canali live italiani. Rokkr è la sostituta di Watched e contiene gli stessi contenuti sempre aggiornati e funzionanti, con tutte le sezioni ottimamente ordinate.
       

       
      Lo streaming dell’app Rokkr riprende sempre la fonte di Watched e carica i contenuti presi direttamente da Netflix, Amazon e altri contenuti famosi. L’app Rokkr ricorda il controverso Vavoo.tv Media Center così come Watched ed infatti gli URL dei bundle per Rokkr e Watched sono completamente compatibili e si trovano facilmente su internet.
      Come funziona Rokkr
      Dopo aver installato l’app sul vostro dispositivo (link al fondo di questo articolo) inseriamo come fonte huhu.to oppure watched.com proprio come facevamo su Watched. In automatico verranno caricate una serie di sezioni contenente film, serie TV e canali live. Per trovare i contenuti nella nostra lingua dovrete selezionare la nazione tra quelle disponibili tra cui c’è anche l’Italia.
      Download Rokkr
      Potete scaricare l’applicazione di Rokkr gratuitamente direttamente dagli store ufficiali per i diversi sistemi operativi e di seguito trovate il link diretto che vi rimanderà alla fonte dove installarla facilmente. Rokkr è disponibile per Android, iOS, MAC, Windows e anche Linux ed in particolare quella di Android funziona alla perfezione anche su la chiavetta Fire TV Stick.
      Conclusioni Rokkr
      Abbiamo letto una marea di recensioni online e l’abbiamo anche provata noi direttamente sul nostro dispositivo Android e devo dire che durante la visione di contenuti on-demand lo streaming è stato quasi impeccabile se non per qualche sporadico blocco, mentre per quanto riguarda gli elementi live, si bloccavano spesso con buffering continuo ma per fortuna non su tutti i canali.
       
       

    • Libri per Amazon Kindle Gratis e Scaricare eBook gratis per Kindle
      Avete comprato il nuovo eBook Reader di Amazon e volete iniziare ad usarlo a fondo iniziando a leggere i vostri libri digitali? Ben dovete sapere che esiste un pratico abbonamento denominato Kindle Unlimited (ISCRIVITI QUI), che al prezzo di 9.99 euro al mese avrete accesso a milioni di libri da scaricare senza limiti. Se però volete scaricarli gratis ecco come fare.
      Se il miglior metodo per scaricare libri ed eBook sul tuo Kindle è quello di acquistarli dallo store ufficiale di Amazon, dovete sapere che tutti gli eBook Reader hanno una memoria interna che permette di ricevere in ingresso i libri e leggerli senza problemi. Dunque se scaricate i libri per il Kindle e li copiate sulla memoria interna potrete leggerli facilmente, ecco come scaricarli gratis.
       

       
       
      Gli eBook Reader di Amazon sono in grado di leggere molti formati tra cui il MOBI è quello più compatibile e si trovano file con estensione .prc o .mobi e sono accettati anche i formati .AZW oltre che AZW3 e TPZ ma i Kindle legge anche i file TXT, PDF, HTML, DOC, DOCX, JPEG, GIF, PNG, BMP. Non legge gli EPUB ma è molto facile convertirli usando magari il programma Calibre.
       
      Ora che sapete quali formati legge il Kindle andiamo a vedere praticamente come scaricare eBook gratis per Amazon Kindle e anche scaricare libri gratis per Kindle in italiano. Esistono alcuni portali strapieni di eBook e libri completi da scaricare e caricare sul Kindle.
      Download Libri Kindle gratis
      Se volete scaricare libri per Kindle gratis i migliori siti sono i seguenti:
      Directory con 110GB di eBook COME ACCEDERE ALLA DIRECTORY CON OLTRE 110GB DI EBOOK ITALIANI DA SCARICARE Libri.cx (QUI nuovo indirizzo) Il migliore di tutti. Aggiornatissimi, con tanti se non tutti i libri presenti e grande community che partecipa. Una vera istituzione che dovete usare a tutti i costi. AVAXHOME (QUI nuovo indirizzo) Il migliore nel campo delle riviste, quotidiani, magazine e periodici di tutti i tipi ed in tutte le lingue del mondo. Sempre super aggiornato. EurekaDDL (QUI nuovo indirizzo) Spettacolare portale dove trovare di tutto tra cui migliaia di eBook per Kindle e tutti gli eBook Reader in commercio, senza pagare. Unblocked Fantastico sito dove trovare tutti i link per siti torrent ed altro dove scaricare libri in inglese ed internazionali. LeggendItaly (QUI nuovo indirizzo) Ecco il famosissimo sito web per scaricare materiale pirata ma che dispone anche di una grandissima libreria con centinaia di eBook, sempre aggiornato, link funzionanti e testi per cercare il libro da leggere. E’ il numero uno. Library Genesis (https://libgen.is/) E’ un fantastico portale dalla grafica veramente basilare, ma che con una semplice ricerca nella barra bianca in alto con il titolo del libro che cercate, otterrete i risultati che desiderate un pochi secondi. Ecco il link diretto di ricerca dei contenuti in Italiano.
      http://93.174.95.27/search.php?req=italian&open=0&res=25&view=simple&phrase=1&column=language eBook Spy (eBookSpy.com) E’ un sito web molto fornito, sempre aggiornato anche se i libri presenti sono un po vecchiotti, ma per chi cerca vecchi libri è sicuramente molto interessante. Sono disponibili eBook nei formati più diffusi, in lingua Italiana e link veloci per il download. Siti dove trovare eBook da scaricare gratuitamente
      Su questi potrete trovare tantissimi libri da scaricare in modo gratuito e lecito tra offerte, promozioni, sconti e collezioni di libri che sono distribuiti gratuitamente.
      ManyBooks (https://manybooks.net/language.php?code=it) Gutenberg (http://www.gutenberg.org/) Molwick (https://www.molwick.com/) eBook 3000 (http://www.ebook3000.com/) Feedbooks (http://it.feedbooks.com/publicdomain) eBookGratis.net (http://www.ebookgratis.net/) eBooksItalia (https://www.ebooksitalia.com/) eBookgratis.biz (http://ebookgratis.biz/ebook-gratis) MondadoriStore (eBook Gratis) (https://www.mondadoristore.it/eBook-italiani-gratis/gr-3046/) Amazon (eBook Gratis) (https://amzn.to/2GjzvEY) BookRepublic (https://www.bookrepublic.it/ebooks/collection/ebook-gratis/) Altri siti dove scaricare eBook gratis
      Sui seguenti siti troverete oltre a tanti libri gratuiti anche letture, estratti, manuali, produzioni originali e molti altri.
      Google Libri Streelibstore BookRepublic Apogeonline Biblioteca Italiana Ebook Gratis Free Tech Books Immensola Issuu Kult Virtual Press Letture Giovani Liberliber Scribd Logos Library Free Computer Books World Library
        Nella maggior parte dei casi i libri saranno scaricati in formato .ePub, e dovrete convertirli in formato .Mobi per farli leggere al Kindle. Di solito in tutti i siti indicati troviamo la compatibilità dell’eBook che stiamo scaricando così da non sbagliare.
      Download Libri gratis legalmente
      Ecco i migliori portali dove sono presenti migliaia di libri, riviste e molto altro gratuitamente e legalmente:
       
      Piattaforma OpenLibrary Progetto Gutenberg LiberLiber Archive.org Amazon eBook Gratis  
       

    • Un'immensa directory con tantissimi eBook da scaricare direttamente senza attese alla massima velocità
      Online è comparsa da un po di tempo una raccolta delle migliori directory dove scaricare libri digitali, gli eBook, e verso la metà di quest’anno è stata aggiornata portando il totale degli eBook scaricabili gratuitamente ad oltre 1 milione. La libreria è stata pubblicata su The-Eye ed include una serie infinita di sotto directory dove poter scaricare davvero tantissimi eBook anche in Italiano.
       
      LEGGI ANCHE: LIBRI.CX: MIGLIOR SITO DOVE SCARICARE EBOOK
       
      Gran parte di quelli presenti sono in lingua Inglese e come le librerie aperte (Open Calibre) si accede senza avere una password o limiti di accesso ed inoltre non sono presenti immagini e anteprime. La directory è cruda e senza fronzoli, ma terribilmente efficace se sapete cosa dovete scaricare così da andare alla ricerca puntuale del vostro libro preferito.
       

       
       
      L’archivio è raggiungibile all’indirizzo https://the-eye.eu/public/Books/Calibre_Libraries/ e contiene diverse directory dove trovare oltre 1 milione di eBook da scaricare velocemente. Non è un sito con grafica curata, ma semplicemente una raccolta di directory che si sfoglia facilmente che contiene tutte le cartelle suddivise con all’interno tutti i libri nei tre formati più diffusi, EPUB, MOBI e PDF.
      Directory Calibre Libraries
      Vista la presenza di tutti e tre i formati ideale per i maggiori eBook Reader disponibili tra cui anche i comuni PDF che si possono aprire anche con un normale PC, si trovano una quantità di oltre 1.000.000 di libri moltissimi in lingua Inglese ma anche diversi (poche migliaia) in lingua Italiana. Tutti i libri sono scaricabili dal link diretto presente nella cartella di rete condivisa, senza hosting o procedure strane.
       
      LEGGI ANCHE: DOVE SCARICARE LIBRI KINDLE GRATIS
       
      LEGGI ANCHE: DOVE SCARICARE AUDIOLIBRI GRATIS IN ITALIANO
       
      LEGGI ANCHE: DOVE SCARICARE GIORNALI QUOTIDIANI E RIVISTE GRATIS
       
      E’ possibile scaricare da tutte le directory senza la visualizzazione di alcuna pubblicità, virus o altro quindi potrete scaricare tutto in sicurezza. L’archivio è in costante aggiornamento, anche se a luglio 2020 è stata inondata di nuovi aggiornamenti che ha portato ad avere giga e giga di PDF, EPUB e MOBI da caricare sul vostro eBook Reader.
      Sono davvero esterrefatto che un libreria così immensa sia disponibile su internet così facilmente e pubblicamente. Sul portale è possibile scaricare libri facilmente in lingua Italiana e la quantità di libri disponibile vi permetterà di leggere per tutta la vita gratis, senza spendere un centesimo. Trovate anche manuali, documenti, estratti e molto altro oltre ai normali eBook.
       
       

    • Guida per scoprire il link dietro ai siti che si occupano di criptarli
      Quante volte vi è capitato di aprire un file trovato su internet e ritrovarvi un link che indirizzava al sito FileCrypt.co? Questo accade soprattutto sui numerosi siti di hosting che ospitano programmi e altro dove chi carica i contenuti vuole preservare il link originale, così che non sia condiviso sul web senza il consenso. Servici come FileCrypt.co si occupano di criptare i link e renderli sconosciuti.
      Esistono molti altri servizi come FileCrypt.co e la guida che abbiamo scritto oggi è unica nel suo genere e non l’abbiamo trovata da nessuna parte e vi permetterà di decriptare i link presenti su FileCrypt.co e siti simili. Così facendo avrete i link puliti e non criptati da nessun servizio di link encryption che verrà smascherato da questa semplicissima procedura.
       

       
       
      Di seguito una guida semplicissima su come decriptare i link che trovate in giro per il web come quelli di FileCrypt.co e di altri servizi simili. Abbiamo provato personalmente la guida anche perché abbiamo scovato noi questo escamotage, ed il bello che potrete attuarla senza dover usare applicazioni esterne o procedure strane, tutto molto semplice ed intuitivo con tanto di immagini per aiutarvi meglio.
      Guida per Decriptare link Filecrypt.co e di altri
      Una volta che avete aperto il link Filecrypt.co o siti simili che si occupano di criptare i link e non renderli visibili, come nell’immagine seguente, il link è di EasyBytez ma il link visualizzato in alto nella barra degli indirizzi è camuffato appunto dal servizio Filecrypt.co ma per fortuna esiste un metodo semplice per decriptarlo ed ottenere il link reale.
       

       
       
      Una volta che siete sulla pagina del link, se è di un sito di hosting dovete avviare il download, anche nella versione gratuita. Ad esempio qui dovete cliccare su Free Download per avviare l’inizio del download del file anche se non dovete iniziare.
       

       
       
      Ora che siete nella pagina cliccate in un punto qualsiasi con il pulsante destro del mouse della pagina e se usate Chrome cliccate sul pulsante Ispeziona oppure su Visualizza Sorgente su Firefox, e si aprirà una pagina con tutto il codice del sito web. Tra queste informazioni verrà mostrato anche un link (sempre criptato).
       

       
       
      Ora dovete copiare ed incollare il link che visualizzate nella sezione Ispeziona e mettetelo nella barra degli indirizzi in alto e date un invio per aprirlo.
       

       
       
      Come nell’immagine seguente dovrete copiare ed incollare il link nella sezione Ispeziona che sarà leggermente diverso e meno lungo di quello originale criptato e questo sarà non criptato ma sarà solo un redirect verso il sito originale.
       

       
       
      Dopo aver dato l’invio nella barra degli indirizzi, dopo qualche secondo, si aprirà la pagina con il link originale che come vedete nell’esempio in basso è quello di EasyBytez non criptato ed è il link che è quello vero senza passare da FileCrypt.
       

       
       
      Avete finito. Ora avete trasformato un link FileCrypt.to in uno pulito e non criptato.
       
       

    • Windows 10 Pro Lite utile da installare su computer vecchi, lenti e con poca RAM
      Sono da sempre molto richieste e le versioni Lite delle varie edizioni di Windows sono comparse in rete con cadenza regolare. Sin dai tempi di Windows XP, le versioni super leggere con servizi, applicazioni e rimozione di elementi grafici inutili e che appesantivano il computer. Ecco che anche Windows 10 ha la sua versione Lite che vi permetterà di installarla anche su vecchi computer.
      Windows 10 Lite è una particolare versione di Windows 10 che come dice il nome stesso “Lite” è una versione leggera, epurata delle parti inutili e che servono solo per abbellire e funzionalità poco utilizzate. Con questi stratagemmi e qualche script ben fatto che va a disattivare tutti i servizi inutili di Microsoft, ecco che potremo installare Windows 10 su tutti i PC del mondo, anche quelli più vecchi.
       
      Utilizzo le versioni Lite da moltissimi anni, ho usato Windows XP Lite e anche la versione eterna Windows 7 Lite, che ho installato su un PC vecchissimo, ed anche questa versione di Windows 10 Lite che è disponibile nella versione Pro e quindi non la Home, l’ho installata su un PC con appena 2GB di RAM e processore AMD non recente e funziona alla perfezione, veloce e leggero.
      Per Windows 10 Lite è così leggero?
      E’ super leggero perché sono stati rimossi tantissime funzionalità non utilizzate o poco importanti che pesano tantissimi e poi sono stati inseriti diversi script e ottimizzazioni per velocizzare Windows 10 il più possibile. In particolare tra le funzionalità che sono state rimosse e che pesano tantissimo sulle risorse del sistema e sono:
      Servizi Privacy Modern UI Apps Keyboard (Lingue) & Languages Temi  
      Inoltre troviamo una serie di utili ottimizzazioni che ovviamente sono state creata da persone esperte e che hanno modificato alcune opzioni di Windows 10 nella sua versione classica e sono:
      Sono stati aggiunti tutti i tweaks Tutte le ottimizzazioni Driver di default sono presenti nell’iso. Requisiti minimi Windows 10 Lite
      I requisiti minimi per funzionare sono davvero essenziali partendo da appena 2GB di memoria RAM ed un processore da solo 2Ghz e devo dirvi che io ho installato questa versione su un vecchio PC con processore da 2.2Ghz e 2GB di RAM DDR2 e gira molto bene senza rallentamenti o problemi. Certo non è rapidissimo ma se rispettate questi requisiti minimi potrete installare Windows 10 Lite:
      Processore 2 GHz RAM 1 GB (32 Bit), 2 GB (64 Bit) Memoria 8 GB (32 bit) Scheda Grafica Microsoft DirectX 9 con driver WDDM Info utili Windows 10 Lite
      Che versione di Windows 10 è? PRO Windows 10 Lite è in Italiano? SI E’ disponibile anche la versione da 32 bit? SI C’è anche una versione a 64 bit? SI Questa versione è già attivata? SI Dove scaricare Windows 10 Lite
      Potete scaricare la versione di Windows 10 Pro Lite 2004 aggiornata a Dicembre 2020 dal peso di circa 2GB aprendo il link seguente. Come vedete è la versione Pro, sembrerebbe già attivata (anche se io ho usato il mio codice di licenza), ed è inutile specificarlo che è una versione non ufficiale e non distribuita da Microsoft e vi invitiamo ad attivare con una licenza originale.
       
      https://filecrypt.co/Container/BD36AF5E58.html  
       

    • Bee è un’app permette di minare direttamente dallo smartphone.
      Bee Network è una criptovaluta che sta spopolando in rete da dicembre 2020 e che a gennaio 2021 ha raggiunto un discreto seguito di utenti. Infatti in poche settimane ha raggiunto l’incredibile cifra di oltre 1 milione di utenti che minano Bee e il fatto del tanto successo è dovuto al fatto che minare Bee è gratis, si fa con lo smartphone installando una semplice app.
      Cos’è la criptovaluta Bee?
      Bee non è ancora una criptovaluta, ma è un token. Vuol dire che sono state avviate le procedure per minare le criptovalute ma non sono quotate su nessun exchange. In poche parole, Bee non ha ancora un valore di riferimento con cui quantificare il suo reale prezzo al cambio Bee-Dollari/Euro ma questo è un comportamento normale per tutte le criptovalute che vogliono emergere.
      Come si estraggono (minano) Bee?
      Bee Token (BEE) è un token e opera sulla piattaforma Ethereum ed è possibile estrarla semplicemente installando la sua applicazione sullo smartphone. Si mina in maniera completamente gratuita, si installa l’app, accedi con il tuo account Facebook o il numero di telefono ed il contatore dei Bee inizia a partire.
      L’unica attività da fare, è cliccare ogni 24 ore sul pulsante verde a forma di ape, così da avviare il contatore e minare i Bee. Purtroppo al momento è proprio l’attività di mining a preoccupare di più, perché a noi sembra più un contatore che un’attività di mining vera e propria poiché come pubblicizzato dagli stessi produttori, l’app non consuma batteria e non consuma banda, ma è tutto basato sul Cloud Mining.
      L’attività di estrazione è gratuita e ogni ora potrete raggiungere la cifra fino a 1.6 Bee estratto secondo le regole seguenti:
      1,6 Bee prodotti all’ora se utilizzato da meno di 100.00 utenti 0,8 Bee prodotti all’ora se si superano i 100.000 utenti 0,4 Bee prodotti all’ora se si superano 1 milione di utenti 0,2 Bee prodotti all’ora oltre 10 milioni di utenti 0,1 Bee prodotti all’ora oltre 100 milioni di utenti 0 Bee La produzione terminerà quanto ci saranno 1 miliardo di utenti. Secondo i programmi di Bee Network, la criptovaluta sarà estratta tra il 2020 e il 2023. Arriverà sul mercato entro il 2021 e nel 2024 dovrebbe finire la sua estrazione. Al momento, sempre secondo Bee Network, il costo di 1 Bee Coin sarà di 1 dollaro in fase di partenza, per poi agganciarsi ai vari exchange per aumentare il valore reale.
      Bee è una truffa?
      Bee Network non è nuovo sul web, e ricalca in pieno quanto visto nel 2018 (forse anche prima) da Pi Network, che permetteva di minare gratis la criptovaluta (ancora Token) Pi, sempre tramite un’app. Ed è proprio l’applicazione ad essere il problema principale, con autorizzazioni a non finire dalla prima installazione e che ha molto di sospetto.
      Infatti il sito web ufficiale di Bee, è solo pieno di frasi, slogan, immagini e promesse, ma nessuna altra informazione su dove sono memorizzate le criptovalute, il sistema di autorizzazione delle transazioni, la gestione del portafoglio e molto altro.
      Come dimostrato dal report che trovate CLICCANDO QUI, l’app di Bee per Android invia dati a ben 11 tracker, tra cui i classici Facebook e Google ma anche ad altre fonti meno conosciute, e che non sappiamo che cosa facciano con i nostri dati. In particolare quelle in grassetto raccolgono una quantità incredibile di dati ma non sappiamo come siano trattati.
      AdColony AppLovin (MAX and SparkLabs) Facebook Ads Facebook Login Facebook Share Google AdMob Google Analytics Google Firebase Analytics JiGuang Aurora Mobile JPush Twitter MoPub Tutte queste fonti hanno completo accesso a ben 37 permessi che consentono di avere una tracciabilità dei vostri dati impressionante. Tutti questi permessi sono davvero troppi per un’app di mininig che promette di non usare internet e molta batteria per minare Bee in modo gratuito. Ecco l’elenco completo dei permessi dell’app:
      ACCESS_COARSE_LOCATION access approximate location (network-based) ACCESS_NETWORK_STATE view network connections ACCESS_WIFI_STATE view Wi-Fi connections CHANGE_NETWORK_STATE change network connectivity GET_TASKS retrieve running apps INTERNET have full network access MOUNT_UNMOUNT_FILESYSTEMS READ_APP_BADGE READ_CONTACTS read your contacts READ_EXTERNAL_STORAGE read the contents of your SD card READ_PHONE_STATE read phone status and identity RECEIVE_BOOT_COMPLETED run at startup RECEIVE_USER_PRESENT SYSTEM_ALERT_WINDOW This app can appear on top of other apps VIBRATE control vibration WAKE_LOCK prevent phone from sleeping WRITE_CONTACTS modify your contacts WRITE_EXTERNAL_STORAGE modify or delete the contents of your SD card WRITE_SETTINGS modify system settings UPDATE_COUNT BIND_GET_INSTALL_REFERRER_SERVICE READ_SETTINGS UPDATE_SHORTCUT CHANGE_BADGE CHANGE_BADGE READ_SETTINGS WRITE_SETTINGS UPDATE_BADGE READ_SETTINGS WRITE_SETTINGS READ WRITE BROADCAST_BADGE PROVIDER_INSERT_BADGE JPUSH_MESSAGE BADGE_COUNT_READ BADGE_COUNT_WRITE  
      Non so voi, ma dopo aver letto tutte queste informazioni, io diffiderei dall’utilizzo di Bee perchè veramente date in mano a sconosciuti tantissimi vostri dati e permessi assurdi per un’app Android.
      Se lo volete provare a vostro "rischio e piricolo vi lascio il mio Referral Code: ddf0f-21
       
       

    • Ecco l’elenco completo di Film e Serie TV disponibili in Streaming
      Da marzo 2020 Disney ha la sua piattaforma di streaming, Disney+. Il servizio di streaming dove vedere film e serie TV arriva anche in Italia ed ovviamente lancia il guanto di sfida ai giganti del settore come Netflix, Amazon, Sky, Mediaset e compagnia bella. Visto che il servizio è disponibile in moltissime nazioni del mondo, il catalogo è già disponibile online con l’elenco completo che però è in continuo aggiornamento.
       
      Disney ha già una serie di contenuti originali e unici prodotti negli anni, e poi sta sviluppando una serie di film e serie TV esclusive che saranno disponibili sin dal lancio. Abbiamo dunque estratto da Disney+ il catalogo completo di film e serie TV attualmente disponibili ma che verrà aggiornato ogni qual volta scoveremo qualche novità.
       
      Tra le produzioni che troveremo su Disney+ troviamo ovviamente tutte le pellicole Disney, Pixar, Marvel, Star Wars e National Geographic, oltre 350 serie TV e 500 film tra cui 25 originali in esclusiva Italiane e altri 400 film disponibili tra vecchi pellicole e nuove uscite al cinema.
      Ecco il catalogo di Disney+ completo.
      Nuovi Film e Serie TV Disney+ | FEBBRAIO 2021
      Il sogno di Jerome – 5 febbraio I Simpson stagione 31 – 12 febbraio Speciale San Valentino: Colpa delle stelle – 12 febbraio La Bella e la Bestia – 12 febbraio Lilli e il Vagabondo – 14 febbraio Pretty Princess – 14 febbraio Principe Azzurro Cercasi – 14 febbraio Mai stata baciata – 14 febbraio 10 cose che odio di te – 14 febbraio La Principessa e il Ranocchio – 14 febbraio Un amore tutto suo e Genitori in trappola – 14 febbraio Flora & Ulisse – 19 febbraio Il diritto di contare – 19 febbraio Arriva Star con i alcuni contenuti seguenti How I Met Your Mother, X-Files, Desperate Housewives, Lost, Prison Break, 24, Griffin – Family Guy, Big Sky e Love, Victor – 23 febbraio La leggenda di Frozen – 26 febbraio Mickey go Local – 26 febbraio Nuovi Film e Serie TV Disney+ | GENNAIO 2021
      700 squali – 1 gennaio La legge degli squali – 1 gennaio A tavola con gli squali – 1 gennaio Onward: Oltre la magia – 6 gennaio Marvel Studios: Legends – 8 gennaio WandaVision – 15 gennaio Le cronache di Narnia: il viaggio del veliero – 19 gennaio Pixar Popcorn – 22 gennaio Amelia Earhart: una vita in volo – 22 gennaio Wild Uganda – 22 gennaio PJ Masks: Superpigiamini – 29 gennaio  
       

    • Esistono diverse applicazioni che permettono di fare le classiche chiamare vocali in maniera gratuita da PC o smartphone usando la tecnologia VoIP, cioè Voice Over IP, le chiamate vocali attraverso internet.
       
      Con i moderni smartphone con minuti illimitati e chiamate che viaggiano su internet è ormai difficile non avere la possibilità di fare chiamate gratuitamente usando applicativi standard, ma alcune volte può essere richiesto di fare una chiamata ad un numero reale senza dover usare il nostro smartphone o telefono di telefonia fissa.
      Come fare chiamate gratis con queste app per smartphone e PC
      Tutte le più famose app di messaggistica del mondo, permettono di chiamare (ed anche video chiamare) gratuitamente tutti i numeri che utilizzano la stessa applicazione. Ad esempio possiamo chiamare e videochiamare un contatto WhatsApp dal nostro WhatsApp e sarà sufficiente registrarsi all’app, selezionare il contatto e poi l’icona della chiamata. Il tutto è gratuito ed è necessaria solo la connessione ad internet.
      Come WhatsApp, anche Telegram e Signal permettono di chiamare un altro numero che utilizza la stessa app in modo gratuita, Telegram-Telegram e Signal-Signal, così da non dover consumare i nostri minuti del piano tariffario.
      WhatsApp (Download WhatsApp per Android, Download WhatsApp per iOS) Telegram (Download Telegram per Android, Download Telegram per iOS) Signal (Download Signal per Android, Download Signal per iOS) Come fare chiamate gratis a numeri reali: Ecco i migliori software gratuiti
      Skype e Google Meet permettono di chiamare numeri reali in modo facile e veloce ed anche gratuito (ma non tutti). Ed esempio Skype permette di chiamare numeri reali pagando un corrispettivo ma è sempre minimo, e vi verrà rilasciato un numero collegato al vostro account principale.
      Google Meet e Zoom sebbene siano software gratuiti per fare video chiamate di gruppo come riunioni ed incontri a distanza, nessuno vi vieta di creare una riunione su Meet o Zoom e partecipare anche chiamando un numero di telefono.
      Download Sykpe Download Google Meet Download Zoom Come fare chiamate gratis a numeri reali senza usare il nostro numero
      Se non volete usare il vostro numero di telefono o il vostro account creato, esistono alcune applicazioni che permettono di telefonare gratis via VoIP usando un software sul PC o l’app installata sullo smartphone. Tutti questi software permettono di chiamare anche a numeri reali, e tutte queste app che vi elencheremo di seguito sono gratuite, vi verrà rilasciato un numero reale, dove potrete ricevere chiamate ed anche farle.
       
      Messagenet FreeNumber vi rilascerà un numero di telefono gratuito, e potrete usarlo gratuitamente solo per ricevere chiamare mentre per farle dovete pagare un piccola tariffa a consumo. Molto comodo per attivare una deviazione su un numero di telefono reale dove essere contattati e quindi farlo squillare ed essere sempre reperibili.
      Ehiweb.it vi permetterà invece di avere ben 30 giorni gratuiti con 100 minuti inclusi senza dover pagare. Poi dovrai pagare per fare chiamate ma potrai sempre ricevere in maniera gratuita. Sicuramente la soluzione migliore da usare per un periodo di tempo limitato visto che l’utilizzo è gratuito per il primo mese e poi dovrai pagare per continuare a fare chiamate.
      VoipStunt è il software migliore di tutti, che include chiamate di 30 secondi in maniera completamente gratuita anche se c’è la limitazione della durata. Utile per chiamare numerazioni in Italia e anche all’estero. Davvero utile visto che vi verrà rilasciata una numerazione raggiungibile da tutti ma se volete fare chiamate dovete accontentarvi dei 30 secondi gratuiti, altrimenti dovrete pagare.
       
       

    • Veezie.st è una piccola app disponibile per Android e iOS che permette di vedere film e serie TV in streaming gratis e sebbene non contenga nessun contenuti illegale è facile aggiungerli. In pratica inserendo nella sezione CANALI i link giusti potrete vedere tantissimi contenuti in streaming senza pagare. Noi abbiamo selezionato i migliori.
      Abbiamo selezionato i migliori siti da aggiungere ai Canali di Veezie.st per accedere a migliaia di film, serie e anime in streaming gratis su tantissime piattaforme come Android, iOS ma anche Windows tramite un opportuno emulatore per Android.
       
      Tramite l’inserimento dei Canali potrete accedere ad una quantità incredibile di Film e Serie TV da vedere in streaming gratis. Sarà sufficiente aggiungere il link di un sito di streaming o di file hosting anche quelli personali come Dropbox o OneDrive mettendo il link come pubblico per avere nel palmo di una mano una videoteca completa.
      Dove scaricare Veezie.st
      Veezie è disponibile per Android ed iOS e le applicazioni sono disponibili sui relativi store di Google ed Apple dove troverete sempre l’ultima versione aggiornata. Ecco i link diretti dove scaricare Veezie direttamente sul vostro smartphone o tablet compatibile:
      Download Veezie per Android Download Veezie per iOS Migliori CANALI da aggiungere Veezie.st
      Ecco i canali migliori da aggiungere a Veezie.st da aggiungere tutti insieme ed averli sempre disponibili. Potremo vedere i video usando il player integrato o usando un player esterno Wuffy, XMTV o MX Player.
      Migliori siti di Film e Serie TV in streaming da aggiungere a Veezie.st:
      https://cb01.support https://cb01.band https://cbo1.movie https://cineblog01.green https://www.cineblog01.place https://serietvonline.surf https://cinemalibero.win https://casacinema01.surf https://roma.polpo.tv https://seriehd.email https://eurostreaming.camp https://www.guardaserie.date https://www.altadefinizione01.camp https://www.altadefinizione01.games https://altadefinizione.games https://www.tantifilm.pink https://hd.filmsenzalimiti.me https://altadefinizione.name https://www.piratestreaming.date https://www.eurostreaming.chat https://altadefinizione.construction https://ilgeniodellostreaming.cab https://toonitalia.pro https://cinemalibero.store https://www.animeworld.tv https://ww1.animeforce.org https://filmitaliano.online Come aggiungere i CANALI su Veezie.st
      Ora che avete i canali migliori per Veezie.st ecco che dovete aggiungerli all’applicazione. Una volta aperta l’applicazione sul vostro dispositivo dovete accedere alla sezione “I miei canali” dal menu laterale, poi dovete cliccare sull’apposita voce “Aggiungi Canali” dove possiamo inserire tutti i link sopra citati.
       

       
       

    • Potete caricare applicazione sulla vostra Android TV anche senza passare dal Play Store, magari per installare app non disponibili oppure APK modificati  
      La piattaforma Android TV è una delle migliori soluzioni per avere una smart TV completa ed espandibile grazie all’installazione delle app. Proprio come su tablet e smartphone Android, per scaricare app e giochi puoi accedere al Google Play Store sulla tua Android TV per scaricarle velocemente e grazie all’interfaccia grafica semplice ed intuitiva portai installare decine di app al volo.
      Tuttavia, non tutte le app presenti sul Play Store sono disponibili per Android TV come ad esempio Google Chrome e se vuoi accedere al browser web di Google dalla tua Android TV, non potrai installarlo dal Google Play Store come decine di altre app. È qui che il sideload ci viene utile per poter installare in pratica tutte le applicazioni su Android TV in maniera abbastanza semplice.
       

       
      Cos’è il sideload?
      Installare le app tramite sideload vuol dire avere un altro metodo per installare e utilizzare applicazioni che non riesci a trovare sul Google Play Store sul tuo dispositivo Android TV . Proprio come tablet e smartphone Android, anche sulle Android TV è possibile installare il pacchetto dell’applicazione Android o un file APK che contiene l’app o il gioco così da installarlo al volo.
      Metodo 1: Come caricare le app su Android TV utilizzando un telefono Android
      Se hai un telefono Android, il sideload per installare app su Android TV è molto facile poiché il primo passo è quello di scaricare il file APK sul tuo telefono Android. Una delle migliori risorse per trovare APK per le app che desideri installare su Android TV è APKMirror che dovrai aprire direttamente dal tuo telefono e cercare il file APK.
       
      Da APKMirror dovrai selezionare la barra di ricerca in alto a destra e scrivere il nome dell’app o gioco dell’app che vuoi installare sulla tua smart TV con Android TV. Una volta scaricato il file APK dal sito che avrete scelto (noi usiamo APKMirror), per questo articolo, abbiamo scelto di installare Google Chrome sulla nostra Android TV. Ora che avete il file APK devi seguire i passaggi seguenti:
      Scarica l’app Send files to TV sul tuo telefono e sulla tua Android TV tramite il Google Play Store; Una volta installata l’app, aprila sulla TV e seleziona l’opzione per ricevere Receive; Nello stesso periodo, apri l’app sul telefono e seleziona l’opzione di invio Send; Sul telefono si aprirà una sorta di file manager dove andare a selezionare una cartella che si chiama “Download” (Di solito li vengono messi i file che scaricate da internet; Quindi seleziona il file APK ed in automatico dovresti vedere il nome della tua TV sullo schermo del telefono; Una volta selezionata la tua TV in automatico verrà avviato il trasferimento del file; Una volta completato il trasferimento del file, potrai avviare l’installazione in modo automatico e se questo non avviene ti consigliamo di installare l’app File Commander; Installando il file APK, potrebbe essere visualizzato un messaggio che informa il blocco dalle installazioni da fonti sconosciute e per abilitarle dovete andare nelle Impostazioni nella finestra che si apre in modo automatico. Ora fai scorrere l’interruttore accanto al nome dell’app che stai utilizzando per installare l’APK; Il tuo APK ora dovrebbe essere installato; Quando vedi il messaggio di app installata sullo schermo, premi semplicemente “Apri” e la tua app dovrebbe avviarsi. Metodo 2: Come caricare le app su Android TV usando il Cloud
      Un altro metodo semplice per eseguire il sideload delle app su Android TV è tramite l’archiviazione cloud. Puoi utilizzare Google Drive (consigliato) ma anche Dropbox o OneDrive per installare APK su Android TV e poi usare sempre l’app File Commander per completare la procedura che vi descriviamo di seguito per aiutarvi.
      Come prima, il primo passo è scaricare il file APK, potete usare APKMirror o un altro sito; Una volta che avete l’APK, dovete caricarlo su Google Drive usando anche il vostro account Google (GMail) così da aver caricato sul cloud il file APK dell’app che volete installare su Android TV (ad esempio Google Chrome); Poi scarica l’app File Commander sulla Android TV; Avvia File Commander e dal pannello laterale e seleziona come accesso ai file da Google Drive. Ora dovresti essere in grado di vedere i tuoi file di Google Drive sulla tua Android TV. Seleziona il file APK che desideri installare e che hai caricato in precedenze; Se non hai già concesso le autorizzazioni necessarie a File Commander per installare le app, potresti ricevere un messaggio che informa che le installazioni da fonti sconosciute non sono consentite. Per abilitarle dovete andare nelle Impostazioni nella finestra che si apre in modo automatico. Ora fai scorrere l’interruttore accanto al nome dell’app che stai utilizzando per installare l’APK; La tua app ora continuerà l’installazione e potrai iniziare a usarla una volta completato il download. Quando vedi il messaggio di app installata sullo schermo, premi semplicemente “Apri” e la tua app dovrebbe avviarsi. Come aprire le app sideloaded su Android TV?
      Una volta terminata l’installazione delle app sulla vostra Android TV, potrai avviarla direttamente dalle app installate. Per trovare la tua app installata per vie traverse, vai nelle impostazioni (icona a forma di ingranaggio) nella schermata principale della tua Android TV dove troverai la sezione “App”. Se non vuoi fare ogni volta questa procedura, puoi installare l’app Sideload Launcher sulla tua Android TV.
       
       

    • Volete un iPhone ma non potete spendere i soldi per comprarlo nuovo? Valutate un buon dispositivo rigenerato.
       
      Gli iPhone sono il sogno proibito per molti, vuoi per un prezzo troppo elevato che lo rendono uno smartphone non proprio alla portata di tutti, e che grazie alla continua innovazione di Apple lo ha portato ad essere lo smartphone (quasi) perfetto. Ecco che per fortuna esistono modi alternativi per comprare un iPhone senza pagarlo a prezzo pieno ma avendo la sicurezza di avere un dispositivo in ottime condizioni.
      Se non volete spendere tutti quei soldi per comprare un iPhone, il nostro consiglio è di optare per un iPhone rigenerato che in pratica può anche essere pari al nuovo ma offerta ad un costo notevolmente inferiore al prezzo di listino. In questo articolo troverete tutte le informazioni su cosa sono, quali sono i vantaggi, quali gli svantaggi e dove trovare gli iPhone rigenerati.
       

       
      Cosa sono, quali sono i vantaggi, quali gli svantaggi degli iPhone rigenerati
      Gli iPhone ricondizionati come tutti i dispositivi definiti come tali, sono dispositivi che vengono accuratamente controllati, superano rigorosi test di resistenza, vengono rigenerati rimuovendo e sostituendo pezzi rotti o mal messi come il display, la batteria troppo consumata. Se c’è qualcosa che non funziona, questo viene sostituito con uno nuovo in modo che sia funzionante al 100%.
      Vantaggi iPhone Ricondizionati
      Dispositivo pari al nuovo; Sempre indicato il grado di usura; Prezzo notevolmente inferiore; Verificare se Batteria nuova. Svantaggi iPhone Ricondizionati
      In alcuni casi venduti in scatola senza marchio e comunque non originale; In alcuni casi venduti senza gli accessori (oppure con accessori non originali); Stato della batteria non sempre ai massimi livelli; Verificare stato di usura della scocca poiché potrebbero essere molto graffiati. Gradi iPhone Ricondizionato
      Ricondizionato Grado A E’ il grado di seleziona migliore, pochissimi graffi ed in pratica pari al nuovo, spesso con accessori originali (ma non tutti) e scatola originale (a volte neutra); Ricondizionato Grado B Grado intermedio con pochissimi graffi, alcuni accessori originali e scatola inclusa ma spesso neutra senza scritte; Ricondizionato Grado C Grado più basso, molto graffiato e quasi sempre senza accessori di nessun tipo e venduto in scatola neutra; Garanzia iPhone Ricondizionato
      Di solito se comprate da siti certificati, è incluso 1 anno di garanzia ma ogni sito ed ogni dispositivo può avere una garanzia più limitata, che può arrivare anche a meno di 90 giorni. Dovete comunque controllare meglio nei dettagli dell’iPhone che state comprando così da verificare anche che tipo e la durata della garanzia dell’iPhone rigenerato che state per comprare.
      Dove comprare iPhone rigenerati: I migliori siti
      Apple Apple ha il suo negozio dedicato dove trovare iPhone certificati al 100% che possono avere anche oltre il 10% di sconto rispetto a quello di listino. Non solo iPhone, ma anche iPad, MAC e molto altro. Una vero negozio alternativo dove comprare iPhone con la garanzia Apple. Amazon Amazon ha il suo negozio di Ricondizionati (Renewed) che vede una seleziona di prodotti restituiti o rigenerati da personale specializzato che sono messi in vendita indicando ben chiare le condizioni. Sono presenti tantissimi prodotti super scontati e non solo iPhone. eBay eBay secondo me è il più grande negozio dove trovare iPhone ricondizionati, e di solito sono disponibili ai prezzi più bassi di tutti anche se la garanzia di solito è molto limitata. Nella sezione sono disponibili anche ricondizionati di altri brand e non solo smartphone. TrenDevice TrenDevice è forse il negozio di iPhone usati più famoso di tutti dopo quelli sopra citati, dove trovare iPhone controllati da numerosi test ed analizzati in ogni sua parte. Accedendo al sito troverete una marea di dispositivi Apple ricondizionati con tanto di scheda ed importanti sconti indicati. Swappie Swappie è disponibile anche in Italia e permette di comprare dispositivi usati che sono sempre molto controllati e sicuri. Tutti gli iPhone sono coperti da garanzia di 12 mesi e potete gestire tutto il processo di acquisto conoscendo sempre i dettagli di cosa stiamo comprando. ePrice Noto store dove trovare iPhone ricondizionati e anche altri dispositivi. 12 mesi di garanzia e consegna a casa o in un punto di ritiro. Refurbed Vende dispositivi ricondizionati di ogni marca e modello dove possiamo trovare anche iPhone facilmente. Venduti con garanzia di 12 mesi a prezzi competitivi. Back Market Altra piattaforma dove trovare iPhone rigenerati e certificati da numerosi venditori affidabili. Spedizioni veloci, reso e garanzia di 12 mesi.  

    • Ecco dove trovare Audiolibri gratuitamente
      Sei alla ricerca degli audiolibri in lingua Italiana e soprattutto gratis? Siamo andati alla ricerca sul web di siti, portali e altri metodi per scaricare Audiolibri in Italiano senza dover pagare nulla che sono tra i più diffusi, pieni di audiolibri e sicuri senza virus. I migliori Siti e Canali Telegram attualmente disponibili su internet.
      Abbiamo sempre meno tempo per leggere e quindi perché non farli leggere a qualcuno ed ascoltarli mentre abbiamo le mani impegnate, ad esempio quando guidiamo oppure quando siamo in metropolitana con un paio di cuffiette oppure con il vivavoce della macchina? Gli audiolibri servono a questo, ad ascoltare un libro se non possiamo leggerli.
       

       
      Tutti promettono di ottenere un’ambientazione grazie alle musiche di sottofondo e alla voce del narratore per farci entrare nell’atmosfera del libro letto. Di seguito abbiamo elencato tutte le varie fonti dove trovare audiolibri gratis in Italiano ed ovviamente si differiscono per la quantità di audiolibri presenti e per la qualità della narrazione che può darvi maggior interesse nell’ascoltare un libro.
      Download Audiolibri Italiano gratis
      Liber Liber E’ sicuramente il più famoso, il più fornito ed è anche gratis dove trovare oltre ai tanti classici anche molti libri gratuiti. Disponibili in formato MP3 scaricabili senza registrazione e moltissimi libri tutti riportati in formato audio di qualità ottima. Librivox Qui si trovano moltissimi libri di letteratura internazionale creati da volontari con moltissimi audiobook in lingua italiana disponibili. Audiolibri.org E’ secondo me la migliore libreria Italiana con quasi 2000 audiolibri nella nostra lingua ed oltre 3000 disponibili in modo gratuiti. Progetto Babele Su questo portale potrete trovare non solo audiolibri di letteratura internazionale, ma anche di autori emergenti che pubblicano qui le loro opere anche in formato Mp3. LibroAudio Anche qui troviamo audiolibri tra i grandi classici della letteratura e molti altri libri in lingua Italiana che sono letti da volontari. LibriVivi Ecco una serie di audiolibri dedicati ai più piccoli con favole e molto altro da ascoltare anche sul vostro smartphone, tablet oltre che sul PC o MAC. Download Audiolibri Italiano: I migliori servizi a pagamento
      Audible è senza dubbio il servizio numero uno dove trovare oltre 10.000 audiolibri di cui oltre 2.000 nella nostra lingua. E’ la piattaforma di Amazon che sicuramente non ha rivali. Per 10 euro al mese, con 30 giorni di prova, accedete all’intera libreria in modo illimitato. Storytel E’ la migliore alternativa a quella di Amazon con oltre 2.000 audiolibri in Italiano e molti altri in Inglese. Costa circa 10 euro al mese (14 di prova) per ascoltare l’intero catalogo. 4Books offre una piattaforma dove imparare il meglio dai libri di business in 15 minuti, con 4 libri gratis e poi formula in abbonamento che vi permetterà di ascoltare libri da qualsiasi dispositivo. Download Audiolibri Italiano: Metodi illegali usati dai pirati
      Eurekaddl è la fonte numero dove i pirati trovano gli audiolibri e non solo con centinaia di libri audio da scaricare dai numerosi siti di hosting al volo, gratis e con una libreria costantemente aggiornata. Hawk Legend (Ex DaSolo)   E' un altro sito che nella sezione presenta una quantità incredibile di audiolibri in Italiano tutti da scaricare nel pratico formato Mp3 ed in pratica ascoltarli ovunque. https://t.me/audiolibritaliani E’ il canale Telegram numero uno dove scaricare gli audiolibri come un pirata. E’ facilissimo e poi la libreria è aggiornata quotidianamente. https://t.me/audible_maw Altro canale Telegram aggiornatissimo con tantissimi audiolibri da scaricare in pochi tap dallo smartphone.  
       

    • Per trovare la propria directory nel server di solito possiamo usare queste due funzionalità di javascript
       
      $_SERVER["DOCUMENT_ROOT"]: // var/www/html dirname(__FILE__): /chroot/home/S00000/public_html  
      JSON
      Formato di interscambio
      Acronimo di JavaScript Object Notation
      Rappresentazione di un oggetto mediante una stringa
      Formato interoperabile per serializzare oggetti, non è limitato a JavaScript (es. esistono serializzatori JSON per gli oggetti .NET)
       
      Si tratta di un formato usato per il trasferimento dei dati attraverso la rete
      I file JSON hanno estensione .json
      MIME type "application/json"
       
      JSON supporta i seguenti tipi di dato . string, number, object, array E i letterali . true, false, null Le stringhe devono essere delimitate da " ... " mentre in JavaScript si può anche usare ' ... ' //invalid JSON in RFC {"username": 'ribba'} //solo doppi apici {"price": OxFF} //si possono usare solo cifre decimali  
      I dati sono espressi come:
       - coppie "nome" : "valore"
       - separate da virgola ,
      Gli oggetti sono racchiusi in { ... }
       - es.: {"nome":"Mario", "cognome":"Rossi"}
      Gli array sono racchiusi in [ ... ]
       - es.: [ {"nome":"Mario", "cognome":"Rossi"}  {"nome":"Anna", "cognome":"Bruni"} ]
       
      Ogni dichiarazione valida in JSON è anche valida in JavaScript
      Per trasformare un testo JSON in un oggetto:
       JSON.parse(json_str) converte una string JSON in un oggetto Esiste anche la funzione JSON.stringify(json_obj) che converte un oggetto JavaScript in una string JSON eval(json_str) //DEPRECATA valuta o esegue quanto passato come parametro  
      AJAX
      Facciamo tramite client una richiesta HTTP ad un server, il server manda in esecuzione lo script, eventualmente interagisce con il database, produce una risposta che è una pagina html con incluso il foglio di stile e incluso javascript.
       
      Con Ajax cambia un pochino la situazione, possiamo fare lo solite richieste HTTP, ma poi quando siamo dentro la pagina, possiamo fare delle richieste che non ritornano un intera pagina, ma ci ritornano indietro dei dati, xml, testo, json, immagini, ecc.. Grazie ad AJAX è possibile caricare porzioni di pagina, via javascript modifichiamo il DOM senza però caricare la pagina.
      In pratica si modifica una parte del DOM senza ricaricare la pagina.
       
      In HTTP il modello è quello della pagina (statica o dinamica)
      Si può lavorare a livello di porzione di pagina usando JavaScript ma non si può interagire con dati remoti perchè si lavora sul client
       
      Sfruttando il DOM di JavaScript e le chiamate AJAX si possono modificare in modo asincrono o sincrono piccole porzioni della pagina corrente senza ricaricarla completamente
      Viene usato per esempio da Google Maps, Gmail, Youtube,..
       
      <script> function update(id) { var el=document.getElementById(id); el.innerHTML=<chiamata ad una funzione remota di un server> } </script>  
      Ajax: XMLHttpRequest
       
      XMLHttpRequest è un oggetto JavaScript messo a disposizione dal browser
      Permette di eseguire chiamate HTTP tramite JavaScript
      Nonostante il nome, non si limita ad essere usato con XML ma accetta anche altri formati per esempio JSON
       
      Per istanziare questo oggetto sono necessarie istruzioni diverse a seconda del browser, esempio:
      function getXMLHttpRequestOvject() { var request=null; if (windows.XMLHttpRequest) { request=new XMLHttpRequest(); } else if (windows.ActiveXObject) { //Older IE request = new ActiveXObject("MSXML2.XMLHTTP.3.0"); } return request; }  
      Dopo aver instanziato un oggetto XMLHttpRequest si possono usare i suoi metodi
      abort() getAllResponseHeaders() getResponseHeader(headername) open(methos,url,async,username,password) send(data) setRequestHeader(headername,value) Chiamata sincrona il browser si ferma in attesa della risposta, mentre asincrona il browser va avanti, tipicamente quando si usa ajax si usa chiamata asincrona.
       
      Oltre i metodi l'oggetto ha anche le sue proprietà:
      onreadystatechange -> permette di definire/richiamare una funzione che viene invocata quando cambia la proprietà readyState readyState -> stato della richiesta responseText -> risposta/pagina in formato testo responseXML -> risposta in XML status -> codice HTTP (200,400,ecc.) statusText -> testo della risposta HTTP (Ok, Not found)  
      Le chiamate possono essere asincrone oppure sincrone, come specificato nel terzo parametro del metodo open()
      open(method,URL,async) method: GET, POST, HEAD async: FALSE per chiamate sincrone async: TRUE (default) per chiamate asincrone In generale si suggerisce di usare chiamate asincrone
      send() invia la richiesta Durante una chiamata Ajax si passa attraverso vari stati:
      0 UNSENT -> open() has not been called yet
      1 OPENED -> send() has not been called yet
      2 HEADERS_RECEIVED -> send() has been called, and header and status are available
      3 LOADING -> Downloading; reasponseText holds partial data
      4 DONE -> the operation is complete
       
      La natura asincrona di Ajax permette al browser di accettare input dall'utente e modificare la pagina mentre il codice JavaScript testa il valore della proprietà readyState
      Ad ogni cambiamento del valore di readyState si può invocare una funzione di callback associata alla proprietà onreadystatechange
       
      esempio funzione callback:
      function ajaxCallback() { let res = document.getElementById(…); if ((xhr.readyState == 4) & (xhr.status == 200)) { // codice 200 OK nella risposta HTTP if (xhr.responseText != null) res.innerHTML = xhr.responseText; else res.innerHTML = “No data received”; } else alert("Ajax error: " + xhr.statusText); } xhr.open(“GET”, url, true); xhr.onreadystatechange = ajaxCallback; xhr.send();  
      Esempio 1 completo readyState
      <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Ajax exmple</title> <script src="utility.js"></script> <script> var stato = new Array("uninitialized", "loading", "loaded", "interactive", "complete"); var xhr = null; function ajaxcall(url) { xhr = getXMLHttpRequestObject(); xhr.onreadystatechange = function () { // callback let el = document.getElementById("myelem"); el.innerHTML += "<b>readyState: </b> " + xhr.readyState + "....." + stato[xhr.readyState] + "<br>"; if ((xhr.readyState == 4) & (xhr.status == 200)) { el.innerHTML += xhr.responseText; } } xhr.open("GET", url, true); xhr.send(); } </script> </head> <body> <form method="post"> <input type="button" onclick="ajaxcall('1_donothing.php');" value="Click here" /> </form> <div style="margin:50px; padding:10px; background-color:greenyellow;" id="myelem"></div> </div> </body> </html>  
      utility.js
      /* set XMLHttpRequest for some browsers */ /* look for more complete function */ function getXMLHttpRequestObject() { var ref = null; if (window.XMLHttpRequest) { ref = new XMLHttpRequest(); } else if (window.ActiveXObject) { // Older IE. ref = new ActiveXObject("MSXML2.XMLHTTP.3.0"); } return ref; }  
      Esempio 2 con JSON:
      <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Ajax exmple</title> <script src="utility.js"></script> <script> function getdata(url) { xhr = getXMLHttpRequestObject(); xhr.onreadystatechange = function () { if ((xhr.readyState == 4) & (xhr.status == 200)) { jsondoc = JSON.parse(xhr.responseText); print(jsondoc); } } xhr.open('GET', url, true); xhr.send(null); } function print(a) { let el = document.getElementById("mytable"); let out = "<table border='1' cellpadding='5'>"; for (let i = 0; i < a.length; i++) { //elements can be accessed as object properties, with . notation out += "<tr><td>" + a[i].name + "</td>"; //elements can be accessed as associative arrays, with keys out += "<td>" + a[i]["surname"] + "</td>"; out += "<td>" + a[i].year + "</td></tr>"; } out += "</table>"; el.innerHTML = out; } </script> </head> <body> <form> <input type="button" value="GET JSON" onclick="getdata('exampleJSON.php');"> </form> <br/><br/> <center> Table filled with data requested from the server: <br/><br/> <div id="mytable"></div> </center> </body> </html>  
      exampleJSON.php
      <?php header("Content-Type: application/json"); /* JSON output below shoud be produced dynamically */ ?> [ { "name":"Mario", "surname": "Bianchi", "year":"2001" } ]  
       
      Nel caso di uso del metodo GET si possono inviare dei parametri costruendo la querystring
      let quesrystring="?par1="+val1+"&par2="+val2; let url=encodeURI(endpoint+querystring); xhr.open("GET",url,true); xhr.send(); Nota: In alcuni browser c'è un limite massimo sul numero di caratteri che si possono scrivere nelle querystring
       
      Nel caso di uso del metodo POST i dati vengono inviati come parametri di send()
      Si devono anche specificare alcuni header HTTP
      Esempio:
      params=encodeURI("par1=" + val1 + "&par2=" + val2); xhr.open("POST", url, true); xhr.setRequestHeader(“Content-type”,”application/x-www-form-urlencoded”); xhr.send(params);  
      DOM: Document Object Model
      Document: il browser trasforma ogni documento HTML che legge in un oggetto e definisce la variabile globale document per far riferimento a questo oggetto
      Object: questo oggetto è caratterizzato da proprietà e metodi
      Model: il browser fornisce un modello del documento letto, questo modello è un albero
       
      La radice dell'albero corrisponde all'elemento <html>
      Seguono i nodi associati agli altri elementi della pagina <head>, <body>, <p>, <h1>, ...
      Ogni elemento può contenere:
      test -> text node,
      attributi -> attribute node,
      commenti -> comment node,
      altri elementi
       
      Per accedere agli elementi del documento è necessario selezionarli usando i metodi offerti dal DOM:
      var el1=document.getElementById("id");
      var el2=document.getElementsByName("error");
      var el3=document.getElementsByTagName("span");
      var el4=document.getElementsByClassName("warning");
      var el5=document.querySelector(".warning");
      esiste anche document.all -> var el6=document.all
       
      Un Document può essere visto come un albero di nodi (Node)
      Il tipo Node definisce proprietà e metodi che permettono attraversare questo albero
      Ogni nodo ha le seguenti proprietà
      nodeType (intero da 1 a 12) Document=9 Element=1 Text=3 Comments=8 Ogni nodo ha le seguenti proprietà
      nodeName -> nome nodo
      nodeValue -> contenuto nodo
      parentNode -> nodo padre del nodo corrente
      childNodes -> lista dei nodi figli
      firstChild, lastChild, nextSibling, previousSibling
      Molti elementi HTML hanno degli attributi
      Il DOM definisce i metodi per accedere/modificare i valori degli attributi
      object.getAttribute("attribute") si accede all'elemento con uno dei metodi precedenti si ricavano i valori dei suoi attributi var el=document.getElementById("myimg"); console.log(el.getAttribute("alt")); console.log(el.getAttribute("src"));  
      object.setAttribute("attribute","value") si accede all'elemento e si modificano i valori dei suoi attributi La modifica dei valori degli attributi non si vede nel sorgente HTML: agendo sul DOM si modifica il contenuto di una pagina senza ricaricarla
       
      Contenuto degli elementi, per esempio <p>
      La proprietà innerHTML ritorna il contenuto di un elemento come stringa con markup La proprietà innerText ritorna il contenuto di un elemento come stringa di testo E' anche possibile modificare il contenuto di un documento agendo a livello di nodi grazie a metodi quali:
      createElement() createTextNode() cloneNode() ecc.  
      API FETCH
      JavaScript è un linguaggio single-threaded, tutte le attività concorrenti vengono messe in coda, una sola opzione alla volta. Vengono introdotte le chiamate asincrone, le callbacks, promises (api fetch) e async/await, tutte le volte che parte una chiamata Ajax, passa attraverso vari stati e solo quando è terminata correttamente arrivano i dati, e mandiamo in esecuzione la callback che visualizza i dati rispetto alla comunicazione.
      In Ajax abbiamo visto in concetto di callback, una funzione che viene eseguita al termine di una chiamata asincrona
      La Fetch Api usa le promise, cioè degli oggetti (Response) restituiti dalle chiamate asincrone
      Le chiamate devono "sapere cosa fare" quando terminano i task asincroni e arrivano le risposte
       
      Una promise è un oggetto che produrrà un risultato nel futuro.
      Il risultato può essere:
      il valore cercato la ragione per cui tale valore non viene restituito (per esempio se c'è stato un errore a livello di rete) Una promise può trovarsi in uno stato tra: fulfulled, rejected, pending
       
      Response.ok -> true/false (true 200-299, false)
      Response.status -> codice della risposta (200 in caso di successo)
      Response.statusText -> testo del codice (codice 200 è OK)
       
      Response.Body.text() -> legge stream e ritorna promise che contiene stringa
      Response.Body.json() -> legge stream e ritorna promise che contiene oggetto json
      Response.Body.blob() -> legge stream e ritorna promise che contiene blob
      Esempio fetch di un blob:
      const image=document.querySelector('.my-image'); fetch('flowers.jpg').then(function(response) { return response.blob(); }).then(function(blob) { const objectURL = URL.createObjectURL(blob); image.src=objectURL; });  
      Si possono anche mandare dati in post
      fetch(url, { method: "post", headers: {"Content-type":"application/x-www-form-urlencoded" }, body: "email="+usermail, }).then(function(response) { /* code for response */ return response.text().then(function (result) { /* code fore result */ }); }); }  
      Cookies
      E' possibile leggere/scrivere i cookies della pagina correntemente visualizzata nel browser usando la proprietà document.cookie, questa proprietà può contenere solo stringhe
      allCookies=document.cookie; //leggere cookie document.cookie=newCookie; //possibile sovrascrivere I cookie sono scambiati tra client e server ad ogni richiesta di uno specifico dominio, vale per le pagine, per richieste ajax, per immagini e servono per tenere traccia dell'utente.
       
      Web Storage
      Permette di memorizzare dati sul browser dell'utente in modo:
      permanente: localStorage -> simile cookies persistenti
      temporaneo: sessionStorage -> simile cookies sessione
      Web storage fornisce maggiori capacità di memoria rispetto ai 4 KB dei cookies
      Memorizza dati in forma di coppie key=value
      localStorage.setItem("client1","Rossi"); -> oppure localStorage.client1="Rossi";
      localStorage.getItem("client1"); -> oppure var c=localStorage.client1;
      localStorage.removeItem("client1"); -> cancellare la chiave
      localStorage.clear() -> rimuove tutto
       
      L'oggetto sessionStorage è uguale all'oggetto localStorage, ma memorizza i dati solo per la durata della sessione
      I dati vengono quindi persi quando si chiude browser/tab
       
      jQuery
      jQuery è una libreria JavaScript, semplifica lo scripting client-side, è free e open-source, è rilasciata sotto licenza MIT e GPL v.2, viene usata da molto colossi come Google, Dell, Wordpress ecc.
      Download della versione corrente della libreria Include prendendo l'indirizzo di una CDN che distribuisce jQuery <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/.../jquery.min.js"> </script> </head>  
      La sintassi di jQuery permette di selezionare elementi HTML e di eseguire azioni su di essi
      $(selector).action()
      $ per definire/accedere a jQuery (selector) per selezionare gli elementi HTML action() per specificare l'azione da svolgere Come nel caso di JavaScript "standard", anche con jQuery si può agire solo su elementi HTML già caricati nella pagina corrente
      JavaScript:
      document.getElementById("demo").innerHTML="Hello World!"; jQuery:
      $("#demo").html("Hello World!");  
      jQuery Selettori
      $("*") -> tutti gli elementi
      $(this) -> elemento HTML corrente
      $("p.intro") -> <p> con class="intro"
      $("p:first") -> <p> primo elemento
      $("ul li:first") -> <li> primo elemento di <ul>
      $("ul li:first-child") -> <li> primo elemento di tutti gli <ul>
      in jQuery, la maggior parte degli eventi del DOM hanno un metodo jQuery equivalente:
      Events Mouse -> keybords -> Form -> Document/Window
      click                -> keypress   -> submit -> load
      dbclick            -> keydown   -> change -> resize
      mouseenter    -> keyup        -> focus  -> scroll
      mouseleave                          -> blur      -> unload
       
      Spesso i metodi jQuery sono all'interno dell'evento ready per evitare al codice jQuery di essere eseguito prima del caricamento del documento
      $(document).ready(function() { //metodi jQuery qui... });  
      La funzione $.ajax() permette di fare chiamate HTTP asincrone
      $.ajax(url, [, options] )
      $.ajax([options])
      url -> indirizzo della chiamata
      success -> funzione da invocare se richiesta ok
      error -> funzione da invocare se fallisce richiesta
      type -> GET o POST
      data -> dati da inviare come parametro della richiesta
      async -> true (default) o false
       
      $(selector.load(URL,data,callback);
      $(selector.post(URL,data,callback,dataType);
      $(selector.get(URL,data,callback,dataType);
       
      jQuery Tables
       
       
       
       
       
       
       
       
       

    • C# Sharp e gli iteratori, sono una maniera di rappresentare una sequenza di elementi che hanno in comune il tipo, una catena, una stringa, una sequenza di cosi, che hanno tutti in comune il tipo T.
      Partiamo da come dovrebbe essere:
      IEnumerable<T>  - IEnumerator<T> GetEnumerator() IEnumerator<T>  - bool MoveNext()  - T current { get; }  - void Dispose() Nota: in Java le classi Iterable e Iterator svolgono lo stesso ruolo
       
      Modelliamo gli intervalli (chiusi) di interi in modo tale che siano "foreach-abili", per semplicità, ignoriamo Equals (& company)
      Per esempio:
      var ontToFive = new IntInterval(1,5); foreach (var i in oneToFive) Console.WriteLine(i);  
      Classe IntInterval
      public class IntInterval : IEnumerable<int> { public int LowerBound { get; private set; } public int UpperBound { get; private set; } public IntInterval(int lowerBound, int upperBound) { this.LowerBound = lowerBound; this.UpperBound = upperBound; } public IEnumerator<int> GetEnumerator() { return new Enumerator(this); } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } private class Enumerator : IEnumerator<int> { ... } } Classe IntInterval.Enumerator
      private class Enumerator : IEnumerator<int> { private readonly IntInterval _interval; private int _current; public Enumerator(IntInterval interval) { this._interval = interval; this.Reset(); } public void Reset() { this._current = this._interval.LowerBound – 1; } public bool MoveNext() { return ++this._current <= this._interval.UpperBound; } public int Current { get { return this._current; } } object IEnumerator.Current { get { return this.Current; } } public void Dispose() { } }  
      Enumerator
      La classe IntInterval.Enumerator è piuttosto semplice da scrivere, ma non particolarmente interessante
      Da C# 2, il compilatore crea in automatico degli Enumerator a partire da un blocco di codice che restituisce un valore dopo l'altro usando yield return
      public class IntInterval : IEnumerable<int> { public int LowerBound { get; private set; } public int UpperBound { get; private set; } public IntInterval(int lowerBound, int upperBound) { this.LowerBound = lowerBound; this.UpperBound = upperBound; } public IEnumerator<int> GetEnumerator() { for (var a = this.LowerBound; a <= this.UpperBound; ++a) yield return a; } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } }  
      Iteratori
      Un blocco, corpo di un membro il cui tipo di ritorno sia IEnumerator/IEnumerator<T> o IEnumerable/IEnumerable<T>, che contiene yield return è in iteratation-block
       
      Tale membro viene chiamato iterator(iterator)
       - non può contenere return o avere parametri passati per riferimento (ref o out)
       - può contenere yield break, che termina la sequenza
      L'invocazione di un iteratore non provoca l'immediata esecuzione del codice, ma la costruzione di un oggetto enumerator (o enumerable) per la sequenza corrispondente
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       

    • Metadati & Reflection
       
      Annotazioni per assembly, tipi, membri e parametri
       - In Java @Blabla
       - Un pò tipo i modificatori public, private,..
       - Ma definite dall'utente
         . sono classi che estendono System.Attribute
         . per esempio, Serializable (System.SerializableAttribute) su una classe indica che i suoi oggetti sono serializzabili
       
      public class TapAttribute : Attribute { } [Tap] //classe annotata con Tap public class Program { [Tap] public static void Main(string[] args) { } }  
      Dependency Injection
      Un esempio di classe per spedire email:
      public class EmailSender { public bool SendEmail(string to, string body) { if (to==null) throw new ArgumentNullException(nameof(to)); if (body==null) throw new ArgumentNullException(nameof(body)); //...send mail and return true return false; } } Questa classe e i suoi tipi ausiliari sono un esempio di componente (una volta "impacchettate" in una DLL)
       
      BulkEmailSender
      public class BulkEmailSender { private readonly EmailSender _emailSender; private readonly string _footer; public BulkEmailSender(string footer) { this._emailSender = new EmailSender(); this._footer = footer; } public void SendEmail(List<string> addresses, string body) { if (addresses == null) throw new ArgumentNullException(nameof(addresses)); if (body == null) throw new ArgumentNullException(nameof(body)); foreach (var a in addresses) { if (!this._emailSender.SendEmail(a, body + this._footer)) throw new Exception("Cannot send email"); } } }  
      Esistono vari tipi di DI, consideriamo constructor injection (è quella da usare di default) che inietta tramite i costruttori
       - Altre sono la method, property, field,..
      L'idea è estremamente semplice: i costruttori richiedono gli oggetti che servono direttamente, invece di crearli
       
      in codice (senza factory)
      public BulkEmailSender(string footer) { this._emailSender = new EmailSender(); this._footer = footer; } public BulkEmailSender(IEmailSender emailSender, string footer) { this._emailSender = emailSender; this._footer = footer; }  
      in codice (con factory)
      public BulkEmailSender(string footer) { this._emailSender = new EmailSender(); this._footer = footer; } public BulkEmailSender(IEmailSenderFactory factory, string footer) { this._emailSender = factory.CreateNew(); this._footer = footer; } Dove:
      interface IEmailSender { bool SendEmail(string to, string body); } interface IEmailSenderFactory { IEmailSender CreateNew(); } // e, per esempio, una factory è: class EmailSenderFactory : IEmailSenderFactory { public IEmailSender CreateNew() { return new EmailSender(); } }  
      Altro esempio di (non static) Factory
      public class C { private readonly IPointFactory _pointFactory; private readonly ILineFactory _lineFactory; public C(IPointFactory pointFactory, ILineFactory lineFactory) { this._pointFactory = pointFactory; this._lineFactory = lineFactory; } public void DoSomething(/* ... */) { // ... ILine newLine = CreateLine(/* ... */); // ... } private ILine CreateLine(int x0, int y0, int x1, int y1) { IPoint p0 = this._pointFactory.Create(x0, y0); IPoint p1 = this._pointFactory.Create(x1, y1); return this._lineFactory.Create(p0, p1); } }  
      Diventa facile sostituire un'implementazione con un'altra
      Di conseguenza, diventa più facile il testing ed estendere le funzionalità, per esempio, Decorator
       
      Esempio di Decorator
      class LoggingEmailSender : IEmailSender { private readonly IEmailSender _originalSender; public LoggingEmailSender(IEmailSender originalSender) { if (originalSender == null) throw new ArgumentNullException(nameof(originalSender); this._originalSender = originalSender; } public bool SendEmail(string to, string body) { Console.WriteLine("Sending mail to {0}", to); return this._originalSender.SendEmail(to, body); } }  
      Principio di minima conoscenza
      public void Purchase(Customer c) { Money m=c.GetWallet().GetMoney(); this.RecordSale(..., m); } // Nel testing: Money m = new Money(5); Wallet w = new Wallet(m); Customer c = new Customer(w); Goods g = g.Purchase(c); //assert  
      Versione tradizionale con singleton
      DB.Init("..."); //inizializza il singleton Logger.Init(); //idem, l'ordine è importante! var bulk=new BulkEmailSender(); //apparentemente indipendente da sopra //ma se il Logger non è stato inizializzato //EmailSender (istanziato da BulkEmailSender) //si shchianta con la DI
      vard db=new DB(...); var logger=new Logger(db); var emailSender=new EmailSender(logger); var bulk=new BulkEmailSender(emailSender, ""); sbagliando l'ordine la compilazione fallisce!
       
      DI container
      Siccome le dipendenze sono esplicite, la composizione degli oggetti spesso si può automatizzare, è quello che fanno i container DI
      Si programmano associando implementazioni a interfacce:
       - via codice, max flessibilità e controllo statico sui tipi, ma la riconfigurazione richiede ricompilazione
       - via file di configurazione (tipicamente XML)
      E poi loro gestiscono la creazione e lo scope (singleton, factory o container)
       
      Non è necessario usare un DI container per usare la DI
      Come per esempio non è necessario usare una libreria di logging per "loggare"
      Le implementazioni non mancano: Ninject, Autofac, Guice, NanoContainer, Spring.NET, Unity,..
       
      Inversion of Control e Dependency Injection sono la stessa cosa?
      IoC è un concetto più generale
       - Ogni framework usa IoC (quando associate un'azione a un pulsante in una GUI lo state usando)
      DI è il nome più corretto
       
      Ninject
      Un framework per le dependency injection open source per .NET
       
      E una maniera di disaccoppiare le classi e rendere più facili il riuso del codice, cambiando le implementazioni dell'interfaccia, rendere il codice più testabile e mantenere il codice
       
      DI Container
      Una libreria che automatizza molti dei task per creare e comporre degli oggetti.
      Ninject è un framework open source, i vantaggi sono tanti, è ancora in sviluppo, è veloce e non pesa molto, potente fornisce tutte le funzionalità ed è facile da utilizzare
      Official site: http://www.ninject.org
      Disponibile anche tramite NuGet
       
      Vediamo l'esempio citato sopra
      public interface IEmailSender { bool SendEmail(string to, string body); } public class AnEmailSender : IEmailSender { /∗ ... ∗/ } public class BulkEmailSender { private readonly IEmailSender emailSender; private readonly string footer; public BulkEmailSender(IEmailSender emailSender /∗, string footer∗/) { this. emailSender = emailSender; this. footer = String.Empty; } public void SendEmail(List<string> addresses, string body) { /∗ ... ∗/ } }  
      Come faccio a usare Ninject?
      Costruisco il kernel, un oggetto centrale
      Ikernel kernel=new StandardKernel(); dico al nucleo quali sono le classi che mi interessano
      kernel.Bind<IEmailSender>().To<AnEmailSender>(); richiedo un istanza del servizio
      var bulkES=kernel.Get<BulkEmailSender>(); usiamo il servizio
      bulkES.SEndEmail(new List<string> {"[email protected]", "[email protected]"}, "hi");  
      La capacità di associare il tipo del servizio (interfacce o classe astratte) al tipo di implementazione del mio servizio
       
      Tipato fortemente o debolmente
      kernel.Bind<IEmailSender>().To<AnEmailSender>(); // ok kernel.Bind<IEmailSender>().To<string>(); // compilation error kernel.Bind(typeof(IEmailSender)).To(typeof(AnEmailSender)); // ok kernel.Bind(typeof(IEmailSender)).To(typeof(string)); // ”ok”  
      Le classi sono per default legate a se stesse
      kernel.Bind<BulkEmailSender>().To<BulkEmailSender>(); kernel.Bind<BulkEmailSender>().ToSelf();  
      Injection Patterns
       
      Ninject supporta due forme i injection:
      Constructor Injection
      Inizialization methods
       
      Costruire l'oggetto, qual è l'ambito in cui l'oggetto deve essere ancora vivo,  e si usano i metodi che finoscono con scope.
      Transient -> .InTransientScope() -> una nuova istanza ogni volta (equivalente di new)
      Singleton -> .InSingletonScope() -> all'interno esiste una sola istanza (creato l'oggetto e viene richiesto sempre e solo questo)
      Thread -> .InThreadScope() -> una istanza per thread
      Request -> .InRequestScope() -> una istanza per la durata del web request
      Custom -> .InScope() -> definire una funzione e quale oggetto venga restituito a seconda del contesto in esecuzione
       
      kernel.Bind<IEmailSender>().To<AnEmailSender>().InTransientScope(); kernel.Bind<BulkEmailSender>().ToSelf().InSingleTonScope(); var b1=kernel.Get<BulkEmailSender(); var b2=kernel.Get<BulkEmailSender>(); Debug.Assert(ReferenceEquals(b1,b2)); var e1=kernel.Get<IEmailSender>(); var e2=kernel.Get<IEmailSender>(); Debug.Assert(!RefernceEquals(e1.e2));  
      Torniamo al nostro esempio:
      public interface IEmailSender { bool SendEmail(string to, string body); } public class BulkEmailSender { private readonly IEmailSender _emailSender; private readonly string _footer; public BulkEmailSender (IEmailSender emailSender, string footer) { this._emailSender=emailSender; this._footer=footer; } public void SendEmail(List<string> addresses, string body) { /*...*/ } } public class AnEmailSender : IEmailSender { /*...*/ } Ora, kernel.Get<BulkEmailSender>() non funziona più
       
      - Passare argomenti alla Get<>()
      kernel.Get<BulkEmailSender>(new ConstructorArgument("footer","Bye"); - aggiustare l'argomento
      //usando WithConstructorArgument kernel.Bind<BulkEmailSender>().ToSelf().WithConstructorArgument("footer","my Footer"); //delegate crendo nuova istanza kernel.Bind<BulkEmailSender>().ToMethod(context => new BulkEmaailSender(context.kernel.Get<IEmailSender>(),"my footer"));  
      Refactory esempio:
      public interface IEmailSenderFactory : IEmailSenderFactory public IEmailSender Creat() { return new AnEmailSender(); } } public class IBulkEmailSenderFactory { IBulkEmailSender Create(string footer); } implementazioni:
      public class EmailSenderFactory : IEmailSenderFactory { public IEmailSender Create() { return new AnEmailSender(); } } public class BulkEmailSenderFactory : IBulkEmailSenderFactory { private readonly IEmailSenderFactory emailSenderFactory; public BulkEmailSenderFactory(IEmailSenderFactory emailSenderFactory) { this. emailSenderFactory = emailSenderFactory; } public IBulkEmailSender Create(string footer) { return new BulkEmailSender(this. emailSenderFactory.Create(), footer); } } collego il kernel
      IKernel kernel = new StandardKernel(); kernel.Bind<IEmailSender>().To<AnEmailSender>(); kernel.Bind<IEmailSenderFactory>().To<EmailSenderFactory>().InSingletonScope(); kernel.Bind<IBulkEmailSenderFactory>().To<BulkEmailSenderFactory>().InSingletonScope(); // ... var factory = kernel.Get<IBulkEmailSenderFactory>(); var bulkEmailSender = factory.Create("Bye");  
      Multi Injection
      public interface IWeapon { string Hit(string target); } public class Sword : IWeapon { public string Hit(string target) { return "Slice " + target + " in half"; } } public class Dagger : IWeapon { public string Hit(string target) { return "Stab " + target + " to death"; } } //... static void Main(string[] args) { IKernel kernel = new StandardKernel(); kernel.Bind<IWeapon>().To<Sword>(); kernel.Bind<IWeapon>().To<Dagger>(); var weapon = kernel.Get<IWeapon>(); // error: which one? IEnumerable<IWeapon> weapons = kernel.GetAll<IWeapon>(); foreach (var w in weapons) Console.WriteLine(w.Hit(”bad guy”));  
      Se la classe Samurai riceve un IWeapon[], List<IWeapon> o IEnumerable<IWeapon>
      public class Samurai { private readonly IEnumerable<IWeapon> allWeapons; public Samurai(IWeapon[] allWeapons) { this. allWeapons = allWeapons; } public void Attack(string target) { foreach (var weapon in this. allWeapons) Console.WriteLine(weapon.Hit(target)); }  
      dopo dobbiamo fare:
      kernel.Get<Samurai>().Attack("your enemy");  

    • var
      Solo per dichiarare variabili locali, il tipo (inferito) è quello dell'inizializzatore
       
      Esempio:
      int i=0; var i=0; //equivalenti, finchè non cambia inizializz.  
      E' chiaramente molto comoda con i generici...
       
      List<List<string>> lls = new List<List<string>>(); var lls=new List<List<string>>(); Non solo per i pigri, essenziale in alcuni casi
       
      Proprietà (Properties)
      Metodi get/set che invocati attraverso la sintassi di accesso a campo, per esempio,
      exp.P = 3 usate per caching, lazy loading, ecc.. è possibile specificare solo il getter o il setter Per il setter, value indica il valore "scritto"  
      Al client "sembrano" accessi a campo: è ragionevole usarle solo se getter/setter efficienti
      In quanto metodi, possono essere virtual, abstract, comparire nelle interfacce
      Uno dei due può avere un modificatore di accesso più restrittivo (per es. il setter private)
       
      Uso ovvio con getter e setter
      public class C { private int_i; public int I { get { return this._i; } set { this._i=value; } } }  
      Vediamo come richiamare la classe e le sue proprietà;
      C aC = new C(); aC.I = 41; ++aC.I // !!! Console.WriteLine(aC.I); //stampa 42  
      Auto-Properties
       
      Come una property, ma il campo nascosto è generato automaticamente dal compilatore
       - non se ne conosce il nome
      publi class C { public int I { get; set; } public int K { get; } public int Z { get; private set; } }  
      Con ReSharper la trasformazione fra una versione e l'altra richiede solo un ALT Return...
      Le Auto-Properties si possono inizializzare:
       - sinstassi analoga ai campi
      public int I { get; set; } = 37;  - come per i campi
      . inizializzazioni eseguite nell'ordine in cui sono scritte.
      . nell'espressione di inizializzazione non si può fare riferimento al this.
       
      Properties senza campo - Esempio:
      public class Person { public int YearOfBirth { get; set; } public int Age { get { return DateTime.Now.Year - this.YearOfBirth; } } } // ... var p=new Person { YearOfBirth=1973}; Console.WriteLine(p.Age);  
      Scorciatoie varie
      Maniera compatta per dichiarare un Array se conosciamo i valori, sparito il tipo string in var, sparita la dimensione che lo deduce da solo.
      var array = new[] {"ciao", "mondo" };  
      Costruire un oggetto ed assegnare ai campi qualche valore
      var anA = new A(3) { G=3 }; var anotherA = new A { F=5, G=3 };  
      Qui costruisco una nuova lista ma subito inserisco 3 elementi
      var ls = new List<string>() {"qui", "quo", "qua" };  
      Ora vediamo il dizionario con chiave e valore
      var d = new Dictionary <int, string> () { {1, "pippo"}, {2, "pluto"} }; // oppure: var d1 = new Dictionary<int, string> () { {[1]="pippo"}, {[2]="pluto" } };  
      Operator overloading
      In molti linguaggi alcuni operatori sono overloaded (per es. quelli aritmetici)
      C# permette di definire il comportamento di molti operatori, quando (almeno) un operando è di un tipo definito dall'utente
       - Non si possono aggiungere operatori o variarne la precedenza
       - Non si può ridefinire l'assegnazione (nemmeno struct)
      Gli operatori vanno definiti public static e hanno come nome operator op
       - Per chi conosce C++: "this" non è l'operando sinistro, negli operatori binari servono due parametri
       
      Esempio di uso dell'overloading
      DateTime x = DateTime.Now; DateTime y = new DateTime(1982,1,1); TimeSpan t = x - y; DateTime k = x + t; DateTime TimeSpan sono due tipi (struct) di sistema  
      Operator overloading esempio:
      public class C { public static C operator +(C x, int y) { return null; } } public class Program { public static void Main(string[] args) { var c = new C(); C foo = c+3; c+=27; // come scrivere c=c+27; } }  
      Alcuni operatori (== e != e <,>= e <=) vanno a coppie, se si definisce uno , si deve definire anche l'altro Se si definisce == è buona norma ridefinire anche Equals e GetHashCode  
      class C { private int x, y; public override bool Equals(Object obj) { if (obj == null) return false; if (obj.GetType()==typeof(C)) { C other = (C) obj; return this.x == other.x && this.y == other.y; } return false; } public override int GetHashCode() { return... } }  
      User-defined conversions
      Il tipo sorgente o destinazione deve corrispondere al tipo che contiene la conversione
      public class C { public static implicit operator C(int i) { return null; } public static implicit operator int(C from) { return 1; } public static explicit operator string(C from) { return "a"; } } // ... C c=42; int i=c; string s=(string)c;  
      Indexer
      Misto fra proprietà e overloading di [] (una classe può dichiarare diversi indexer, in overload)
      var h=new Dictionary<string, int>(); h["ciao"]=7; public class C { private int _x public int this[double a, double b] { get {return 42;} set {this._x=value;} } } //... var c=new C(); c[4,2.0]=7; int i = c[Math.PI,0]; // Si possono usare per inizializzare var conversion = new Dictionary<string, int> { ["diciotto"]=18, ["diciannove"]=19, ...  
      Dynamic
      In C# 4 è arrivato il tipo dynamic che corrisponde al tipo <<staticamente dinamico>> (=un tipo che richiede binding dinamico)
       - Molto elegante, ma dietro le quinte diventa Object e viene usata la reflection a palate (=lento, come usare un linguaggio dinamicamente tipato)
        . è un uso furbo/ottimizzato della reflection, si vedano gli expression tree e il DLR
       - Comodo per certi scopi, per es. interfacciarsi a linguaggi dinamicamente tipati
      Dynamic è totalmente diverso da var
       
      Delegate
      Tipi assimilabili ai tipi funzionali di Caml
        - un delegate permette di invocare uno o più metodi conoscendone solo tipo di ritorno e tipo dei parametri
      La dichiarazione di un tipo delegate D, per es.
      public delegate int D(int a, int b); // int x int -> int definisce una classe che estende System.Delegate
         - essendo classsi, l'equivalenza di tipi delegate è per nome: public delegate int Foo(int a, int b); definisce un tipo delegate diverso (incompatibile) da D anche se entrambi descrivono un metodo che, presi due interi, restituisce un intero.
       
      Se D è un tipo delegate, un oggetto di tipo D si ottiene tramite new, passando come argomento il nome di un metodo; per esempio: new D(nomeMetodo);
        - Nota: nomeMetodo potrebbe individuare più di un metodo per via dell'overloading, in quel caso viene scelto il più specifico
      Se pippo è un oggetto di tipo delegate, per invocare i metodi associati a pippo si usa la sintassi classica dell'invocazione: pippo(...);
       
      public class Program { public delegate int D(int a, int b); public delegate int Foo(int a, int b); private static int Sum(int x, int y) { return x + y; } private int Max(int i, int j) { return Math.Max(i, j); } public static void Main(string[] args) { D d1 = new D(Program.Sum); Foo f1 = new Foo(Sum); // Sum = Program.Sum Console.WriteLine(d1(1, 2)); Console.WriteLine(f1(1, 2)); D d2 = new D(new Program().Max); Foo f2 = new Foo(new Program().Max); Console.WriteLine(d2(1, 2)); Console.WriteLine(f2(1, 2)); // D d3 = f1; // errore! } }  
      Grazie alle conversioni implicite..
      public class Program { public delegate int D(int a, int b); public delegate int Foo(int a, int b); private static int Sum(int x, int y) { return x + y; } private int Max(int i, int j) { return Math.Max(i, j); } public static void Main(string[] args) { D d1 = Program.Sum; Foo f1 = Sum; // Sum = Program.Sum Console.WriteLine(d1(1, 2)); Console.WriteLine(f1(1, 2)); D d2 = new Program().Max; Foo f2 = new Program().Max; Console.WriteLine(d2(1, 2)); Console.WriteLine(f2(1, 2)); // D d3 = f1; // errore! } }  
      Invocation-List
       
      Ogni (oggetto) delegate ha una invocation-list associata
         - Quando creiamo un delegate, l'unico elemento della lista è il metodo che abbiamo passato alla new
      Invocando un (oggetto) delegate, invochiamo in sequenza i metodi della sua invocation-list
       
      Operazioni sull'invocation-List
      Ogni tipo delegate D implicitamente definisce
      D operator +(D x, D y)
      D operator -(D x, D y)
      bool operator==(System.Delegate x, System.Delegate y)
      bool operator!=(System.Delegate x, System.Delegate y)
      Quindi i delegate possono essere
       - combinati con + e += (il delegate risultante corrisponde all'invocazione di tutti i metodi di x, seguiti da quelli di y)
       - rimossi con - e -=
       - confrontati per vedere se puntano la stessa lista di metodi
       
      Delegate generici
      Visto che sono classi, anche i delegate possono essere generici. Per esempio delegate int Comparer<T>(T x, T y);
      In .NET 3.x sono stati introdotti:
       - Azioni, metodi void che si aspettano T1...Tn:
         Action, Action<T>, Action<T1,T2>,...
       - Funzioni da T1...Tn in TResult:
         Func<TResult>, Func<T,TResult>, Func<T1,T2,TResult>,...
       - Predicati: Predicate<T>
       
      private static int Sum(int x, int y) { ... } private static int Max(int i, int j) { ... } public static void Main(string[] args) { Func<int, int, int> f = Sum; Func<int, int, int> g = Max; Console.WriteLine( (f+g)(1, 2) ); // 2 var k = g + f; Console.WriteLine( k(1, 2) ); // 3 Console.ReadLine(); }  
      Metodi anonimi
       
      Permettono di creare dei delegate a partire da un frammento di codice, esempio:
      Func<int, int, int> f = delegate(int a, int b) { return a+b}; Non possiamo usare var per dichiarare f
      Sono chiusure (closure): possono accedere a variabili locali del metodo che li contiene
       
      Lambda Expressions (Closures)
      Assimilabili a lambda-astrazioni del lambda-calcolo, ovvero definizioni di funzioni "inline"
      Esempi:
      (int x, int y) => x + y; //somma x e y a = a * a; //funzione quadrato (x,y) => {if (x<y) return x; else return y;} //restituisce il minimo  
      Il tipo dei parametri può essere inferito, se il parametro è solo uno non servono le parentesi
      Le lambda NON sono delegate, ma sono convertibili in delegate
       
      public static void Foo(Action<int> bar) { bar(21); } public static void Main(string[] args) { int k = 0; Action<int> f = delegate(int a) { k += a; }; Action<int> g = a => k += a; Foo(f); Foo(g); Console.WriteLine(k); // 42 Console.ReadLine(); }  
      Lambda-like syntax
      Sintassi molto simile alle lambda per
       - dichiarazione di proprietà
      public int Z {get {return I+K;}} public int Z => I+K;  - dichiarazione di metodi
      public int Pippo(int x) {return Z+x;} public int Pippo(int x) => Z+x;  
      EVENTI: Pattern Observer
      AKA: Dependents, Publish-Subscribe, Listener
      Motivazione: partizionando un sistema in una collezione di oggetti che cooperano nasce la necessità di mantenere la consistenza
      Ma senza ridurre la riusabilità delle classi
      Intento: definire una relazione 1 a molti fra oggetti, in modo che quando uno cambia stato, tutti quelli dipendenti vengano notificati
       
      Eventi in .NET
      Spesso è utile associare delle azioni all'accadere di un certo evento
      Per esempio il click su un pulsante, la pressione di un tasto, la ricezione di un messaggio dalla rete, ecc..
      Gli eventi in .NET portano a livello di linguaggio il pattern Observer
       - Permettono di disaccoppiare la sorgente dell'evento dalle azioni di risposta
       - Solo la classe che espone l'evento può sollevarlo, gli altri possono solo registrarsi per ricevere le notifiche
       
      Dichiarazione e uso
      Una classe può esporre degli eventi, dichiarati con: event TipoDelegate NomeEvento;
      Chi è interessato a un evento può usare::
       - l'operatore += per iscrivere un delegate, chiamato in questo caso, event-handler
       - l'operatore -= per de-iscrivere un event-handler
      L'vento può essere sollevato (fired) solo all'interno della stessa classe con: nomeEvento(...); tutti gli event-handler iscritti vengono invocati
       
      Per sollevare un evento, dobbiamo controllare che non sia null
      if (this.nomeEvento!=null) this.nomeEvento(/*...*/); non è thread-safe
      Possibilità 1:
      var ev=Volatile.Read(ref this.nomeEvento); if (ev!=null) ev(/*...*/); Possibilità 2:
      this.nomeEvento?(/*...*/); non si può.
      Si usa
      this.nomeEvento?.Invoke(/*...*/);  
      Per certi versi, gli eventi stanno ai delegate come le proprietà stanno ai campi
      public event TipoDelegate NomeEvento;
      equivale ad avere un campo privato di tipo TipoDelegate e chiamato NomeEvento e due metodi pubblici add e remove
       
      delegate void EventHandler (object sender, BlablaEventArgs e); sender indica la sorgente dell'evento (es. button)
      e contiene le informazioni aggiuntive e BlablaEventArgs è un sottotipo di EventArgs (es. KeyPressEventArgs)
       
      public delegate void EventHandler<TEventArgs>( Object sender, TEventArgs e) //Per esempio public class Stock { //... public event EventHandler<PriceChangedEventArgs> PriceChanged; }  
       

    • Il C# (si pronuncia see sharp) è un linguaggio di programmazione orientato agli oggetti sviluppato da Microsoft all'interno dell'iniziativa .NET, e successivamente approvato come standard dalla ECMA (ECMA-334) e ISO (norma ISO/IEC 23270).
      La sintassi e struttura del C# prendono spunto da vari linguaggi nati precedentemente, in particolare Delphi, C++, Java e Visual Basic.
       
      In questa guida vediamo la versione 7.2 di C#.
       
      .Object-Oriented, sintassi alla C (graffe, int, for, ...)
      .Distinzione fra tipi valore e reference
      - boxing e unboxing
      - le stringe sono oggetti immutabili 
      .Ereditarietà singola per classi, ma multipla per le interfacce. Supporta i generici (metodi, classi, e interfacce)
      .Costruttori per inizializzare gli oggetti
      .Oggetti creati con new, garbage collected
      .Gestione degli errori tramite meccanismo di eccezioni
      .Compilato per un'unica architettura (virtuale)
       
      Statement
      .if, while, do while, for, {}, expression-stmt (espresesione seguita da ";"), dichiarazioni di tipo sono (quasi) uguali.
      .foreach(T v in exp) che in Java è for(T v : exp)
      .goto (permesso in certi casi), sostanzialmente sostituisce break/continue etichettati
      .synchronized è diventato lock
      .Lo switch
       - non supporta il "fall-through" se il case non è completamente vuoto
       - i case possono essere string literal (ora anche in Java 7)
       - (supporta anche i pattern matching nei case)
       
      Java C# (in realtà: .NET) java.lang.Object: System.Object: -toString -ToString -equals -Equals -hashCode -GetHashCode -(finalize) -(finalize) -(altri metodi coi thread) java.lank è un package System è un namespace (java -> classe di java.lang) -che si importano -si dichiarano con namespace e si usano con using  
      Vediamo il primo codice Ciao Mondo:
       
      namespace ConsoleApplication { using System; public class Program { public static void Main(string[] args) { Console.WriteLine("ciao mondo"); Console.ReadLine(); } }}  
      si può usare il comando
      using static System.Console; Permette di usare le classi dichiarate in System senza qualificarle pienamente Console invece di System.Console;
      Meccanismo analogo per le classi permette di accedere ai membri statici senza esplicitare il nome della classe WriteLine invece di Console.WriteLine
       
      Modificatori di Accesso
       
      Le classi possono avere questi modificatori di accesso vediamo il confronto con Java:
       
      Java c# .public .public .protected .protected - classe e sottoclassi .(friendly) .--- .--- .internal - stesso assembly (dll o exe) .--- .internal protected - protected o internal .--- .private protected - protected e internal (sic) .private .private  
      public: accessibile a tutti
      private: accessibile solo alla classe
       
       
      Ereditarietà
       
      Vediamo prima come si fa in Java prima:
       
      Java .class C1 extends C2 implements l1, l2, l3 { C1() super(...) ... C1 (int x) { this(...) ... interface l extends l1, l2, l3, ..  
      In Java le interfacce possono avere campi costanti (final static)
      ora vediamo l'ereditarietà in C#:
       
      c# class C1 : C2, I1, I2, I3 { C1 : BASE (...) { ... C1 (int x) : this (...) { .. interface I : I1, I2, I3 ...  
      In C# le interfacce contengono solo metodi (astratti e pubblici, come in Java)
      Per convenzione, iniziano tutte con I : IPippo, IPluto, ecc..
       
       
      Metodi virtuali o no?
       
      JAVA:
      . default: dispatch dinamico
      . override senza modificatori (ma introdotta @Override)
      . final rende il dispatch statico, ma evita anche ogni ri-definizione nelle sottoclassi
       
      Binding: associazione di un nome a un'operazione (usando, per esempio, i tipi degli operandi/argomenti) in Java sempre statico
      in C# Dynamic binding -> dynamic dispatch (non viceversa!)
      Dynamic dispatch: selezione di una particolare implementazione per operazione polimorfa
       
      C#:
       
      . default: dispatch statico
      . per avere dispatch dinamico: virtual
      . quando il metodo esiste già, richiesto override o new (che è default, ma con warning)
      . una ridefinizione di metodo può essere marcata con sealed per evitare altre ridefinizioni
      . classe sealed è come final in Java
       
       
      Metodi implementati
       
      Se I1 e I2 hanno un metodo m, e C le implementa entrambe, posso implementare diversamente I1.m e I2.m?
       
      In Java No, è richiesto un metodo pubblico chiamato m e ce ne può essere solo uno
      In C# si, grazie all'implementazione esplicita di interfacce 
      public class C : I { int I.Met() { return 1; } } Non ci va nessun modificatore e il metodo risulta inaccessibile attraverso il tipo C.
       
      Metodi locali
       
      I metodi locali sono sempre privati, dentro a Met stesso, come convenzione di stile si mettono in fondo
      Non sono visibili agli altri metodi e chi deve capire la classe sa che non ha bisogno di leggerli se non vuole entrare nei dettagli di Met
       
      Runtime Type Identification/Cast
       
      in Java abbiamo;
      exp instanceof T (T)exp Object t = exp;    t instanceof T ? (T)exp : (T)null  
      in C# abbiamo:
      exp is T (T)exp exp as T  
       
      Costanti
       
      Java
      .Campi final static
      C#
      .Modificatore readonly analogo a final
      .Modificatore const, usabile con tipi numerici ed enumerazioni, indica una costante a tempo di compilazione
       
       
      Eccezioni
       
      Entrambi hanno try/catch/finally e una gerarchia di eccezioni con radice (java.lang/System).Exception e membri analoghi StackTrace/InnerException
      Ma C# non ha le eccezioni controllate, quindi non ha la clausola throws nelle intestazioni dei metodi (e non vi costringe a dichiarare/catturare)
       
      Le eccezioni si catturano per gestirle 
      catch (Exception e) {Console.WriteLine(e.Message);} eventualmente si risollevano
      Catch (Exception e) {throw new Exception (e.Message); } magari cambiando tipo
      catch (Exception e) {throw new MyException(e.Message);}  
      Ok solo per console applications
      Altrimenti:
      catch (Exception e) { Debug.WriteLine(e.Message); } cosi si conserva history
      Oppure usando gli exception filter:
      private static bool NotifyAndContinue(Exception e){ /*do logging/console writing*/ return false; } ... catch (Exception e) when (NotifyAndContinue(e)) { } volendo cambiare tipo
      catch (Exception e) {throw new MyEception(e);}  
       
      Tipi primitivi/valore
       
      Java:
      boolean, char, int, long, float, double, ...
      C#:
      bool, char, int, long, float, double, (unsigned) uint, ulong, ...
      ma int è un alias di Int32, ulong di UInt64, ecc...
      - object è un alias di Object
      - string è un alias di String
       
       
      Tipi in .NET
       
      I linguaggi supportati dal .NET framework quali C# e VB si dice che sono strongly-typed, ossia fortemente tipizzati, in parole povere ogni variabile od oggetto dichiarato all'interno del programma deve definire un tipo e lo deve rispettare (pena un errore di compilazione).
       
      Valore
      - Le variabili memorizzano direttamente gli oggetti, non è possibile aliasing
      Questi tipi rappresentano la stragrande maggioranza dei Tipi Primitivi (dati a sè stanti e non complessi, come un numero o un carattere), come System.Int16, System.Char, System.Boolean, System.DateTime.
      il valore del dato il quale viene allocato nella zona di memoria detta stack
      Reference
      - Le variabili memorizzano dei riferimenti a oggetti, l'assegnazione crea degli alias
      Questi tipi rappresentano tutti quei dati espressi tramite la dichiarazione di classi per descrivere oggetti complessi, essi vengono allocati nella memoria managed heap e non contengono direttamente il valore del dato, ma un puntatore ad una locazione di memoria dove è contenuto il valore vero e proprio, infine come è facile presumere questi possono assumere valore null.
       
       
      C#: struct, tipi di valore
       
      In c# è possibile creare i propri tipi valore usando struct
      I tipi valore possono essere allocati sullo stack, no aliasing
       
       
      Enum
       
      Simili a quelli di C/C++, un modo per definire delle costanti di tipo integrale
      internal enum Color { Red, Green, Blue, } Color c=Color.green;  
       
      Rilascio automatico delle risorse:
       
      using (var pippo=new StreamReader(@"c:\bla")) { //usa pippo... }  
       
      Generici
       
      Simili a quelli Java (ma molto efficienti)
      Si possono mettere dei vincoli sugli argomenti tramite la clausola where
      public class C<T> where T : new() { public T Foo() { return new T(); } }  
      Generici, vincoli
      new(): l'argomento deve essere un tipo instanziabile, col costruttore di default Atype: l'argomento deve essere sottotipo di AType, può essere il nome di un tipo del sistema o di un altro parametro del generico struct: l'argomento deve essere un value type class: l'argomento deve essere un tipo refernce (classe, interfaccia, delegate o array)  
      Se si devono vincolare più argomenti, servono più clausole where
      class Test<T,U> where U : struct where T : E, new() { }  
      Un parametro di tipo di un'interfaccia (o delegate) generica può essere:
      - out, può essere usato solo come tipo di ritorno.
      - in, può essere usato come tipo per i parametri e nei vincoli
      Esempi:
      interface IEnumerator<out T> { bool MoveNext(); T Current {get;} } interface IComparer<in T> { int Compare(T left, T right); } delegate TResult Func<in TArg, out TResult> (Targ arg);  
      Non ci sono funzioni/variabili globali (al più membri statici)
      Numero variabile di parametri: params T [] invece di T...
      Gli array possono essere "jagged" per sempio:
      int[][] myarray = new int[2][]; myarray[0]=new int[3]; myarray[0]=new int[9]; Ma ci sono anche gli array bidimensionali: int[,] myArray = new int[,]{1,2,3},{4,5,6}}  
       
       
       
       
       
       
       
       
       
       
       
       
       

    • Nella prima lezione abbiamo visto l'introduzione lato client e abbiamo introdotto il DOM (Document Object Model) possiamo interagire con gli elementi visualizzati all'interno del browser, si può modificare quanto visualizzato in una pagina nel browser anche usando JavaScript.
      Il DOM è lo standard ufficiale del W3C.
      Permette di rappresentare documenti strutturati (per esempio HTML e XML)
      Interfaccia di programmazione che permette di accedere agli elementi del documento.
       
      Un documento HTML visualizzato in una finestra del browser diventa un oggetto Document, accessibile attraverso la variabile globale document
      Un oggetto Document ha proprietà, metodi, eventi
      Ogni elemento HTML all'interno della pagina è accessibile in modi diversi.
       
      Attraverso una proprietà dell'oggetto Document
      Esempio: document.referrer, document.cookie
      //mostra la stringa dei cookie alert(document.cookie); Attraverso un metodo dell'oggetto Document che permette di selezionare ID, Name, Type, Class, CSS selectors
      Esempio: var el = document.getElementById(id)
      Come nodo dell'albero derivabile dal documento
      ALBERO del DOM
      Al DOM può essere associata una rappresentazione ad albero i cui nodi possono essere:
      il documento stesso, come radice un elemento un attributo un testo un commento La struttura dell'albero riflette l'organizzazione degli elementi HTML nella pagina
       
      <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Albero DOM</title> </head> <body> <p>The DOM tree of this<i>page</i></p> <ul id=”mylist”> <li>item 1</li> <li>item 2</li> <li><a id=”mylink” href=”http://www.mysite.com”>Item 3</a></li> </ul> <img src=”myimage.png” alt=”myimage”> </body> </html>  
      ACCESSO al DOM
       
      JavaScript può cambiare:
      tutti gli elementi HTML in una pagina tutti gli attributi HTML in una pagina tutti i stili CSS in una pagina tutti gli eventi in una pagina Nota: il contenuto HTML di una pagina è statico, il contenuto del DOM è dinamico
      OGGETTO DOCUMENT: proprietà
      Permettono di accedere alle caratteristiche del documento, per esempio colore dello sfondo, colore del testo, ... e di modificarle via JavaScript
      <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Document Object</title> <link rel="stylesheet" type="text/css" href="css/mystyle.css" /> <script> function docProperties() { var msg = ""; for (prop in window.document) if (typeof window.document[prop] !== 'function') msg += prop + " ---> " + window.document[prop] + "\n"; window.alert(msg); console.log(msg); } </script> </head> <body bgcolor="#eeeeee" text="#000099"> <!-- gli attributi del body sono deprecati --> <h1 class="centro">Document Object</h1> <p class="centro">Apri anche la console del browser per vedere le proprietà</p> <script> docProperties(); </script> </body> </html> Per richiamare lo script usiamo il metodo:
      <script> docProperties(); </script>  
      Ogni elemento HTML ha le sue proprietà
      <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Image Object</title> <link rel="stylesheet" type="text/css" href="css/mystyle.css" /> <script> function imgProperties(img) { var msg = ""; for (var im_prop in img) if (typeof img[im_prop] !== 'function') msg += im_prop + ": " + img[im_prop] + "\n"; console.log(msg); } </script> </head> <body> <div class="centro"> <h1>Images</h1> <a href="http://www.chimico.org"><img id="im1" src="images/chimico.gif" alt="chimico" onmouseenter="imgProperties(this)"></a> <a href="http://www.babbonatale.org"><img id="im2" src="images/babbonatale.gif" alt="babbonatale" onmouseover="imgProperties(this)" /></a> <a href="http://www.gallo.org"><img id="im3" src="images/gallo.gif" alt="gallo" onmouseover="imgProperties(this)" /></a> <a href="http://www.pupazzoneve.org"><img id="im4" src="images/pupazzoneve.gif" alt="pupazzoneve" onmouseover="imgProperties(this)" /></a> <a href="http://www.fiore.org"><img id="im5" src="images/fiore.gif" alt="fiore" onmouseover="imgProperties(this)" /></a> </div> <br><br> <p class="centro">Porta il mouse sulle immagini e apri la console del browser per vedere le proprietà</p> </body> </html>  
      OGGETTO DOCUMENT: Metodi
      Si possono usare gli identificatori per recuperare elementi con il metodo document.getElementById(id)
      Questo metodo restituisce un riferimento all'elemento che possiede l'identificatore specificato come parametro
      <img src=“images/img1.gif” id=“img1” alt=“img1” /> var elem = document.getElementById(“img1”);  
      document.getElementsByName(name)
      Restituisce tutti gli elementi con attributo name specificato come parametro

      document.getElementsByTagName(tagname)

      document.getElementsByClassName(classname)

      document.querySelectorAll(CSSselector)
      Es. var elems = document.querySelectorAll(“ul.menu”)
       
      Prima della specifica HTML 4.0 che ha introdotto l'attributo id, gli script potevano accedere agli elementi solo attraverso l'attributo name.

      Oggi è facile vedere usati entrambi gli attributi, id e name, inizializzati allo stesso valore, usati per la programmazione sul client (id) e per l’invio dei dati al server (name)
      JavaScript: EVENTI
      Gli elementi di una pagina possono “sentire” diversi eventi
      Ad esempio, si può cambiare l’elemento visualizzato nella pagina con un effetto di rollover, usando i tag HTML onmouseover e onmouseout
      Lo stesso effetto si ottiene anche con i CSS (hover).
       
      <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Rollover</title> <link rel="stylesheet" type="text/css" href="css/mystyle.css" /> <script> var imm = [ "images/chimico.gif", "images/babbonatale.gif", "images/gallo.gif", ]; function swap(i,id) { var elem = document.getElementById(id); elem.src = imm[i]; } </script> <body class="centro"> <br> <br> <h2>Rollover example</h2> <p>Posiziona il mouse sulle immagini</p> <br> <br> <img id="im0" src="images/chimico.gif" alt="chimico" onmouseover="swap(2,'im0');" onmouseout="swap(0,'im0');" /> <img id="im1" src="images/babbonatale.gif" alt="babbonatale" onmouseover="swap(2,'im1');" onmouseout="swap(1,'im1');" /> <img id="im2" src="images/gallo.gif" alt="gallo" onmouseover="swap(2,'im2');" onmouseout="swap(2,'im2');" /> </body> </html>  
      Si possono associare dei gestori di eventi (funzioni) agli elementi di una pagina usando il metodo addEventListener()
      Ogni volta che si verifica l’evento sull’oggetto cui è stato associato un “listener”, viene invocata la funzione corrispondente
      JavaScript: BUBBLING
      Se si verifica un evento su un elemento, viene eseguito il getstore associato all'elemento stesso (se esiste) e poi l'evento viene propagato verso l'alto (blubbling) fino a raggiungere la radice dell'albero
       
      Molto comodo per gestire eventi su elementi uguali tra di loro scrivendo il codice una sola volta
      Si possono includere questi elementi in uno stesso elemento padre, per esempio un <div>
      Si associa il gestore dell'evento al <div> e nel codice si può usare event.target che identifica sempre l'elemento cha ha causato l'evento
       
      Attenzione:
      event.target è l'elemento "target" che ha causato l'evento e non cambia durante il processo di bubbling
      this è l'elemento "current", cioè quello che sta eseguendo il gestore di evento
      Se ci sono più gestori per lo stesso evento, questi vengono eseguiti tutti mano a mano che si sale nella gerarchia del documento
       
      <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Rollover</title> <link rel="stylesheet" type="text/css" href="css/mystyle.css" /> <style> .swap { } </style> </head> <body class="centro"> <h2>Rollover example (versione con addEventListener)</h2> <p>Posiziona il mouse sulle immagini</p> <div id="swap"> <img id="im0" src="images/chimico.gif" alt="chimico" /> <img id="im1" src="images/babbonatale.gif" alt="babbonatale" /> <img id="im2" src="images/gallo.gif" alt="gallo" /> <img id="im3" src="images/pupazzoneve.gif" alt="pupozzoneve" /> <img id="im4" src="images/fiore.gif" alt="fiore" /> </div> <script> var imm = { im0: "images/chimico.gif", im1: "images/babbonatale.gif", im2: "images/gallo.gif", im3: "images/pupazzoneve.gif", im4: "images/fiore.gif", im5: "images/poff.gif", }; function swap(key,id) { var elem = document.getElementById(id); elem.src = imm[key]; } var el=document.getElementById("swap"); el.addEventListener("mouseover", function(event) { var img = event.target; if (img.tagName=="IMG") { swap("im5",img.id); } }); el.addEventListener("mouseout", function(event) { var img = event.target; if (img.tagName=="IMG") { swap(img.id,img.id); } }); </script> </body> </html>  
      JavaScript: Oggetto FORM
      E' uno degli oggetti più importanti del DOM
      Durante la lettura di un file HTML, viene creato un array con tante celle quanti sono i form all'interno del file.
      Vedi: http://www.w3schools.com/jsref/dom_obj_form.asp
       
      var myfarm = document.getElementById("frm1");
      Proprietà: myform.length myform.action myform.method myform.encoding myform.name myform.target myform.elements[ ]  
      myform.element[] è a sua volta un array con tanti elementi quanti sono gli elementi del modulo
       
      var usr = myform.elements[0]; var usr = document.getElementById(“username”);  
      Campi text, password, file -> change, input, focus, blur
      Campi checkbox, radio, button -> click, focus, blur
      Campi textarea, select -> input, change, focus, blur
      Campi hidden (campo nascosto, non sente nessun evento)
      Campi reset/submit -> click, focus, blur, submit, reset
       
      Oggetto FORM: Value
      Tutti gli elementi di un modulo hanno un valore (value)
      il valore fornito in input da un utente per un campo di testo Il valore associato ai pulsanti di tipo radio, checkbox, o alle opzioni di un menu (option) l'etichetta di un pulsante  
      campo di testo con id txt1
      <input type="text" id="txt1" name="txt1" onchange="alert(this.value);" /> <script> document.getElementById("txt1") .addEventListener("change", function() { alert(document.getElementById("txt1").value); }); </script>  
      Oggetto FORM: Checked
      I pulsanti radio e checkbox hanno anche la proprietà checked
      var el = document.getElementById(“rd1”); el.checked el.value  
      Oggetto FORM: Checked
      Il tag <select> possiede le proprietà selectedIndex e options[]
      var el = document.getElementById(“sel1”); var i = el.selectedIndex; alert(el.options[i].value);  
      Oggetto FORM: INVIO
      Al momento dell'invio di un modulo si possono fare i controlli mediante codice JavaScript associato agli eventi submit e reset
      <form name="frm1" id="frm1" method="post" action="..." onsubmit="return checkdata();" onreset="return checkreset();"> ... ... </form> Nota: molti controlli oggi si demandano a HTML5!
       
      Se per gestire il submit si associa una funzione usando il metodo addEventListener() si può disabilitare l'invio del form usando il metodo preventDefault()
      L'evento viene cancellato e questo corrisponde a disabilitare il comportamento di default del browser relativamente all'evento stesso
       
      ESPRESSIONI REGOLARI
      Li abbiamo già visto in PHP, permettono di descrivere pattern testuali
      In JavaScript esiste l'oggetto RegExp ma le espressioni regolari possono anche essere create mediante assegnazione
      var patt=new RegExp(pattern,modifiers); var patt=/pattern/modifiers; /[abc]/    “a”,“b”,“c”
      /^a/          tutte le stringhe che iniziano con “a”
      /a$/         tutte le stringhe che finiscono con “a”
      /[a-z]/
      /[A-Z]/
      /[0-9]/
      /[a-zA-Z0-9]/
      /[a-z]{n}/
      /[0-9]{n,m}/
      /[a,b,c]{n,}/
       
      Espressioni regolari: metodi
       
      RegExpObject.exec(string) RegExpObject.test(string) String.search(/pattern/) String.match(/pattern/)  
      Esempio da stackoverflow function validateEmail(email) { var emailpattern = /^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[0-9 {1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return emailpattern.test(email); }  
      CAMBIARE LO STILE IN JavaScript
      E' possibile cambiare lo stile degli elementi su una pagina HTML usando la proprietà style
      Esempio:
      let el=document.getElementById("Id") el.style.background="yellow";  
      Vediamo un esempio, tramite questo script è possibile ingrandire e rimpicciolire il quadrato in centro:
       
      <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Change style</title> <style> #mydiv { width: 300px; height: 300px; margin-top: 200px; margin-left: auto; margin-right: auto; border: 5px solid gray; background-color: greenyellow; } .centro { text-align: center; } </style> </head> <body id="mybody"> <p class="centro">Premi + per ingrandire, - per rimpicciolire</p> <div id="mydiv"> </div> <script> let mb = document.getElementById("mybody"); let el = document.getElementById("mydiv"); mb.addEventListener("keydown", function() { if ((event.keyCode != 187) & (event.keyCode != 189)) return; let size = el.offsetHeight; if (event.keyCode == 187) { size = size + 20; el.style.background = "red"; } else { size = size - 20; el.style.background = "yellow"; } el.style.width = el.style.height = `${size}px`; }); </script> </body> </html>  
       

    • JavaScript è il linguaggio di scripting del web, molti anni fa sono stati proposti molti linguaggi, ma quello che è emerso di più è stato JavaScript. ECMAScript è il nome ufficiale dello standard di JavaScript. Ha alcune caratteristiche simile al C e ad altri linguaggi, è nato in Europa come la maggior parte del web.
      Sito ufficiale ecma:
      https://www.ecma-international.org/publications/standards/Ecma-262.htm
       
      Abbiamo il browser che fa delle richieste e che ricevono delle risposte, possono essere file statici, dinamici che interagiscono con il database. Possono contenere codice HTML, CSS e PHP adesso andiamo a vedere anche il codice JavaScript, programmazione client side perchè il browser che riceve il codice lo manda in esecuzione. Ci serve per creare delle interfacce più ricche e più sofisticate, un interazione maggiore; non caricare intere pagine con JavaScript e ad Ajax possiamo fare richieste e caricare dei dati e modificare la pagina senza fare il reload della pagina.
       
      JavaScript ha il core language (ECMAScipt) che contiene le variabili, espressioni, istruzioni, funzioni e tutti i costrutti di base, poi ci sono gli oggetti che sono DOM (Document Object Model) e BOM (Browser Object Model) questi oggetti vengono utilizzati nel contesto del browser, client-side. Ora è possibile sviluppare delle web application completamente con JavaScript, invece di PHP, lato server-side, e si chiama Node.js.
      USI di JavaScript
      Validazione input Apertura nuove finestre Oggi si possono fare tranquillamente in HTML5, prima si usava solo JavaScript.
      Rollover, Ajax Oggi usiamo i CSS, prima JavaScript era molto utile per questo.
      DOVE si scrivono gli Script?
      Gli script sono caricati ed eseguiti dal browser durante la lettura del codice HTML oppure in risposta al verificarsi di un evento.
      Attenzione: uno script non può fare riferimento ad oggetti (link, immagini, form) che non siano ancora stati definiti
       
      External
      Si scrive un file di funzioni JavaScript che viene incluso nel documento HTML nella parte di <head> o di <body> (spesso al fondo prima di </body>)
       
      <script src="myfile.js"><script>
       
      Il codice non è "annegato" all'interno della pagina HTML e la manutenziona è più semplice Si può sfruttare il caching del browser  
      Internal
      Si inserisce codice JavaScript (istruzioni e funzioni) nella parte di <head> o di <body> all'interno dei tag <script> ... </script>
       
      Inline
      Si inserisce codice JavaScript direttamente nei tag HTML (nel caso di programmazione ad eventi, ma oggi questa scelta è deprecata)
       
      QUANDO vengono eseguiti?
       
      Dipende..
      Quando il browser carica una pagina se trova sequenze di istruzioni le manda in esecuzione se trova definizioni di funzioni ne fa il parsing per controllarne la correttezza sintattica Terminato il caricamento della pagina, quando il browser "sente" un evento se trova una funzione collegata a quell'evento, la esegue  
      JavaScript è un linguaggio interpretato ma i browser più moderni lo compilano just-in-time per migliorare le performance. 
      ECMAScript (core language)
      Definisce la sintassi, i tipi di dato, le istruzioni, le parole riservate, gli operatori, gli oggetti predefiniti,..
      JavaScript: linguaggio dinamico
      Solo gli errori sintattici vengono riconosciuti staticamente prima dell'esecuzione
      Gli altri errori vengono riconosciuti a runtime durante l'esecuzione, e non sempre...
      i Browser mettono a disposizione strumenti per capire cosa sta succedendo...
      Ctrl+Shift+I per aprire la Console in Chrome
       
      JavaScript: struttura lessicale
      Le istruzioni sono separate tra loro dal carattere;
      Le parentesi graffe {...} permettono di definire i blocchi di istruzioni
       
      Commenti
      // questo è un commento
      /* questo è un commento */
      <!-- questo è un commento
       
      Gli identificatori possono iniziare con _ $ o con una lettera e non possono iniziare con un numero
      Non si possono usare le parole riservate
      JavaScript è case-sensitive var a != var A
       
      JavaScript è un linguaggio tipato dinamicamente, la stessa variabile può essere usata per memorizzare dati di tipo diverso
      i = "Hello world";
      i = 1;
      i = true;
       
      Tipi:
      undefined (valore non inizializzato) boolean (true, false) number (64bit, floating point)  string (sequenza di caratteri) "hello world" symbol (chiave univoca per una proprietà) var key = Symbol ("k") object (oggetto oppure null)   
      Array
      In altri linguaggi gli array sono collezioni di dati omogenei accessibili mediante indice
      In JavaScript gli elementi degli array possono essere di tipo diverso
      var empty = [];
      var numbers = ['zero', 'uno', 'due', 'tre', 'quattro'];
      var misc = ['ciao', 10, true, ['M','F'], Nan];
       
      Oggetti
      Gli oggetti hanno proprietà definite come associazioni di chiavi e valori
      var person = {  firstname: "Alice",  lastname: "Smith",  email: "[email protected]" };  
      var empty_object = {};
       
      Si può accedere alle proprietà con:
      dot notation "." a = object_name.property_name;
      mediante chiave a = object_name['property_name'];
       
      Se il nome della proprietà non è un identificatore valido, per es. contiene uno spazio oppure altri caratteri speciali, è indispensabile la seconda notazione:
      myObject.first name                    //non valido myObject['first name'] = 'John';      //ok  
      Si possono aggiungere/rimuovere proprietà dinamicamente
      Se si accede ad una proprietà non definita, il valore di ritorno è undefined
       
      JavaScript Object Notation
      Meglio nota come JSON, indica un formato testo usato per lo scambio di dati
       
      La sintassi è molto simile a quella degli oggetti espressi nella notazione Object Literal
       
      I nomi delle proprietà devono sempre essere scritti tra doppi apici
       
      JavaScript: CLASSI
      Le classi si definiscono con class, hanno un metodo chiamato constructor che viene eseguito quando si crea l'istanza. Dentro il costruttore solitamente si inizializzano le proprietà.
      I metodi seguono le regole delle funzioni
       
      class Person {  constructor(name) { this.name = name }  sayHello() { return "Ciao, " + this.name + "!" } } let p = new Person("Nicolò"); p.sayHello(); // restituisce "Ciao, Nicolò!"  
      DATE
      Offre proprietà e metodi per lavorare con tempo e date
       
      var oggi = new Date();
      var e = oggi.getTime();
      restituisce i millisecondi trascorsi dalla mezzanotte del 1/1/1970
      Esempio:
      <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Date</title> </head> <body> <script> var now = new Date(); var t = now.getTime(); window.alert("Sono passati " + t + " millisecondi a partire dal 1/01/1970"); var h = Math.floor((t/1000)/60/60); window.alert("Corrispondono a circa " + h + " ore"); </script> </body> </html>  
      MATH
      Offre proprietà e metodi per le operazioni matematiche
      var π = Math.PI;
      var e = Math.E;
       
      STRING
      Offre proprietà e metodi per manipolare testo
      var a = "Hello world";
      var a = 'Hello world';
      // restituisce una sottostringa
      var e = a.slice(start, end);
      // converte una stringa in un array
      var g = a.split("separator");
       
      VARIABILI
       
      In passato non era obbligatorio dichiarare le variabili, ma questa pratica oggi è deprecata: se il codice è in strict mode ("use strict") genera un errore
       
      A partire da ECMAScript 2015 questa direttiva è sottintesa in molti nuovi costrutti
       
      Per dichiarare una variabile si usano, var, let, o const
      var, variabili globali o locali let, variabili locali dentro un blocco const, variabili in sola lettura  
      FUNZIONI
       
      function fName(param1, param2) { // some JavaScript code to be executed return result; } function square(x) { return x ** 2; } var a = square(4);  
      Le variabili dichiarate all'interno della funzione sono locali
      Le variabili che vengono usate (ma non dichiarate) all'interno di una funzione sono globali
       
      EVENTI
       
      Esempi di Eventi:
      Quando si clicca il mouse Quando uan pagina si carica Quando un immagine si carica Quando il puntatore va sopra un elemento Quanto un campo in input è cambiato Quando un form HTML è stato inviato
        load, unload (per le pagine) change, reset, submit (dedicato ai form) blur, focus (testo) click (per tutto) mousedown, mouseup, mouseover,mouseout (del mouse) keydown, keypress, keyup (tastiera) https://developer.mozilla.org/en-US/docs/Web/Events
       
      Ad ogni evento è associato un elemento HTML corrispondente (inizia con on e poi segue il nome dell'evento)
      Se le file HTML esiste del codice JavaScript associato a questo elemento HTML, il codice viene eseguito quando si verifica l'evento
       
      Esempio (oggi deprecato) <img src="images/dummy.jpg" onmouseover = "JavaScript code;" onmouseout = "JavaScript code;" onclick = "JavaScript code;" >  
      INPUT/OUTPUT
       
      Come nel C, JavaScript non ha propri costrutti di input/output; mentre il C si affida alle librerie I/O standard, un interprete JavaScript si basa su un programma ospite in cui è integrato
       
      Se integrato in un browser Web, JavaScript si collega alle applicazioni tramite interfacce chiamate BOM (Browser Object Model) e DOM (Document Object Model)
       
      Anticipiamo l'oggetto window (BOM) che permette di vedere alcuni aspetti dell'input/outpot
       

       
       
      OGGETTO WINDOW
       
      Rappresenta il browser
      Permette di realizzare;
      operazioni di input/output aprire nuove finestre (popup) chiudere finestre ...  
      window.prompt("Dammi il tuo nome","") window.confirm("Vuoi davvero uscire?")  
      ESEMPIO 2:
      openwin.html
      <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>window.open</title> <link rel="stylesheet" type="text/css" href="css/mystyle.css" /> <script> function openwin() { let windowFeatures = "width=550,height=300,menubar=no,location=no,resizable=no,scrollbars=no,status=no"; window.open("popup.html","newwin",windowFeatures) } </script> </head> <body> <br/> <div class="box centro"> <h2>come with me ... </h2> <img src="images/hamwalk.gif" alt="hamwalk"/> <form> <input class="pulsante" type="button" value="Click here" onclick="openwin();"/> </form> </div> </body> </html>  
      popup.html
      <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>popup window</title> <link rel="stylesheet" type="text/css" href="css/mystyle.css" /> </head> <body> <br> <div class="box centro"> <h2 class="centro">and dance ...</h2> <img class="centro" src="images/gerbil.gif" alt="gerbil"/> <img class="centro" src="images/gerbil.gif" alt="gerbil"/> <img class="centro" src="images/gerbil.gif" alt="gerbil"/> <img class="centro" src="images/gerbil.gif" alt="gerbil"/> <br/> <form name="closewin"> <input class="pulsante" type="button" value="Close this window" onclick="window.close();"/> <input class="pulsante" type="button" value="Close the browser" onclick="window.opener.close();"/> <!-- check JavaScrit console when trying to close the browser --> <input class="pulsante" type="button" value="Print" onclick="window.print();"/> </form> </div> </body> </html>  

    • Cos è CURL e a cosa Serve?
      cURL è un comando che serve per scriptare, cioè per scrivere degli script per trasferire dei dati, è usato nelle televisioni, nelle automobili, in una notevole varietà di dispositivi. Viene usato per le comunicazioni attraverso la rete.
      cURL è un tool da linea di comando quindi si può usare al di fuori di PHP, è uno strumento di networking, per interagire con sistemi remoti e ottenere delle risposte.
       
      Ci permette per esempio a Scaricare una pagina web:
       
      <?php $handle = curl_init(); $url = "...url qui..."; // Set the url curl_setopt($handle, CURLOPT_URL, $url); // Set the result output to be a string curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); $output = curl_exec($handle); curl_close($handle); echo $output; ?> curl_init() inizializza la sessione; curl setopt() opzioni della sessione; CURLOPT_URL connessione verso un dominio web; CURLOPT_RETURNTRANSFER trasferito come stringa; curl_exec() esegue la sessione con tutti i parametri; curl_close() chiude la connessione
       
      Scaricare un file remoto:
       
      <?php // Remote file $url = "https://google.it/images/google.jpg"; // Local file $file = "img.jpg"; $handle = curl_init(); // Open the local file for writing $fp = fopen($file, "w"); curl_setopt_array($handle, array(CURLOPT_URL=> $url,CURLOPT_FILE => $fp, CURLOPT_HEADER => true )) curl_exec($handle); curl_close($handle); fclose($fp); ?> CURLOPT_URL richiamo un url in remoto; CURLOPT_FILE file nel quale scrivere;
       
      Per gestire gli errori
       
      $responseCode = curl_getinfo($handle, CURLINFO_HTTP_CODE); $responseType = curl_getinfo($handle, CURLINFO_CONTENT_TYPE); if (curl_errno($handle)) { print curl_error($handle); }  
      Inviare dati in POST via cURL
       
      Possiamo compilare un form di registrazione attraverso cURL passando in POST i valori:
       
      <?php $handle = curl_init(); $url = "https://localhost/saw/registration.php"; // Array with form fields names and values $postData = array( 'firstname' => 'Mario', 'lastname' => 'Mar', 'email' => '[email protected]', 'pass'=>'aaa', 'confirm'=>'aaa' ); curl_setopt_array($handle, array( CURLOPT_URL => $url, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postData, CURLOPT_RETURNTRANSFER => true )); $data = curl_exec($handle); curl_close($handle); echo $data; ?>  
      Gestire i cookie con cURL
       
      <?php $handle = curl_init(); $url = "...."; $file = "cookie.txt"; curl_setopt_array($handle, array(CURLOPT_URL => $url, CURLOPT_COOKIEFILE => $file, CURLOPT_COOKIEJAR => $file, CURLOPT_RETURNTRANSFER => true,)); $data = curl_exec($handle); curl_close($handle); ?>  
      TRANSAZIONI
      Operazioni che scrivono sul database, come inserimento modifica e cancellazione, quando si modifica per esempio bisogna assicurarsi che se ci sono delle interazioni concorrenti non si diano fastidio tra di loro.
      Per esempio una banca che deve spostare i soldi da un conto corrente all'altro, richiede 2 operazioni uno il prelievo a l'altro incremento di un altro saldo, se succede qualcosa nel mezzo dell'operazione vuol dire che non va bene. Ci vengono in aiuto le transazioni:
      Iniziare la transazione Eseguire le query Se c'è Commit si finisce la transazione Se c'è stato un errore si fa il Rollback si riporta indietro. MySQLi e Transazioni
      L'estensione MySQLi introduce nuove funzioni per sfruttare le caratteristiche transazionali di MySQL
       
      Queste funzioni sono equivalanti ai comandi SQL
      START TRANSACTION (oppure BEGIN) COMMIT ROLLBACK Nota: per implementare le transazioni le tabelle del database devono essere di tipo InnoDB, BerkeleyDB, Falcon
       
      /* set autocommit to off */ $con->autocommit(FALSE); /* Insert some values */ $con->query("INSERT ..."); $con->query("UPDATE ..."); /* commit transaction */ $con->commit(); Vedi: http://www.php.net/manual/en/mysqli.commit.php
       
      Se le cose non vanno a buon fine si può tornare indietro usando il rollback
      /* rollback */ $con->rollback(); Vedi: http://php.net/manual/it/mysqli.rollback.php
       
      . Supponiamo di avere una tabella che memorizza le informazioni dei conti corrente di una banca
      . Se prendiamo dei soldi da un conto e li depositiamo su un altro conto dobbiamo assicurarci che entrambe le operazioni vadano a buon fine, altrimenti si perde del denaro
      . Ci vogliono due query di UPDATE che devono andare entrambe a buon fine, altrimenti bisogna riportare tutto nella situazione iniziale
       
      $query = "UPDATE contocorrente SET saldo = saldo - ? WHERE numeroconto=?"; $query = "UPDATE contocorrente SET saldo = saldo + ? WHERE numeroconto=?";  
      DATABASE ABSTRACTION LAYER
      Sono delle librerie che offrono dei metodi per interagire con il database, bisogna installarli, quella più usata oggi è PDO (PHP Data Object), indipendentemente dal DB che c'è dietro il codice funziona lo stesso, grazie alla libreria nativa del dbms.
       
      Per la connessione al database si crea un'istanza della classe PDO
      Il costruttore accetta come primo parametro una stringa nella quale si specifica il tipo di DBMS cui si vuole accedere (DSN = Data Source Name)
      <?php $conn = new PDO("mysql:dbname=$dbname;host=$host", $username, $password); ?> <?php $conn = new PDO("pgsql:dbname=$dbname;host=$host", $username, $password); ?> Vedi: http://www.php.net/manual/en/class.pdo.php
       
      Per chiudere la connessione al database
      <?php $conn = null ?>  
      Gli errori sono gestiti tramite blocchi try/catch
      <?php try { $conn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); } catch(PDOException $e) { echo $e->getMessage(); } ?>  
      Per tutte le altre operazioni si usano gli stessi metodi
      indipendentemente dal DBMS
      <?php $id = ... $name = .. $stmt = $conn->prepare("SELECT * FROM user WHERE id=? AND name=?") $stmt->bindParam(1, $id, PDO::PARAM_INT); $sth->bindParam(2, $name, PDO::PARAM_STR, 40); $stmt->execute(); ?> Sintassi alternativa
      $stmt = $conn->prepare("SELECT * FROM user WHERE id = :id AND name = :name");
       
      Per tutte le altre operazioni si usano gli stessi metodi
      indipendentemente dal DBMS
      <?php $stmt->setFetchMode(PDO::FETCH_NUM); while ($row = $stmt->fetch()) { print $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n"; } ?> PDO::FETCH_ASSOC
      PDO::FETCH_BOTH
      PDO::FETCH_OBJ
      ecc.
      INVIO EMAIL via PHP
      PHP mette a disposizione la funzione mail() per inviare messaggi di posta elettronica MA funziona solo se sul server è installato un programma per l'invio delle email
       
      PHPMailer è una libreria da installare e configurare per inviare email dal vostro server.
      Potete installare PHPMailer
      Istruzioni qui:
      http://www.sitepoint.com/sending-emails-php-phpmailer/
      HTTPS
      HTTP (HTTP e SSL/TLS) è obbligatorio, è un protocollo che crea un tunnel di sicurezza, tutti i dati che vanno in rete sono protetti da un livello di sicurezza, se qualcuno ci vuole rintracciare non lo può fare.
      Il certificato del server si può creare usando https://letsencrypt.org/
      Al giorno d'oggi Google non indicizza più i siti senza questo protocollo di sicurezza ma sono essenziali per aumentare la priorità nei siti di ricerca.
      sFTP
      Per collegarsi ad un server si utilizza il protocollo sftp, Filezilla è un client grafico, semplice e molto facile da utilizzare per trasferire file da un client a server web.
       
      .

    • Abbiamo visto come interagire con il database, e i passaggi da fare, per connettersi e per fare il fetch dei dati con select. Ora andiamo a vedere quello che ci manca come modificare e cancellare dati nel database.
      Operazioni CRUD
      E' un acronimo quando si gestiscono dei dati e rappresenta le 4 operazioni fondamentali che si possono fare sulle applicazioni che usano un database:
      Create: corrisponde ad INSERT (registration.php è una pagina pubblica) Read: corrisponde a SELECT (login.php qui si creano le variabili di sessione; show_profile.php qui si controllano le variabili di sessione) Update: corrisponde a UPDATE (update_profile.php servono le variabili di sessione) Delete: corrispodne a DELETE (delete_user servono le variabili di sessione)  
      Modifica Profilo
       
      Regola importante: campi pre-compilati con i dati già memorizzati nel database
      Raccoli i dati, si deve impostareuna query SQL con comando UPDATE
      Spesso nella query si usa l'ID dell'utente da modificare
       
      Cancellazione utente
       
      Si usa la query di DELETE
      Spesso si usa l'ID dell'utente da cancellare
      Anche in questo caso bisogna fare attenzione a non cancellare utenti a caso..
      PREAPARED STATEMENT
      Risolvono un problema arcinoto e continua ad esistere ovvero i SQL INJECTION, l'attacante invece di inserire in un form web (nome, cognome, ecc..) va ad inserire anche dei frammenti di codice sql che possono essere mandati in esecuzione verso il database se l'applicazione web non è fatta bene, prende i dati dall'esterno e non valida i dati in entrata.
       

       
      An injection of code happens when an attacker sends invalid and untrusted data to the application as part of a command or query. The attacker has the malicious intention to trick the application into executing unintended behavior to collect data or create damage.

      Source: https://cai.tools.sap/blog/top-10-web-security-vulnerabilities-to-watch-out-for-in-2019/
       
      Le query come quelle viste fino ad ora, per es.
      $query = "SELECT * FROM user WHERE name='" . $name . "' AND surname='" . $surname . "'"; che combinano
      - codice SQL
      - input fornito dall’utente
      sono potenzialmente pericolose se i dati forniti in input non sono opportunamente validati
       
      Per risolvere a questo problema possiamo usare i Prepared Statement, sono delle caratteristiche che permettono di spezzare in due le interrogazioni mysql, che possono aiutare in questo problema.
       
      Rispetto alle query SQL standard, i prepared statement
      - vengono eseguiti più volte, per valori diversi dei parametri: prima il DBMS prepara il piano di esecuzione della query, e poi si possono avere esecuzioni multiple, per valori diversi dei parametri
      - sono “robusti” rispetto a SQL injection, perché i valori dei parametri sono trasmessi in un secondo momento e non sono usati nella costruzione della query
      MySQLi e Prepared Statement
      MySQL supporta i prepared statement, sono necessari 2 passi:
      Prepare: si scrive un template con dei parametri (placeholder) che viene inviato al DBMS. Il DBMS esegue il controllo sintattico e inizializza le risorse per gli usi successivi Execute: il client invia i valori dei parametri al server che esegue la query sfruttando le risorse precedentemente allocate  
      Prepare
      - mysqli_prepare, mysqli::prepare
       
      $stmt = mysqli_prepare($con, "SELECT * FROM user WHERE email=?"); o $stmt = $con->prepare("SELECT * FROM user WHERE email=?"); Vedi: http://php.net/manual/it/mysqli.prepare.php
       
      Bind parameter
      mysqli_stmt_bind_param, mysqli_stmt::bind_param
       
      mysqli_stmt_bind_param($stmt, 's', $email); $email = “[email protected]”; o $stmt->bind_param('s',$email); $email = “[email protected]”; Vedi: http://www.php.net/manual/it/mysqli-stmt.bind-param.php
       
      Execute
      mysqli_stmt_execute, mysqli_stmt::execute
      mysqli_stmt_execute($stmt); o $stmt->execute();  
      Al termine si deve chiudere lo statement
      mysqli_stmt_close($stmt); o $stmt->close();  
      Ottenere il risultato
      $res=mysqli_stmt_get_result($stmt); o $res = $stmt->get_result(); $row = $res->fetch_assoc(); Per le query di SELECT viene restituita una risorsa con i record (0,1,...) selezionati in caso di successo, FALSE in caso di fallimento
      TRUE (successo) o FALSE (fallimento) per le altre query
      https://www.php.net/manual/en/mysqli-stmt.get-result.php
       
       
       
       

×
×
  • Create New...

Important Information

Terms of Use Privacy Policy Guidelines We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.