Tag: Mondo codice 🖥

  • Compilatore java online: come funzionano e dove trovarli

    Compilatore java online: come funzionano e dove trovarli

    I compilatori Java online sono strumenti che consentono di scrivere, compilare ed eseguire codice Java direttamente nel browser senza dover installare un ambiente di sviluppo integrato (IDE) sul proprio computer. Funzionano attraverso pagine web che forniscono un’interfaccia utente per scrivere codice sorgente Java, compilare e visualizzare i risultati dell’esecuzione.

    Questi strumenti di solito includono un editor di testo dove puoi digitare il codice Java e un pulsante o un’opzione per compilare ed eseguire il codice. Quando si preme il pulsante di compilazione, il compilatore Java online esegue il processo di compilazione che traduce il codice sorgente Java in bytecode eseguibile dalla JVM (Java Virtual Machine). Successivamente, esegue il programma e mostra l’output.

    Ci sono diverse piattaforme che offrono compilatori Java online, tra cui:

    1. JDoodle: Un popolare compilatore online che supporta vari linguaggi di programmazione, incluso Java, e offre un’interfaccia semplice per scrivere e testare il codice.
    2. Replit: Un ambiente di sviluppo online che permette di scrivere, compilare ed eseguire codice Java e molti altri linguaggi. Richiede registrazione gratuita prima di procedere all’uso.
    3. Ideone: Un sito web che offre la possibilità di scrivere, compilare ed eseguire codice in vari linguaggi, incluso Java.
    4. OneCompiler: lo uso anche a scuola per far vedere come funzionano i programmi, molto semplice e facile da usare, anche se alcune librerie possono non funzionare e l’I/O in genere non permette di inserire dati da tastiera.
    5. OnlineGDB: Offre un compilatore Java online insieme ad un debugger per aiutare nella correzione degli errori nel codice. Uno dei migliori prodotti online per fare questo genere di attività, con maggiore supporto alle varie librerie.
    6. CompileJava.net: Un altro sito che fornisce un compilatore Java online e un ambiente per eseguire il codice Java direttamente nel browser.

    Per utilizzare questi compilatori online, di solito è sufficiente visitare il loro sito web, utilizzare l’editor fornito per scrivere il codice Java e seguire le istruzioni per compilare ed eseguire il programma.

    Ricorda che questi strumenti sono utili per scopi didattici, testing e sperimentazione, ma potrebbero avere limitazioni rispetto agli ambienti di sviluppo integrati più complessi come Eclipse, IntelliJ IDEA o NetBeans in termini di funzionalità avanzate e gestione dei progetti più complessi.

  • PhantomJS : software free per testare le vostre pagine web

    PhantomJS : software free per testare le vostre pagine web

    Consideriamo il seguente scenario: dobbiamo simulare le azioni dell’utente finale sul lavoro web (portale, sito, ecc.) che abbiamo appena terminato, e che dovrà  probabilmente essere ottimizzato. Quello che si fa in ambito professionale, di solito, consiste nell’effettuare test incrociati (cosiddetto cross-browsing) simulando in tal modo la corretta visualizzazione delle pagine. Per farlo in modo massivo, si sfruttano degli appositi software di supporto a questo tipo di analisi.

    Che cos’è un browser headless?

    Un browser headless – letteralmente “senza testa” – è un browser privo di interfaccia grafica: in altri termini, esso permette l’accesso alle pagine web in modo tale da mostrarne le caratteristiche tecniche, e consentire all’analista di ottimizzarne i contenuti. Nella pratica di questo tipo non è altro che un programma che accede alle pagine Web simulando un “utente tipo”, che permette di visualizzare caratteristiche del testo della stessa come ad esempio fondi colori coordinate degli oggetti e così via.

    Nel 2009 Google, sempre attento a questo genere di problemi, aveva posto il problema di rendere scansionabili anche alcuni elementi JS/AJAX delle pagine, cosa che poi sembrerebbe aver superato nel seguito. Quello che si fa in questo tipo di scenari non è altro che utilizzare software che permettano il controllo automatizzato di uno o più modelli di browser, e che fornisce un vantaggio fondamentale visualizzare le pagine nel modo più vicino possibile a come appariranno agli utenti finali.

    Il più grosso problema di software di test di questo tipo è che richiedono un’interfaccia grafica valente nonostante il fatto che si tratti di una soluzione molto utile nella pratica dei test delle ottimizzazioni e così via.
    D’altro canto è possibile utilizzare PhantomJS un piccolo progetto free / open source interamente realizzato in Javascript, che permette di utilizzare istruzioni di questo tipo:

    console.log('Loading a web page');
    var page = require('webpage').create();
    var url = 'http://www.phantomjs.org/';
    page.open(url, function (status) {
      //Page is loaded!
      phantom.exit();
    });
    

    Come descritto nel sito ufficiale, PhantomJS è una soluzione ottimale al fine di effettuare test su contenuti sguardi guarda guarda guarda compresa la possibilità  di generare l’ anteprime delle pagine l'(thumbnail).

  • Come creare un echobot in C++

    Come creare un echobot in C++

    Un echobot è un tipo di chatbot che riflette o “ripete” ciò che gli viene detto senza fornire risposte o informazioni aggiuntive. Funziona essenzialmente come uno specchio: ripete esattamente ciò che l’utente ha detto.

    La sua funzione principale è quella di confermare o ripetere ciò che è stato inserito dall’utente. È un tipo di chatbot molto basilare e semplice, spesso utilizzato come punto di partenza per comprendere i meccanismi di base della costruzione di un chatbot. Generalmente, un echobot può essere costruito in modo rapido e può essere utilizzato per testare la connessione e la logica di base di un sistema di chatbot senza implementare risposte complesse o funzionalità avanzate di elaborazione del linguaggio.

    Ecco un semplice esempio di un echobot in C++ che ripete ciò che l’utente digita:

    #include <iostream>
    #include <string>
    
    int main() {
    std::string input;
    
    std::cout << "Benvenuto! Sono un echobot. Inserisci qualcosa: ";
    std::getline(std::cin, input);
    
    std::cout << "Hai detto: " << input << std::endl;
    
    return 0;
    }

    Questo codice chiede all’utente di inserire un testo e poi stampa esattamente ciò che l’utente ha digitato. È un esempio molto basilare di un echobot in C++. Puoi elaborarlo ulteriormente per aggiungere funzionalità più avanzate, come risposte basate su modelli o analisi del testo inserito.

  • Che cos’è un “plug in” in WordPress (e non solo lì)

    Che cos’è un “plug in” in WordPress (e non solo lì)

    In informatica e nell’ambito della programmazione, “plug-in” è un termine utilizzato per descrivere un componente software aggiuntivo che estende le funzionalità di un’applicazione esistente. Questi componenti possono essere aggiunti o “inseriti” (da qui il termine “plug-in”, che deriva dal verbo “to plug in”, ovvero “inserire”) nell’applicazione principale per fornire specifiche capacità o caratteristiche supplementari. I plug-in sono progettati per lavorare in sinergia con il software preesistente, consentendo agli utenti di personalizzare o estendere le funzionalità dell’applicazione base senza dover modificare direttamente il codice sorgente di quest’ultima.

    Ecco alcuni esempi di applicazioni che possono sfruttare i plug-in:

    • Nel browser web: I plug-in come Adobe Flash Player o estensioni come ad blocker sono esempi comuni di add-on che estendono le funzionalità del browser.
    • Software di editing multimediale: Programmi come Adobe Photoshop possono supportare plug-in che aggiungono filtri, effetti o strumenti di editing specifici.
    • Applicazioni di produttività: Strumenti come Microsoft Word o Excel possono integrare plug-in per aggiungere funzionalità di terze parti come correzione ortografica avanzata, integrazione con servizi esterni, ecc.

    I plug-in offrono un modo flessibile per personalizzare l’esperienza utente e adattare le funzionalità del software alle esigenze specifiche degli utenti, senza richiedere la modifica del codice sorgente principale dell’applicazione.

    Plugin in WordPress

    I plugin di WordPress sono strumenti aggiuntivi che estendono e arricchiscono le funzionalità di un sito web basato su WordPress. Sono uno dei principali punti di forza di WordPress, consentendo agli utenti di personalizzare e ampliare le capacità del loro sito senza dover scrivere codice da zero.

    Cosa Possono Fare i Plugin di WordPress:

    1. Aggiungere Funzionalità: I plugin possono aggiungere funzionalità come gallerie fotografiche, moduli di contatto, integrazioni con social media, ecc.
    2. Ottimizzare le Prestazioni: Alcuni plugin sono progettati per ottimizzare la velocità del sito, la gestione della cache, la compressione delle immagini, ecc.
    3. Migliorare la Sicurezza: Esistono plugin specifici per la sicurezza che proteggono il sito da attacchi informatici, eseguono scansioni di sicurezza, ecc.
    4. SEO (Search Engine Optimization): Plugin che aiutano a migliorare la visibilità del sito sui motori di ricerca, ottimizzando i contenuti, le meta description, ecc.

    Come Funzionano:

    1. Installazione e Attivazione: Gli utenti possono cercare e installare i plugin direttamente dall’interfaccia di amministrazione di WordPress. Dopo l’installazione, è necessario attivare il plugin per abilitare le sue funzionalità.
    2. Personalizzazione e Configurazione: La maggior parte dei plugin offre opzioni di configurazione per adattarsi alle esigenze specifiche del sito. Queste impostazioni possono essere accessibili tramite l’interfaccia di amministrazione.
    3. Aggiornamenti e Gestione: I plugin vengono regolarmente aggiornati per correzioni di bug, miglioramenti delle funzionalità o per mantenere la compatibilità con le versioni più recenti di WordPress. Gli utenti devono gestire gli aggiornamenti dei plugin per garantire il corretto funzionamento del sito.

    Considerazioni:

    • Sicurezza: Non tutti i plugin sono sicuri. Alcuni potrebbero contenere vulnerabilità. È importante installare plugin da fonti affidabili e mantenerli aggiornati.
    • Compatibilità: L’uso di molti plugin contemporaneamente potrebbe causare conflitti o problemi di prestazioni. È importante selezionare plugin di qualità e verificare la compatibilità con la versione di WordPress in uso.

    I plugin di WordPress offrono un’enorme flessibilità per personalizzare un sito senza dover scrivere codice da zero, consentendo agli utenti di creare esperienze web uniche e funzionali. Tuttavia, è importante fare attenzione alla qualità, alla sicurezza e alla gestione dei plugin per garantire un’esperienza positiva agli utenti del sito.

    Programmare un plugin base in WP

    Un plugin WordPress può essere abbastanza semplice, anche con un singolo file PHP. Ecco un esempio di un plugin elementare che aggiunge una nuova funzionalità di “saluto” alla parte superiore di ogni post sul tuo sito WordPress:

    <?php
    /*
    Plugin Name: Saluto in alto
    Description: Aggiunge un saluto in alto a ogni post.
    */
    
    // Funzione per mostrare il saluto
    function saluto_in_alto($content) {
    // Aggiunge il saluto sopra al contenuto del post
    $saluto = '<div style="background-color: #f5f5f5; padding: 10px;">Ciao! Questo è il mio saluto personalizzato.</div>';
    return $saluto . $content;
    }
    
    // Aggiunge la funzione al filtro the_content
    add_filter('the_content', 'saluto_in_alto');

    Salva questo codice in un file con estensione .php (ad esempio saluto-in-alto-plugin.php). Quindi, carica questo file nella directory wp-content/plugins/ della tua installazione WordPress. La procedura è consigliata solo sui siti in sviluppo, non su quelli in produzione o online.

    Dopo aver caricato il file, vai alla sezione “Plugin” nel tuo pannello di amministrazione di WordPress. Dovresti vedere il nuovo plugin elencato come “Saluto in alto”. Attiva il plugin e visita un post sul tuo sito WordPress. Ora dovresti vedere il saluto personalizzato sopra il contenuto di ogni post.

    Questo è un esempio estremamente basilare di come creare un plugin WordPress con un singolo file PHP. I plugin possono fare molto di più e possono essere più complessi, ma questo esempio mostra come è possibile aggiungere una nuova funzionalità al tuo sito WordPress con un plugin semplice.

    Plugin in Python

    Un plugin molto semplice in Python può essere implementato utilizzando le funzioni e le capacità di importazione dinamica del linguaggio. Ecco un esempio di come creare un plugin elementare:

    Immagina di avere un file chiamato plugin.py che contiene una funzione molto basilare:

    # plugin.py
    
    def hello_plugin():
    print("Ciao dal plugin!")

    Ora, nel tuo programma principale, puoi importare e utilizzare questa funzione come un plugin:

    # Programma principale
    
    # Importa la funzione dal plugin
    from plugin import hello_plugin
    
    # Utilizza la funzione del plugin
    hello_plugin()

    Questa è un’implementazione estremamente semplice di un plugin in Python. Il file plugin.py contiene una funzione hello_plugin() che viene importata e utilizzata nel programma principale.

    In un contesto più ampio, i plugin possono essere più complessi e potrebbero coinvolgere interazioni più sofisticate tra il programma principale e i moduli aggiuntivi. Tuttavia, questo esempio fornisce una base semplice per comprendere come implementare e utilizzare un plugin in Python. Foto di Peggy und Marco Lachmann-Anke da Pixabay

  • CommonCrawl: un web crawler open source e gratuito

    CommonCrawl: un web crawler open source e gratuito

    Cos’è Common Crawl

    Common Crawl è un’organizzazione no-profit che fornisce un repository gratuito e aperto di dati di “web crawl”. Il suo obiettivo è promuovere l’accesso universale alle informazioni e aiutare ricercatori, sviluppatori e appassionati di dati ad analizzare e studiare la vasta quantità di dati disponibili su Internet. È importante premettere che, sebbene Common Crawl fornisca dati preziosi e pubblicamente accessibili, possono esserci considerazioni legali ed etiche nell’uso di dati di “web crawl”. Gli utenti dovrebbero esaminare e conformarsi alle leggi e ai regolamenti pertinenti che governano l’uso dei dati e rispettare i termini e le condizioni della politica di utilizzo dei dati di Common Crawl. E come sempre, in questi casi, non c’è una risposta univoca a tutti i possibili interrogativi.

    Common Crawl fornisce un indice di ricerca, che puoi utilizzare per cercare determinati URL nei loro dati di “web crawl”. Ciascun risultato di ricerca contiene un collegamento e un offset in byte per una posizione specifica nei loro bucket AWS S3 per scaricare la pagina.

    Cos’è un crawler

    Un “crawler” (detto anche “web crawler” o “spider”) è un programma automatizzato che esegue il processo di “web crawling” o “crawling del web”. È un componente fondamentale dei motori di ricerca e di altre applicazioni che desiderano raccogliere dati da Internet.

    La funzione principale di un crawler è quella di navigare in modo sistematico attraverso la vasta rete di pagine web presenti su Internet. L’obiettivo è individuare, recuperare e indicizzare il contenuto delle pagine per consentirne la successiva ricerca e reperibilità tramite un motore di ricerca o altre applicazioni.

    Ecco come funziona generalmente un “crawler”:

    1. Inizio del Crawling: Il crawler inizia visitando una o più pagine web di partenza, solitamente dette “seed URLs”. Queste possono essere fornite manualmente o possono essere predefinite all’interno del programma del crawler.
    2. Recupero delle Pagine: Una volta raggiunta una pagina web, il crawler analizza il contenuto della pagina e individua gli eventuali link presenti. Il crawler aggiunge questi nuovi URL a una coda di URL da visitare successivamente.
    3. Navigazione dei Link: Il crawler preleva gli URL dalla coda uno per uno e visita le pagine corrispondenti. Prosegue in questo modo attraverso un processo iterativo, visitando le pagine collegate e continuando a recuperare nuovi link da seguire.
    4. Archiviazione dei Dati: Durante il processo di crawling, il crawler può scaricare il contenuto delle pagine visitate, inclusi testi, immagini, video e altri media. Questi dati possono essere archiviati localmente o in un database per un’ulteriore elaborazione.
    5. Indicizzazione: Dopo aver raccolto i dati, il crawler può passare le informazioni a un motore di indicizzazione che analizza il contenuto delle pagine e le aggiunge all’indice di ricerca del motore di ricerca. L’indice è ciò che consente al motore di ricerca di fornire risultati rapidi e pertinenti quando gli utenti eseguono una ricerca.

    Il processo di crawling può essere continuo o periodico, a seconda delle esigenze dell’applicazione o del motore di ricerca. Molti tool SEO si basano, di fatto, su crawler autogestiti e a sorgente chiuso, che vengono poi usati per generare e calcolare indici SEO, prestazioni, chiavi più popolari e via dicendo. Gli “spider” dei motori di ricerca, ad esempio, operano costantemente per mantenere l’indice aggiornato con le nuove pagine e i contenuti pubblicati sul web. Sembra facile realizzarne uno “a mano”, ma la pratica di programmazione dimostra che non è così.

    Come funziona Common Crawl

    In questi casi la chiave è fare uso di software ad alto livello che prevedano soluzioni avanzate per il software, ed evitino al programmatore di dover reinventare la ruota. Ecco alcuni punti chiave del funzionamento di questo software:

    1. Web Crawler: Common Crawl opera dei “web crawler” che attraversano Internet e raccolgono sistematicamente dati da vari siti web. Questi crawler utilizzano un processo chiamato web scraping per scaricare pagine web, immagini, video e altri contenuti disponibili pubblicamente sul web.
    2. Accesso Aperto ai Dati: Uno dei principali obiettivi di Common Crawl è rendere i dati raccolti liberamente accessibili a chiunque. Forniscono l’accesso ai loro dati di “web crawl” gratuitamente e mantengono un approccio trasparente e collaborativo alla condivisione dei dati.
    3. Formato dei Dati: I dati forniti da Common Crawl sono generalmente memorizzati nel formato WARC (Web ARChive). Questo formato è specificamente progettato per archiviare contenuti web e include sia l’HTML grezzo delle pagine web sia metadati aggiuntivi.
    4. Casi d’Uso: Ricercatori, scienziati dei dati, sviluppatori e aziende utilizzano i dati di Common Crawl per una vasta gamma di scopi, come la ricerca web, l’addestramento di modelli di apprendimento automatico, l’analisi di tendenze, il monitoraggio delle modifiche ai siti web e altro ancora.
    5. Sfide e Competizioni: Common Crawl organizza regolarmente sfide e competizioni per incoraggiare utilizzi innovativi dei loro dati di “web crawl”. Queste sfide spesso si concentrano su specifici ambiti come l’elaborazione del linguaggio naturale, l’analisi delle immagini o il recupero delle informazioni.
    6. Aggiornamenti dei Dati: Common Crawl esegue continuamente “crawling” del web e nuovi set di dati vengono resi disponibili regolarmente. La frequenza degli aggiornamenti dipende dalle risorse disponibili e dal volume di nuovi dati presenti sul web.
    7. Rispetto delle Politiche dei Siti Web: Common Crawl rispetta le regole “robots.txt” specificate dai siti web, che vengono utilizzate per governare l’accesso dei “web crawler” ai loro contenuti. Rispettano le politiche impostate dai proprietari dei siti web e non effettuano il “crawling” di pagine esplicitamente vietate da queste regole.

    CommonCrawl in Python (how-to)

    Esiste un client per usare CommonCrawl in Python che permette di prelevare una o più pagine HTML allo scopo di renderle trattabili e indicizzabili. Prima di tutto dovete installarlo da linea di comando:

    pip3 install comcrawl

    poi basta scrivere codice con questo template:

    from comcrawl import IndexClient
    
    client = IndexClient()
    
    client.search("eccocome.it*")
    client.download()
    
    first_page_html = client.results[0]["html"]
    print (first_page_html)
    

    Molto semplice alla fine, come sintassi: in pratica abbiamo creato un IndexClient, lo abbiamo fato puntare ad un URI specifico (il nostro blog, per inciso), il client si occuperà trasparentemente di scaricare le pagine e poi di mostrarci il primo risultato che ha trovato. La prima volta che lo lanciate, impiegherà naturalmente un po’ di tempo a finire l’esecuzione, e farà riferimento ai dati HTML che sono copiati nel dataset di Common Crawl.

    Fate attenzione che parliamo quasi sempre di quantità di dati molto grandi, per cui sarà necessario filtrare le pagine adeguatamente per evitare che la dimensione esploda, e questo si presta alla creazione autonoma di tool SEO, di copie dei contenuti da scaricare in locale e via dicendo. La libreria comcrawl di Python supporta, per inciso, multi-thread e log, ed è naturalmente soggetta alle condizioni d’uso di Common Crawl. Non è richiesto l’uso di API specifiche, ad oggi, per fare uso del software.

    Le prima volte conviene testarlo su siti web molto piccoli, in modo da valutarne efficacia e funzionamento.

    Per saperne di più

    Un ottimo tutorial in italiano che spiega come impostare un bucket su Amazon S3 per Common Crawl è riportato di seguito (grazie a rev3rse security). Viene anche spiegato come cercare siti WordPress esposti su internet, quindi non necessariamente indicizzati dai motori, che siano rimasti online, sfruttando i vari Terabyte di dati che sono messi a disposizione da Common Crawl con una semplice query SQL, tra le altre cose.

  • Accorciare i titoli in WordPress: i principali due modi per realizzarli

    Accorciare i titoli in WordPress: i principali due modi per realizzarli

    La necessità  di accorciare i titoli in WordPress deriva, il più delle volte, da un’esigenza di carattere pratico: un titolo troppo lungo è infatti a volte incompatibile con le proporzioni o il layout del tema che stiamo usando, per cui ne risulterebbe penalizzato, poco gradevole all’occhio e poco comprensibile per l’utente. Accorciare i titoli in WordPress è un tipo di operazione che possiamo effettuare in vari modi, e vedremo nella pratica come fare attraverso esempi pratici.

    La prima cosa che faremo è quella di creare una funzione per accorciare il titolo, che potremo sia richiamare come hook / action sia utilizzare direttamente all’interno delle nostre personalizzazioni.

    Per poter funzionare correttamente, la funzione in questione andrà  inserita, di norma, in uno dei seguenti tre luoghi:

    1. in un plugin personalizzato creato apposta, che ad esempio potrebbe contenere tutte queste funzioni extra che vogliamo prevedere;
    2. in un mu-plugin, con un principio analogo;
    3. nel file functions.php, solo che in questo caso l’implementazione rimarrà  legata al theme (se cambiamo theme, non ci ritroveremo più il codice della funzione).

    Prima tecnica: accorcia il titolo per numero di caratteri

    Ecco l’intestazione:

    function shorted_trovalost( $t, $l=30 ){ ... }

    La funzione completa, che prende come argomento $t (che è la variabile che contiene il titolo) e $l che è la lunghezza massima, in questa sede è la prima che andremo a considerare, taglia il titolo sulla base del numero di caratteri massimi ($l, nell’esempio, per lasciare il tutto parametrico con 30 come valore di default).

    Ed eccovi l’esempio:

    function shorted_trovalost( $t, $l ){
    if ( strlen( $t ) > 30 ) { //Character length
    $title_short = substr( $t, 0, 30); // Character length
    preg_match('/^(.*)\s/s', $title_short, $matches);
    if ($matches[1])
    $title_short = $matches[1];
    $title_short = $title_short.' ...';
    } else {
    $title_short = $t;
    }
    return $title_short;
    }
    

    Possiamo richiamare una funzione così in questo modo:

    $titolo_corto = shorted_rovalost( get_the_title(), 15 );
    

    che in pratica assegna alla variabile $titolo_corto il valore del title corrente, accorciato di 15 caratteri; attenzione che in questo contesto sto facendo l’ipotesi che ci troviamo in un punto del file single.php e comunque all’interno del loop. Per fare in modo di ricavare il title corrente fuori dal loop, in caso, bisogna sfruttare una variabile globale, ad esempio:

    global $post;
    $post_id =$post->ID;
    $titolo = get_the_title($post_id);
    $titolo_corto = shorted_rovalost( $titolo, 15 );
    

    Seconda tecnica: accorcia il titolo per numero di parole

    Una seconda tecnica sfruttabile per accorciare i titoli di WordPress è quella di accorciare per numero di parole, che secondo alcuni è un modo più safe per eseguire l’operazione   e non rendere incomprensibile il testo in certe situazioni.

    Ecco come fare:

    function shorted_by_words_trovalost($t, $l, $after = '...') {
    $mytitle = explode(' ', $t, $l);
    if ( count($mytitle)>=$l ) {
    array_pop($mytitle);
    $mytitle = implode(" ",$mytitle). $after;
    } else {
    $mytitle = implode(" ",$mytitle);
    }
    return $mytitle;
    }
    

    Possiamo richiamare una funzione così in questo modo:

    $titolo_corto = shorted_by_words_trovalost( get_the_title(), 15 );
    

    In questo secondo caso ci prendiamo il title, andiamo a scomporlo nella funzione in “pezzi” (cioè parole, cioè stringhe separate da spazi mediante la funzione explode() ) e ci andiamo a creare un array delle prime $l parole. Questo array sarà  ricomposto come stringa con la funzione implode e restituita dalla funzione. Le considerazioni precedenti, ovviamente, valgono qui in eguale misura.Photo by tacker

  • Guida pratica alle espressioni regolari

    Guida pratica alle espressioni regolari

    Le espressioni regolari, spesso abbreviate come “regex”, sono un modo potente per cercare e manipolare testo utilizzando modelli di ricerca. In sostanza, sono stringhe di caratteri speciali che definiscono un modello di ricerca. Ad esempio, potresti voler trovare tutte le parole che iniziano con la lettera “a” o tutte le email che hanno un certo formato. Le regex ti consentono di fare questo tipo di ricerca in modo molto flessibile e potente. Sono spesso usate in programmazione, nell’analisi dei testi e nei comandi di ricerca nei programmi di editing del testo.

    Le regex sono, d’altro canto, il classico argomento di informatica che è difficilmente comprensibile se non viene utilizzato in un contesto reale almeno una volta nella vita. Le espressioni regolari o regex rappresentano infatti dei pattern di testo, ovvero un insieme di più stringhe, frasi o combinazioni delle stesse che è possibile generare per esteso a parte da esse. Una regex non è altro se non una Regular Expression, e contrariamente a quello che si sente dire in giro non servono solo ai programmatori (soprattutto per validare i form, ad esempio): sono utili anche a chi usa Google Analytics, ad esempio, e si possono usare per effettuare editing di testo avanzato in modo veloce oppure, ancora, si possono usare dentro Excel.

    In molti esempi faremo riferimento alle regex per PHP, ma ciò non toglie che gli esempi si possano estendere anche altrove.

    A che servono le regex

    Le espressioni regolari, o regex, sono sequenze di caratteri che definiscono un pattern di ricerca. Sono ampiamente utilizzate per trovare, manipolare e sostituire testo all’interno di stringhe. Puoi utilizzarle in molti linguaggi di programmazione, come Python, JavaScript, Java e molti altri. Ecco alcuni modi comuni in cui le regex vengono utilizzate:

    1. Ricerca di testo: Puoi utilizzare le regex per cercare un pattern specifico all’interno di una stringa. Ad esempio, per trovare tutte le occorrenze di “cane” in una stringa.
    2. Validazione di input: Le regex sono utili per validare che un input rispetti un certo formato. Ad esempio, un’email deve seguire un formato specifico con un “@” e un dominio valido.
    3. Sostituzione di testo: Puoi utilizzare le regex per sostituire parti di una stringa che corrispondono a un certo pattern con un altro testo. Ad esempio, puoi sostituire tutte le occorrenze di “gatto” con “cane” in una stringa.
    4. Estrazione di informazioni: Puoi estrarre parti specifiche di una stringa che corrispondono a un certo pattern. Ad esempio, estrarre tutti i numeri da una stringa.
    5. Filtraggio di dati: Puoi utilizzare le regex per filtrare dati basati su determinati criteri. Ad esempio, filtrare una lista di indirizzi email per trovare solo quelli che appartengono a un certo dominio.

    L’uso pratico delle regex dipende dal linguaggio di programmazione che stai utilizzando. In genere, ogni linguaggio ha una libreria incorporata o disponibile che fornisce supporto per le regex. Consulta la documentazione del linguaggio che stai utilizzando per informazioni dettagliate su come utilizzare le regex in quel contesto.

    Riconoscere email con le regex

    Immagina di avere un elenco di indirizzi email e vuoi trovare tutti quelli che finiscono con “@gmail.com”. Con le espressioni regolari, potresti usare il pattern @gmail\.com$. Vediamo cosa significa:

    • Il simbolo @ corrisponde letteralmente al carattere “@”.
    • gmail corrisponde letteralmente alla parola “gmail”.
    • \. corrisponde al carattere “.”. Il backslash \ è usato per “scappare” il punto in modo che sia interpretato come un punto letterale e non come parte del modello regolare, poiché il punto è un carattere speciale nelle espressioni regolari.
    • com corrisponde letteralmente alla parola “com”.
    • $ indica la fine della riga.

    Quindi, l’espressione regolare @gmail\.com$ corrisponderà a qualsiasi indirizzo email che finisce con “@gmail.com”. Utilizzando questa regex in un programma o in un’operazione di ricerca di testo, puoi individuare rapidamente tutti gli indirizzi email che corrispondono a questo modello.

    In PHP:

    <?php
    // Array di indirizzi email
    $email_list = array(
    “email1@gmail.com”,
    “email2@yahoo.com”,
    “email3@gmail.com”,
    “email4@hotmail.com”
    );

    // Pattern regex per trovare gli indirizzi email che terminano con “@gmail.com”
    $pattern = ‘/@gmail\.com$/’;

    // Scansione dell’array e ricerca degli indirizzi email che corrispondono al pattern
    foreach ($email_list as $email) {
    if (preg_match($pattern, $email)) {
    echo “Indirizzo email trovato: $email<br>”;
    }
    }
    ?>

    In Python:

    import re

    # Lista di indirizzi email
    email_list = [
    “email1@gmail.com”,
    “email2@yahoo.com”,
    “email3@gmail.com”,
    “email4@hotmail.com”
    ]

    # Pattern regex per trovare gli indirizzi email che terminano con “@gmail.com”
    pattern = r’@gmail\.com$’

    # Scansione della lista e ricerca degli indirizzi email che corrispondono al pattern
    for email in email_list:
    if re.search(pattern, email):
    print(“Indirizzo email trovato:”, email)

    Riconoscere indirizzi IP con le regex

    L’esempio più classico che si può pensare riguarda il riconoscimento di indirizzi IP: supponete di essere l’amministratore di una rete, e di avere bisogno, ad un certo punto, di validare un campo della vostra form nel quale l’utente finale inserirà  l’indirizzo numerico del tipo 192.168.1.4 o simili. Per assicurarci che il campo che viene inserito sia davvero in indirizzo IP e non una sequenza differenze di caratteri, una regex è proprio ciò che fa al caso nostro.

    E’ chiaro anche che non tutte le sequenze di 4 numeri aaa.bbb.ccc.ddd sono valide: la regola fondamentale e più generale possibile vuole che le 4 cifre siano comprese tra 0 e 255. Per indicare un numero compreso tra 0 e 255, come regex scriviamo così:

    (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

    dove in sostanza [0-5] rappresenta una cifra qualsiasi tra 0 e 5, mentre il ? indica che quanto scritto poco prima deve essere presente almeno una volta. A questo punto, il riconoscimento (o più correttamente la validazione di questo campo stringa) può essere effettuato con questa espressione compatta:

    b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b

    A prima vista si tratta di aramaico puro, vero? Niente paura. Scomponendola (l’unico modo per capire le regex è proprio questo, visto che si tratta di “cose” complicate composte da tanti pezzetti semplici) ci accorgiamo che è composta da tanti “pezzi” tra parentesi quadre che ricorrono in continuazione: ognuno di essi rappresenta una classe di caratteri, nello specifico dei numeri da 0 a 5 o da 0 a 4 e via dicendo… che possono in alcuni casi comparire o meno almeno una volta (cosiddetto quantificatore rappresentato da ?).

    Come funzionano le espressioni regolari in generale

    Anzitutto bisogna sapere che un’espressione regolare è fatta di meta-caratteri, ovvero caratteri che rappresentano “entità “, che non necessariamente coincidono con quello che viene scritto, ma che rappresentano dei caratteri generalizzati, ad esempio di un certo tipo (un set di lettere come (a,b,g), o dei numeri).

    Ancore di inizio e fine pattern: ^ e $

    Per delimitare l’inizio e la fine di un pattern, si può sfruttare il carattere iniziale ^ e quello finale $.

    ^Sto - qualsiasi stringa che inizia con "Sto"
    zzo$ - qualsiasi stringa che finisce con "zzo"

    Quantificatori — * + ? {}

    I quantificatori servono a definire quante volte un carattere o un simbolo deve essere ripetuto (eventualmente anche “almeno una volta” col simbolo +).

    abc*        stringa che inizia esattamente con ab ed è seguita da una c, che potrebbe mancare
    abc+        stringa che inizia esattamente con ab ed è seguita da almeno una c
    abc?        stringa del tipo ab oppure abc
    abc{2}      stringa con ab all'inizio e poi c ripetuta esattamente due volte
    abc{2,}     stringa con ab all'inizio e poi c ripetuta almeno due volte
    abc{2,5}    stringa con ab all'inizio e poi c ripetuta da due a cinque volte
    a(bc)*      stringa a seguita da bc (che potrebbe anche mancare, quindi matcha con: abc e a)
    a(bc){2,5}  stringa a seguita da bc da 2 a cinque volte, per cui: abcbc, abcbcbc, ... abcbcbcbcbc.

    OR — | or []

    a(b|c)     match con ab oppure ac  

    Classi di caratteri

    \d una cifra

    \w una parola

    \s uno spazio di qualsiasi genere

    \D qualsiasi carattere che non sia una cifra

    \W qualsiasi carattere che non sia una parola

    \S qualsiasi carattere che non sia uno spazio di qualsiasi genere

    Flag (usate in Javascript e PHP)

    Le flag servono a delimitare l’espressione regolare, e si possono usare anche senza ” (doppi apici).

    Esempi:

    /abc/ indica la sequenza abc

    /abc/i indica la sequenza abc case insensitive (sia AbC che ABC che ABc ecc.)

    Gruppi

    Non voglio sembrare mistico o astratto, a questo punto: voglio soltanto esprimere che posso avere dei meta-caratteri che rappresentano “gruppi” o “sequenze” jolly, per così dire, di possibili stringhe. Invece di scrivere “verifica che sia un numero tra 0 e 9” scriverò in meta-caratteri semplicemente la “dichiarazione” [0-9], dove le parentesi quadre indicano un gruppo.

    Pattern e quantificatori

    Notiamo poi che scrivere (.)+ significa esprimere un pattern, ovvero far capire al linguaggio che con quell’espressione vogliamo catturare tutte le stringhe di lunghezza almeno 1 di qualsiasi caratteri (da cui deriva il +). Quindi . rappresenta (nelle regex cosiddette POSIX usate da PHP, in particolare) un numero qualunque di caratteri di cardinalità  (numero di caratteri) almeno uno.

    Quindi un generico (.)+ puo’ rappresentare varie stringhe corrispondenti:

    f

    asg

    1265763

    bads

    sjhdjha

    salvatore capolupo

    ma non, ad esempio, la stringa vuota perchè + esprime il fatto che la stringa sia di almeno un carattere. Se invece scrivo (.)? dico che la mia stringa qualsiasi potrebbe anche essere vuota (come un campo “non richiesto” del modulo di iscrizione di una form).

    Validare un indirizzo email con una regex

    Vediamo di comprendere come riconoscere un indirizzo e-mail: la sua struttura più generale possibile sarà , ad esempio, del tipo username@address.est. Quello che dovremo fare è:

    1) far capire all’interprete che @ e . sono caratteri “letterali” e non meta-caratteri (altrimenti ci sarebbe ambiguità ), e

    2) esprimere “genericamente” username e address e est.

    In altri termini potremmo scrivere:

    (.)+@(.)+.(.){3}

    dove (.)+ ha lo stesso significato di prima, @ e . indicano i caratteri @ e . e (.){3} indica una sequenza di caratteri lunga, per semplificare, esattamente tre (potremmo avere infatti com, net, ma non it, ad esempio). Dovrebbe essere tutto un po’ più chiaro, spero.

    A questo punto la composizione di un indirizzo IP xxx.xxx.xxx.xxx si può suddividere in 4 numeri separati dal punto:

    (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

    Le alternative sono separate dal meta-carattere |, cioè stiamo dicendo che un singolo numero di un IP può essere dato da:

    • 25[0-5] ovvero ’25’ seguito da un numero qualsiasi compreso tra 0 e 9 (250,251,…,255)
    • 2[0-4][0-9] ovvero ‘2’ seguito da una cifra tra 0 e 4 ed una cifra tra 0 e 9 (247, 209, ecc.)
    • [01]?[0-9][0-9] ovvero uno 0 o un 1 (che possono mancare, dato che sono seguiti da ?), seguito da due cifre qualsiasi tra 0 e 9 (17, 124, ecc.)

    L’indirizzo IP,in definitiva, sarà  dato da una concatenazione di 4 volte questo pattern, che accetterà  dunque stringhe tipo: 255.255.0.0 ma non 256.11.17.27 (il 256 è fuori range). L’argomento è difficile (almeno all’inizio) ma molto appassionante per quanto mi riguarda, e soprattutto ricordiamo che non è fine a se stesso perchè viene utilizzato nella comune programmazione PHP come nella sintassi dei file htaccess di Apache.

    Ecco alcuni esempi di espressioni regolari in PHP, C++ e Python.

    Regex PHP

    php
    <?php
    // Esempio di ricerca di una parola in una stringa
    $stringa = "Questo è un esempio di testo contenente la parola cane.";
    if (preg_match("/cane/", $stringa)) {
    echo "La parola 'cane' è stata trovata nella stringa.";
    }
    else {
    echo "La parola 'cane' non è stata trovata nella stringa.";
    }
    ?>

    Regex C++

    #include <iostream>
    #include <regex>
    using namespace std;
    
     int main() { // Esempio di ricerca di una parola in una stringa string testo = "Questo è un esempio di testo contenente la parola cane."; regex pattern("cane"); if (regex_search(testo, pattern)) { cout << "La parola 'cane' è stata trovata nella stringa." << endl; } else { cout << "La parola 'cane' non è stata trovata nella stringa." << endl; } return 0; }

    Regex in Python

    import re

    # Esempio di ricerca di una parola in una stringa
    testo = "Questo è un esempio di testo contenente la parola cane."
    if re.search(r'cane', testo):
    print("La parola 'cane' è stata trovata nella stringa.")
    else:
    print("La parola 'cane' non è stata trovata nella stringa.")

    Questi esempi mostrano come utilizzare le espressioni regolari per cercare una parola specifica (“cane”) all’interno di una stringa. Ovviamente, le espressioni regolari possono essere molto più complesse e flessibili, consentendo di definire pattern dettagliati per la ricerca, la sostituzione, l’estrazione e altre operazioni.

  • Monitorare Linux: ecco i principali tool gratuiti per farlo

    Monitorare Linux: ecco i principali tool gratuiti per farlo

    Monitorare un sistema Linux è essenziale per garantire che le risorse vengano utilizzate in modo efficiente e che il sistema funzioni senza problemi. Ecco alcuni dei principali tool gratuiti per monitorare Linux:

    1. top

    • Descrizione: Fornisce una visualizzazione dinamica in tempo reale delle prestazioni del sistema, mostrando l’utilizzo della CPU, della memoria, e una lista dei processi attivi.
    • Comando: top

    2. htop

    • Descrizione: Un’alternativa più user-friendly a top, con un’interfaccia colorata e la possibilità di navigare facilmente tra i processi.
    • Installazione: sudo apt-get install htop (Debian/Ubuntu), sudo yum install htop (CentOS/RHEL)
    • Comando: htop

    3. iostat

    • Descrizione: Parte del pacchetto sysstat, fornisce statistiche di input/output per dispositivi di blocco e partizioni.
    • Installazione: sudo apt-get install sysstat (Debian/Ubuntu), sudo yum install sysstat (CentOS/RHEL)
    • Comando: iostat

    4. vmstat

    • Descrizione: Mostra informazioni sul sistema relative ai processi, alla memoria, al paging, ai blocchi di I/O, ai trap e alla CPU.
    • Installazione: Di solito incluso nei pacchetti base delle distribuzioni.
    • Comando: vmstat

    5. netstat

    • Descrizione: Mostra connessioni di rete, tabelle di routing, statistiche di interfaccia, mascheramento delle connessioni, e statistiche della rete.
    • Comando: netstat

    6. nmon

    • Descrizione: Fornisce una visione d’insieme delle prestazioni del sistema, inclusi CPU, memoria, disco, rete, NFS, e processi.
    • Installazione: sudo apt-get install nmon (Debian/Ubuntu), sudo yum install nmon (CentOS/RHEL)
    • Comando: nmon

    7. sar

    • Descrizione: Parte del pacchetto sysstat, raccoglie, segnala e salva informazioni sulle attività del sistema.
    • Installazione: sudo apt-get install sysstat (Debian/Ubuntu), sudo yum install sysstat (CentOS/RHEL)
    • Comando: sar

    8. glances

    • Descrizione: Un tool avanzato che utilizza librerie come PsUtil per fornire un’istantanea delle prestazioni del sistema in tempo reale.
    • Installazione: sudo apt-get install glances (Debian/Ubuntu), sudo yum install glances (CentOS/RHEL)
    • Comando: glances

    9. iftop

    • Descrizione: Mostra l’utilizzo della banda di rete per connessioni individuali.
    • Installazione: sudo apt-get install iftop (Debian/Ubuntu), sudo yum install iftop (CentOS/RHEL)
    • Comando: iftop

    10. tcpdump

    • Descrizione: Cattura e analizza pacchetti di rete.
    • Comando: tcpdump

    11. collectl

    • Descrizione: Un tool versatile che può monitorare quasi ogni aspetto del sistema, inclusi CPU, disco, rete, memoria, processi, e altro.
    • Installazione: sudo apt-get install collectl (Debian/Ubuntu), sudo yum install collectl (CentOS/RHEL)
    • Comando: collectl

    12. Monitorix

    • Descrizione: Un tool di monitoraggio leggero che può monitorare risorse di sistema come CPU, memoria, rete e altro, con un’interfaccia web.
    • Installazione: Disponibile tramite repository del progetto Monitorix.

    13. Zabbix

    • Descrizione: Una soluzione di monitoraggio di livello enterprise, che può monitorare server, servizi, applicazioni e altro, con un’interfaccia web completa.
    • Installazione: Disponibile tramite repository del progetto Zabbix.

    Questi tool coprono una vasta gamma di esigenze di monitoraggio, da semplici statistiche in tempo reale a complesse soluzioni di monitoraggio di rete e sistema. Scegliere il tool giusto dipende dalle specifiche necessità di monitoraggio e dalla complessità dell’ambiente in cui vengono utilizzati.

  • Come generare e rilevare numeri primi in Python

    Come generare e rilevare numeri primi in Python

    La ricerca e la generazione di numeri primi è un problema fondamentale per molte applicazioni informatiche, in particolare per la crittografia. La difficoltà matematica di trovare numeri primi molto grandi costituisce una sfida importante per gli informatici e i crittografi, che devono cercare di trovare soluzioni efficienti per garantire la sicurezza dei loro sistemi.

    Il problema della generazione e ricerca di numeri primi in informatica possiede diverse implicazioni pratiche e teoriche, tra cui proviamo ad elencarne alcune:

    1. Trovare numeri primi molto grandi è un compito computazionalmente molto difficile, in quanto non esiste un algoritmo efficiente per la loro ricerca. Questo è un problema fondamentale per la crittografia, poiché i numeri primi sono un ingrediente chiave per la sicurezza di molti algoritmi crittografici. Fin quando non sarà possibile generare numeri primi in maniera efficente, non sarà agevole violare le crittografie in gioco sui vari sistemi di autenticazione, bancari e via dicendo.
    2. La generazione di numeri primi è importante per la sicurezza dei sistemi crittografici. Ad esempio, gli algoritmi di crittografia asimmetrica come RSA si basano sull’uso di numeri primi molto grandi per garantire la sicurezza dei messaggi trasmessi. Se un informatico malintenzionato riuscisse a trovare i fattori primi di un numero molto grande, potrebbe facilmente decodificare i messaggi crittografati.
    3. Applicazioni pratiche: oltre alla crittografia, i numeri primi sono importanti per diverse applicazioni informatiche, come la generazione di sequenze pseudocasuali e la compressione dei dati.
    4. Crittanalisi: la ricerca di numeri primi molto grandi può essere utilizzata anche per la crittanalisi, ovvero per rompere i sistemi crittografici basati sui numeri primi. Alcuni algoritmi di fattorizzazione dei numeri sono in grado di trovare i fattori di numeri molto grandi, come ad esempio l’algoritmo di fattorizzazione attribuito a Lenstra.

    Come verificare se un numero è primo in Python

    L’algoritmo di base è molto semplice e si richiama con:

    primo(n)

    dove in sostanza quello che facciamo è verificare se n è uguale a 2, se è così il numero è primo; diversamente, in modo ricorsivo, andiamo a verificare se n sia divisibile per 3, 4, 5, … ed in questo caso restituiamo False (il numero non è sicuramente primo).

     def primo(n, i=2):
        if n == i:
            return True
        elif n % i == 0:
            return False
        return primo(n, i + 1)

    Generatore di numeri primi in Python

    Eccovi un esempio leggermente più complesso di codice Python commentato che genera tutti i numeri primi fino a N:

    def trova_numeri_primi(N):
    """
    Questa funzione prende in input un intero N e
    restituisce una lista contenente tutti i numeri primi
    compresi tra 2 e N (incluso).
    """
    numeri_primi = [] # Inizializza la lista dei numeri primi
    for numero in range(2, N+1): # Cicla su tutti i numeri da 2 a N
    primo = True # Assumiamo che il numero corrente sia primo
    for div in range(2, int(numero**0.5)+1): # Cerca divisori tra 2 e la radice quadrata del numero
    if numero % div == 0: # Se il numero è divisibile per un div si interrompe il ciclo
    primo = False
    break
    if primo: # Se il numero è primo lo aggiungiamo alla lista dei numeri primi
    numeri_primi.append(numero)
    return numeri_primi

    Il codice utilizza una doppia iterazione per scandire tutti i numeri da 2 a N, e per ciascuno di questi numeri controlla se è divisibile per qualche numero tra 2 e la sua radice quadrata. Se non lo è, allora il numero viene considerato primo e viene aggiunto alla lista dei numeri primi.

  • DOSBox: emulatore x86 gratuito per sistema operativo DOS [guida]

    DOSBox: emulatore x86 gratuito per sistema operativo DOS [guida]

    Che cos’è DOSBox

    DOSBox è un emulatore che è in grado di ricreare un ambiente compatibile MS-DOS sulla maggioranza dei sistemioperativi moderni. L’emulatore prevede l’uso dei comandi del sistema operativo, input / output, connettività di rete, grafica e suono. Tale emulatore è usato perchè più che sufficiente per rigiocare eseguire vari retrogame classici MS-DOS. Per poter utilizzare tutte le funzionalità di DOSBox è necessario conoscere o aver utilizzato MS DOS, il terminale storico di Windows negli anni novanta.

    DOSBox dispone di tutti i comandi disponibili nel classico terminale MS DOS e permette, ovviamente, di poter caricare file di programmi esterni disponibili nel formato ROM. Gran parte dei giochi DOS sono disponibili per il download a prezzi abbastanza economici sulla piattaforma GOG.com. Altre informazioni utili sono disponibili nell’ottimo Wiki ufficiale.

    Scaricare DOSBox

    DOSBox è un emulatore DOS di base gratuito, che vive di donazioni volontarie su PayPal e che può essere scaricato dall’indirizzo ufficiale:

    https://www.dosbox.com/download.php?main=1

    Permette di aprire finestre MS DOS su Unix, Mac, Linux, Solaris e dispone di vari diversi frontend per altrettanti sistemi operativi. I file aggiornati di DOSBox sono disponibili mediante il sito web di SourceForge, un repository di software gratuito. Esistono vari fork alternativi di DOSBox su Github, inoltre, tra cui vale la pena citarne uno un po’ più recente, scritto in C++, che trovate come dosbox-staging.

    Come usare DOSBox (passo passo)

    In pochi e semplici passi, si tratta di questo:

    • Passo 1. Scarica DOSBox dal sito ufficiale
    • Passo 2. Crea una cartella nel computer per i giochi che vuoi usare.
    • Passo 3. Lancia DOSBox.
    • Passo 4. Fai il mount di c:\dos
    • Passo 5. Entra nella cartella del gioco
    • Passo 6. Scrivi il nome del file .EXE (eseguibile) per lanciarlo.
    • Passo 7. Gioca 🙂

    Ho usato DOSBox per rigiocare a Lemmings del 1991 🙂

    Per testare l’ambiente ho installato DOSBox sul mio Mac e l’ho testato con uno dei giochi più famosi al mondo, ad oggi: l’originale Lemmings, disponibile su PC e Commodore 64 d’epoca, e notavo le seguenti cose. Prima di tutto la dimensione dello schermo che è circa un quarto dello schermo attuale, probabilmente per un fatto regalo alla risoluzione (oggi più alta). DOSBox permette ai Lemmings di funzionare anche su un Mac, per quanto le versioni più aggiornate del sistema impongano che l’app abbia i permessi sull’input da tastiera da concedere esplicitamente. Le schermata si vedono ovviamente più piccole per i motivi sopraelencati.

    Di seguito ho caricato anche un video di quello che sono riuscito ad emulare con successo.

    Credits immagine: Copyrighted, https://it.wikipedia.org/w/index.php?curid=784562, di