Jump to content

Search the Community

Showing results for tags 'Windows'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Argomenti
    • Windows 10 News
    • Guide e Tutorial
    • Hardware
    • Software
    • Internet
    • Telefonia
    • Videogiochi
    • Deep Web
    • Hacking
    • Cracking

Blogs

  • Guadagnare Online
  • SEO e SEM
  • Trading e Investimenti

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


About Me

Found 13 results

  1. 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!
  2. I Nintendo Switch è l'ultima console portatile (e desktop) rilasciata da Nintendo. Questa console ha visto la luce nel marzo 2017 e, fino ad oggi, è una delle console di maggior successo dell'azienda. A causa di una serie di violazioni della sicurezza, la console Nintendo ha rilasciato i segreti meglio custoditi dell'azienda, che, oltre a stimolare la creazione di Firmware personalizzato , ha anche aperto la porta per Cambia emulatori. E, inoltre, con una prestazione molto buona nonostante siano progetti relativamente recenti. Requisiti per poter emulare lo Switch Emulare una console di nuova generazione non è semplice come emulare, ad esempio, un NES o una Play Station 1. Per questo, oltre a un buon emulatore, avremo bisogno di un computer più o meno potente in grado di emulazione hardware e consolle BIOS essere in grado di elaborare il gioco a un livello FPS accettabile. Per giocare più o meno bene si consiglia di avere una 6a generazione Intel Processore Core i3, o più moderno (o il suo equivalente Ryzen 3 da AMD) insieme a 8 GB di RAM per poter caricare il gioco senza problemi. Inoltre, si consiglia anche di avere un file NVIDIA Scheda grafica GTX 1060 o una Radeon RX 470, oltre a 16 GB di RAM, per una migliore esperienza. Certo, anche se eseguiremo i giochi in formato digitale, è necessario averlo precedentemente acquistati il gioco in forma fisica per evitare di incorrere in un problema di pirateria. Yuzu, l'emulatore Switch più avanzato Yuzu è uno dei primi emulatori Switch a vedere la luce del giorno. Questo emulatore completamente gratuito e open source proviene dai creatori di Citra, uno dei più popolari emulatori 3DS. Questo emulatore è scritto in C ++ ed emula i componenti hardware essenziali di Nintendo Switch per funzionare. Questo è uno dei motivi per cui alcuni giochi non funzionano e le prestazioni potrebbero lasciare un po 'a desiderare in determinati titoli. È possibile controllare l'elenco di compatibilità di questo emulatore su seguente link . Come vediamo, i suoi sviluppatori hanno lavorato soprattutto per ottimizzare l'emulatore per giocare ai giochi più popolari. Breath of the Wild e Link's Awakening, ad esempio, sono giochi che possono essere giocati in modo accettabile con questo emulatore. L'intera serie Pokemon offre anche buone prestazioni, oltre a Mario Maker 2 e Odyssey. Sfortunatamente, ci sono ancora molti giochi che non funzionano correttamente. Siamo in grado di scaricare l'ultima versione di questo emulatore completamente gratuitamente dal seguente link . Possiamo usare questo emulatore senza problemi e con la stessa compatibilità, sia in formato Windows e Linux. Per poter utilizzare questo emulatore abbiamo bisogno, da un lato, di un dump della console NAND (dato che questo emulatore caricherà il sistema completo dello Switch) e dall'altro dei Keys. Se abbiamo uno Switch vulnerabile, sarà facile farlo. Tuttavia, se non lo abbiamo, dovremo cercare bene in Internet per trovarlo. Ryujinx, un'alternativa più semplice ma funzionale Un altro progetto simile che cerca di portare il passaggio agli utenti di Windows 10 è Ryujinx. Questo emulatore per Nintendo Switch è anche completamente gratuito e open source ed è scritto in C #. Il suo sviluppo si basa sull'offrire le migliori prestazioni di gioco possibili, un'emulazione precisa e, inoltre, semplice da usare. L'elenco di compatibilità può essere consultato all'indirizzo seguente link . La compatibilità con i giochi commerciali è molto inferiore a quella che possiamo trovare a Yuzu. Tuttavia, è vero che questo emulatore ti consente di emulare l'homebrew in un modo molto più preciso, oltre ai giochi operativi che la sua alternativa non emula correttamente, come Animal Crossing New Horizons o Mario Kart. Siamo in grado di scaricare l'ultima build di questo emulatore Nintendo Switch dal seguente link . Mentre Yuzu potrebbe essere utilizzato su Windows e Linux, Ryujinx è anche compilato per macOS. Questo emulatore è più semplice poiché richiede solo l'uso dei TASTI di una console originale (sono facilmente reperibili su Internet) e non richiede un dump completo della NAND come Yuzu. Invece, questa facilità si traduce in una perdita di funzioni e in una peggiore compatibilità. Cemu, l'emulatore di WiiU per eccellenza Cemu non è esattamente un emulatore di Nintendo Switch, ma è uno dei migliori emulatori di WiiU, il suo predecessore. Tuttavia, poiché Nintendo ha pubblicato molti giochi per Switch e WiiU, in particolare nei primi mesi di vita della sua nuova console (come Zelda BotW o Mario Kart 8), Cemu è diventata una delle migliori alternative per giocare ad alcuni giochi di Switch ( ovviamente pubblicato per WiiU) sul computer. Sebbene possa essere complicato da configurare e consuma una grande quantità di risorse, Cemu ci consente di giocare praticamente a qualsiasi gioco WiiU sul computer con prestazioni eccellenti. Ma, ripetiamo, non supporta i giochi Switch esclusivi, ma ti consente di emulare le loro versioni portate su WiiU. Possiamo scaricare Cemu dal seguente link .
  3. 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
  4. 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");
  5. 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; }
  6. 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}}
  7. Volete provare applicazioni e fare modifiche al sistema operativo in sicurezza? Ecco come farlo con Windows Sandbox su Windows 10 Windows Sandbox è una nuova funzione di Windows 10 disponibile dalla versione 19H1 in poi che permette di avere un ambiente desktop virtualizzato, protetto e temporaneo per testare una situazione pericolosa come app con virus o altro. Una funzionalità davvero utilissimo per chi non vuole modificare o mettere a rischio il suo PC ma deve testare alcune applicazioni. Cos’è Windows Sandbox? Windows Sandbox permetterà di installare un programma in tutta sicurezza e capire se è un virus o meno oppure aprire un qualsiasi file per capire se nasconde altro dietro, il tutto in un ambiente protetto che alla chiusura della finestra scomparirà definitivamente. In questo articolo andremo a vedere come attivarlo su Windows 10 facilmente. Windows Sandbox è sicuro? Windows Sandbox è una parte di Windows che è integrato in Windows 10 Pro e Enterprise, ad ogni partirete con una installazione pulita di Windows 10 e nessun dato verrà memorizzato. Inoltre è tutto svolto in sicurezza grazie alla virtualizzazione sull’hardware che isola il kernel ed inoltre ha una gestione intelligente dei CPU e memoria. Requisiti minimi per far funzionare Windows Sandbox Aver installato Windows 10 19H1 Pro o Enterprise Build 18305 o superiore; Processore a 64-Bit; Funzionalità virtualizzazione abilitata nel BIOS; Almeno 4 GB di RAM; Almeno 1 GB di spazio libero; Almeno CPU Dual Core. Come attivare Windows Sandbox Digitate nel box di ricerca in basso dove c’è la lente di ingrandimento Attiva o disattiva funzionalità di Windows oppure potete accedere da Pannello di controllo -> Programmi -> Attiva o disattiva funzionalità di Windows; Seleziona la voce Windows Sandbox mettendo un check (V) sul quadratino bianco e cliccate su OK in basso. Dopo una breve verifica iniziale verranno applicate le modifiche e quindi installato Windows Sandbox sul vostro Windows 10. Per avviarlo dovete digitare nel box di ricerca Windows Sandbox e cliccare sul pulsante Apri quando caricherà l’applicazione. Una volta avviato si caricherà una versione pulita di Windows 10 per poter fare tutti i test che volete.
  8. Ormai la pubblicità è praticamente ovunque sul web. Basta aprire un sito e si viene inondati di tantissimi banner pubblicitari. Questi banner sono però fondamentali, poiché permettono alle pagine web di di offrire le informazioni in modo gratuito. A causa di tutta questa pubblicità sono nati gli Ad Blocker, ovvero delle estensioni browser che bloccano la pubblicità. A quanto pare però, alcune di queste estensioni non sono più affidabili. Di recente, il creatore dell'estensione nanodefender ha venduto tutto il suo lavoro ad un gruppo di sviluppatori turchi, che potrebbero raccogliere dati per scopi non precisi. Si era notato come i dati venissero dirottati chissà dove, ed infatti l'estensione è stata segnalata come malware dallo sviluppatore originale. Ora che l'estensione è stata segnalata, Chrome la eliminerà in automatico, ma questo non accade su Edge, comunque basato su Chromium. Per quanto riguarda Mozilla Firefox, sembra che nanodefender sia nelle mani di un altro sviluppatore. Esiste anche un'alternativa ai normali Ad Blocker: infatti, utilizzando un Raspberry Pi, potreste creare un Pi-hole, un progetto di libero accesso definito come "il buco nero per gli annunci su Internet", in quanto riesce ad eliminare tutta la pubblicità prima che raggiunga i dispositivi.
  9. PassFab 4WinKey permette di recuperare o sbloccare se non ricordate la password di Windows 10. Ecco come funziona facile veloce e gratis Quante volte vi sarà capitato di non ricordare la password per sbloccare il tuo PC con Windows e dopo diversi tentativi fatti a vuoto se proprio non la ricordate, dovete procedere al recupero della stessa. Non è facile, in molti casi la soluzione è estrema e formattare il PC ma con il nostro consiglio procederete al recupero della password in pochi click. Non esistono metodi alternativi per aggirare la password di blocco di Windows ma oggi voglio aiutarvi e presentarvi un fantastico software, PassFab 4WinKey, che permette di sbloccare il PC e cambiare la password dimenticata di Windows. Un programmino utilissimo che dovete installare sul vostro dispositivo per recuperarlo se non ricordate la password. Con questo fantastico e potente software, potrete rimuovere la password di Windows, sia dell’utenza di amministrazione, di dominio o di un utente locale, ma potrai anche reimpostare la password, eliminare un account ed anche crearlo. Sono diverse le funzionalità incluse nell’applicazione e sebbene sia a pagamento, sono tutti soldi ben spesi se dovete per forza accedere al vostro PC. Recuperare password Windows dimenticata Ovviamente il primo passo è scaricare e installare PassFab 4WinKey poi una volta avviato dovrete creare il supporto contenente una versione avviabile dell’applicazione che permetterà di avviare il PC direttamente da CD/DVD o la chiavetta USB inserita nel PC. Con questo applicativo dovrete seguire questi semplici passaggi per sbloccare Windows: Creare un disco di avvio su un CD, DVD o chiavetta USB. Avviare il PC con il disco appena creato. Aprire l’app e rimuovete, reimpostate o eliminate la password di accesso a Windows. Download PassFab 4WinKey PassFab 4WinKey è un programma molto potente quando non riuscite più ad accedere a Windows e non ricordate più la password. Grazie alla procedura guidata sicuramente otterrete il risultato in pochi click. PassFab 4WinKey è disponibile per Windows e Mac in versione di prova gratuita e prezzi da appena 19 euro per la versione Standard.
  10. Telegram è una delle app di messaggistica istantanea disponibile gratuitamente per Android e per iOS e utilizzabile anche su PC tramite client dedicato. Nel corso del tempo, ha introdotto funzionalità innovative, mantenendo sempre un elevato livello di sicurezza e affidabilità. E’ possibile seguire gruppi dedicati ad argomenti o interessi specifici, effettuare chiamate vocali criptate, scambiarsi file di ogni tipo ed ha persino una criptovaluta dedicata chiamata GRAM. Non per nulla, rappresenta una delle più valide alternative a WhatsApp. Uno dei segreti del grande successo di Telegram, è rappresentato dai “BOT”. Scopri in questa guida cosa sono i bot, i migliori Bot Telegram disponibili al momento, come installarli e come trovare nuovi bot. Cosa sono i Bot Telegram I bot su Telegram sono piccoli programmi automatizzati in grado di svolgere determinati compiti previo l’inserimento di una riga di comando; alcuni rappresentano di fatto, per complessità e features, delle vere e proprio nuove App. Si presentano come delle chat in cui attivare le funzionalità del Bot; una volta attivate queste funzionalità, sarà possibile utilizzare il campo di testo (dove di solito scriviamo messaggi) per richiamare le funzioni del bot (di solito con un “/” come simbolo a precedere il comando da lanciare). Oltre alla digitazione manuale del comando è possibile usare un piccolo pulsante con il riassunto dei comandi disponibili. I bot Telegram possono essere utilizzati sia nella loro chat specifica e sia integrati all’interno dei gruppi o dei “super-gruppi”, così da automatizzare alcuni processi (come i ban degli utenti che non rispettano le regole) o per ottenere nuove features durante una normale chat con amici / conoscenti. E’ una funzionalità che rende Telegram unico tra le applicazioni di messaggistica. Come aggiungere/rimuovere un Bot Telegram Aggiungere un bot L’aggiunta di un bot è un’operazione semplice: individua il bot che vuoi aggiungere tra quelli consigliati nei paragrafi successivi o ricercati nella barra di ricerca offerta da Telegram (basterà cliccare o effettuare un tap). Una volta aperta la pagina di chat del bot, sarà sufficiente premere all’interno della chat stessa “Avvia” per iniziare. Una volta avviato sarà sufficiente seguire i suggerimenti offerti dal bot stesso riguardo il suo utilizzo o richiamare i comandi supportati premendo sul tasto dei comandi, come visibile nell’immagine in basso. Rimuovere un bot Se non sei più interessato a tenere un bot dovrai prima stopparlo e poi cancellare la chat di riferimento; cancellare semplicemente la chat non fermerà il bot che potrebbe comunque avere accesso alle informazioni del tuo profilo (spesso necessarie per l’utilizzo dello stesso). Per poter rimuovere correttamente un bot è sufficiente aprire la chat del bot, fare clic sui puntini in alto a sinistra e fare clic su “Arresta e blocca bot”, poi su “Elimina chat”. Ora il bot non sarà più attivo sul tuo profilo e la chat del bot sarà correttamente eliminata. Il bot è ancora raggiungibile ma andrà sbloccato prima di poterlo utilizzare di nuovo. Come trovare nuovi bot per telegram Quelli che ti ho mostrato sopra sono solo alcuni dei bot che puoi aggiungere a Telegram! Per trovarne di nuovi, puoi utilizzare un bot dedicato alla ricerca dei bot accettati da Telegram; ti basterà aggiungerlo cliccando sul tasto qui in basso. LINK | TelegramStoreBot Se invece vuoi effettuare una ricerca da browser Web sarà sufficiente visitare al seguente pagina web (indirizzo non ufficiale). LINK | TelegramItaliaBot Un nuovo store dove molto fortnito di bot da vedere direttamente sul web e possibile aggiungerle direttamente da browser tramite telegram web. LINK | StoreBot LINK | BotoStore Se invece vuoi cercare nuovi bot da smartphone o da tablet basterà aprire l’app di Telegram e utilizzare la barra di ricerca attivabile premendo sul tasto a forma di lente d’ingrandimento in alto a sinistra. Ora digita il nome del bot che intendi aggiungere e segui la procedura descritta in questa guida per iniziare ad utilizzarlo. Vai alla SCHEDA del guida
  11. Telegram è una delle app di messaggistica istantanea disponibile gratuitamente per Android e per iOS e utilizzabile anche su PC tramite client dedicato. Nel corso del tempo, ha introdotto funzionalità innovative, mantenendo sempre un elevato livello di sicurezza e affidabilità. E’ possibile seguire gruppi dedicati ad argomenti o interessi specifici, effettuare chiamate vocali criptate, scambiarsi file di ogni tipo ed ha persino una criptovaluta dedicata chiamata GRAM. Non per nulla, rappresenta una delle più valide alternative a WhatsApp. Uno dei segreti del grande successo di Telegram, è rappresentato dai “BOT”. Scopri in questa guida cosa sono i bot, i migliori Bot Telegram disponibili al momento, come installarli e come trovare nuovi bot. Cosa sono i Bot Telegram I bot su Telegram sono piccoli programmi automatizzati in grado di svolgere determinati compiti previo l’inserimento di una riga di comando; alcuni rappresentano di fatto, per complessità e features, delle vere e proprio nuove App. Si presentano come delle chat in cui attivare le funzionalità del Bot; una volta attivate queste funzionalità, sarà possibile utilizzare il campo di testo (dove di solito scriviamo messaggi) per richiamare le funzioni del bot (di solito con un “/” come simbolo a precedere il comando da lanciare). Oltre alla digitazione manuale del comando è possibile usare un piccolo pulsante con il riassunto dei comandi disponibili. I bot Telegram possono essere utilizzati sia nella loro chat specifica e sia integrati all’interno dei gruppi o dei “super-gruppi”, così da automatizzare alcuni processi (come i ban degli utenti che non rispettano le regole) o per ottenere nuove features durante una normale chat con amici / conoscenti. E’ una funzionalità che rende Telegram unico tra le applicazioni di messaggistica. Come aggiungere/rimuovere un Bot Telegram Aggiungere un bot L’aggiunta di un bot è un’operazione semplice: individua il bot che vuoi aggiungere tra quelli consigliati nei paragrafi successivi o ricercati nella barra di ricerca offerta da Telegram (basterà cliccare o effettuare un tap). Una volta aperta la pagina di chat del bot, sarà sufficiente premere all’interno della chat stessa “Avvia” per iniziare. Una volta avviato sarà sufficiente seguire i suggerimenti offerti dal bot stesso riguardo il suo utilizzo o richiamare i comandi supportati premendo sul tasto dei comandi, come visibile nell’immagine in basso. Rimuovere un bot Se non sei più interessato a tenere un bot dovrai prima stopparlo e poi cancellare la chat di riferimento; cancellare semplicemente la chat non fermerà il bot che potrebbe comunque avere accesso alle informazioni del tuo profilo (spesso necessarie per l’utilizzo dello stesso). Per poter rimuovere correttamente un bot è sufficiente aprire la chat del bot, fare clic sui puntini in alto a sinistra e fare clic su “Arresta e blocca bot”, poi su “Elimina chat”. Ora il bot non sarà più attivo sul tuo profilo e la chat del bot sarà correttamente eliminata. Il bot è ancora raggiungibile ma andrà sbloccato prima di poterlo utilizzare di nuovo. Come trovare nuovi bot per telegram Quelli che ti ho mostrato sopra sono solo alcuni dei bot che puoi aggiungere a Telegram! Per trovarne di nuovi, puoi utilizzare un bot dedicato alla ricerca dei bot accettati da Telegram; ti basterà aggiungerlo cliccando sul tasto qui in basso. LINK | TelegramStoreBot Se invece vuoi effettuare una ricerca da browser Web sarà sufficiente visitare al seguente pagina web (indirizzo non ufficiale). LINK | TelegramItaliaBot Un nuovo store dove molto fortnito di bot da vedere direttamente sul web e possibile aggiungerle direttamente da browser tramite telegram web. LINK | StoreBot LINK | BotoStore Se invece vuoi cercare nuovi bot da smartphone o da tablet basterà aprire l’app di Telegram e utilizzare la barra di ricerca attivabile premendo sul tasto a forma di lente d’ingrandimento in alto a sinistra. Ora digita il nome del bot che intendi aggiungere e segui la procedura descritta in questa guida per iniziare ad utilizzarlo.
  12. Facebook si tinge di nero anche nella versione Desktop, rinnovando allo stesso tempo il suo design. La nuova interfaccia utente è simile a quella lanciata lo scorso anno su dispositivi mobile e include ovviamente il tema scuro. Come attivare il nuovo Facebook con Tema Scuro Accessibile via browser per la maggior parte degli utenti, il tema scuro è attivabile manualmente, tuttavia alcuni utenti potrebbero non visualizzarlo, in quanto l’aggiornamento è ancora in rollout come si suol dire. Per la prima volta dallo scorso anno Facebook ha attuato importanti modifiche anche nella sua versione Web. L’aggiornamento si concluderà nel corso della primavera, tuttavia se siete fortunati potreste attivare il tema scuro già da oggi. Facebook fa sapere che la nuova versione è più semplice, immediata, intuitiva e minimale, in quanto rivede lo spazio a disposizione e la disposizione dei contenuti, i colori ed altro ancora. Nel corso dei prossimi mesi l’interfaccia verrà attivata come default a tutti gli utenti. Per provarla in Anteprima vi basterà cliccare su Passa al Nuovo Facebook, situato in basso a destra. Per quanto riguarda invece il Tema Scuro non dovete far altro che cliccare sulla freccia rivolta verso il basso, collocata in alto a destra e poi su Modalità Scura. Come anticipato se non è presente la nuova interfaccia o il Tema Scuro non vi resta che attendere, in quanto potrebbero volerci diversi giorni. Su Mobile invece è già disponibile da tempo il Tema Scuro così come la nuova interfaccia, qualora non notiate cambiamenti vi consigliamo di provare la versione Lite del Social Network. Vai alla SCHEDA del guida
  13. Facebook si tinge di nero anche nella versione Desktop, rinnovando allo stesso tempo il suo design. La nuova interfaccia utente è simile a quella lanciata lo scorso anno su dispositivi mobile e include ovviamente il tema scuro. Come attivare il nuovo Facebook con Tema Scuro Accessibile via browser per la maggior parte degli utenti, il tema scuro è attivabile manualmente, tuttavia alcuni utenti potrebbero non visualizzarlo, in quanto l’aggiornamento è ancora in rollout come si suol dire. Per la prima volta dallo scorso anno Facebook ha attuato importanti modifiche anche nella sua versione Web. L’aggiornamento si concluderà nel corso della primavera, tuttavia se siete fortunati potreste attivare il tema scuro già da oggi. Facebook fa sapere che la nuova versione è più semplice, immediata, intuitiva e minimale, in quanto rivede lo spazio a disposizione e la disposizione dei contenuti, i colori ed altro ancora. Nel corso dei prossimi mesi l’interfaccia verrà attivata come default a tutti gli utenti. Per provarla in Anteprima vi basterà cliccare su Passa al Nuovo Facebook, situato in basso a destra. Per quanto riguarda invece il Tema Scuro non dovete far altro che cliccare sulla freccia rivolta verso il basso, collocata in alto a destra e poi su Modalità Scura. Come anticipato se non è presente la nuova interfaccia o il Tema Scuro non vi resta che attendere, in quanto potrebbero volerci diversi giorni. Su Mobile invece è già disponibile da tempo il Tema Scuro così come la nuova interfaccia, qualora non notiate cambiamenti vi consigliamo di provare la versione Lite del Social Network.
×
×
  • 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.