La bellezza delle espressioni regolari (aka: correggendo bgcolor in Wikipedia)

Non so se l’avessi già detto ma amo perdere una consistente quantità di tempo su Wikipedia in lingua italiana. Appena posso lo faccio. È rilassante e stimolante. Ritaglio del tempo soprattutto per svolgere i task più inutili che mi auto-assegno con gioia per sentirmi in pace con me stesso nello sfuggire agli impegni più seri.

Oggi mi sono imbattuto ad esempio in una voce Wikipedia che aveva una semplice tabella con uno sfondo colorato. Colorata con bgcolor.

Non è che tutti dovrebbero sapere che l’HTML si è evoluto giusto un briciolo dalla sua nascita e che roba come bgcolor non si dovrebbe più usare almeno da HTML 4 ovvero almeno dal 1999. Diciamoci la verità, l’ho sempre sospettato, ma manco io avevo la certezza che fosse un attributo deprecato prima di scoprire che la voce [[HTML 4]] non aveva fonti e prima di giungere quindi alle specifiche W3C per pura serendipità. asd

In sostanza, facendo una rapida ricerca, circa un migliaio e mezzo di articoli di Wikipedia ad oggi usavano ancora bgcolor.

Ora, è chiaro che se quasi 1500 voci di Wikipedia hanno una tabella colorata con bgcolor e se ogni browser del pianeta (tranne Internet Exploder) mostra correttamente questo colore, significa che non c’è proprio nessuna fretta a correggerlo. Certo però che un giorno questa migrazione sarà da fare. Un giorno.

Ora sapete il perché ciò mi abbia allettato.

In teoria una sostituzione del genere appare piuttosto semplice. In fondo bisogna solo trovare nel testo della pagina tutto ciò che assomigli a questo:

<td bgcolor="#ff0000"></td>

E trasformarlo in questo:

<td style="background:#ff0000"></td>

Ma i casi da tenere in considerazione sono almeno questi:

<td bgcolor="#ff0000"></td>
<td bgcolor="#f00"></td>
<td bgcolor="ff0000"></td>
<td bgcolor=ff0000></td>
<td bgcolor="f00"></td>
<td bgcolor  = "red"></td>

Senda dimenticare che una becera sostituzione potrebbe provocare attributi style doppi ove ve ne fosse già uno:

<td bgcolor="red"     colspan="2" style="color:blue;">
↓
<td style="color:red" colspan="2" style="color:blue;">

Tagliando corto dopo un’oretta buona ecco qui una casseruola di espressioni regolari che lanciate in sequenza effettuano la corretta conversione di parecchi di questi casi:

1. Una prima sostituzione di tutti i vari colori esadecimali scritti ahimè senza cancelletto davanti tipo bgcolor="ff0000" e che il bot non deve confondere con bgcolor="red" o altri nomi propri che non vogliono il cancelletto davanti:

# Ricerca:
/bgcolor *= *("?)([a-fA-F0-9]{6}|[a-fA-F0-9]{3})+\1/
 
# Sostituzione:
style="background:#$2"

Notare l’utilità dell’operatore \1 nella ricerca per riferirsi al primo apice che può esserci o meno.

2. Segue una sostituzione di tutti i vari colori esadecimali con cancelletto davanti e quelli dal nome specifico:

# Ricerca
/bgcolor *= *("?)(#[a-z0-9A-Z]{6}|#[a-zA-Z0-9]{3}|[a-zA-Z]{3,})+\1/
 
# Sostituzione
style="background:$2"

3. Per sfizio a questo punto uno potrebbe anche decidere di accorciare tutti i colori dal formato #aabbcc a #abc:

# Ricerca
/#([a-fA-F0-9])\1([a-fA-F0-9])\2([a-fA-F0-9])\3"/
 
# Sostituzione
#$1$2$3"

Notare sempre l’uso dell’operatore \1, \2, \3 per dire che un gruppo sarà ripetuto un’altra volta subito dopo.

4. A questo punto ci si potrebbe ritrovare con un tag HTML con due style come in questa situazione, e che dovranno essere uniti in qualche modo:

<td bgcolor="red"                colspan="2" style="color:blue;"></td>
↓
<td style="background-color:red" colspan="2" style="color:blue;"></td>

E quindi si lancia un’altra espressione regolare per unire tutti gli style presenti nello stesso tag (questa è tenera asd):

# Ricerca
/style="([a-zA-Z0-9-; #:%]+?);?"((?: +[a-zA-Z]+ *= *("?)[a-zA-Z0-9-; #:%]+\3)*) style="([a-zA-Z0-9-; #:%]+?);?"/
 
# Sostituzione
style="$1; $4"$2

Notare il doppio-gruppo innestato (?:()*) in mezzo ai due style. Qui il gruppo centrale è ripetuto da zero ad infinite volte e non deve avere nome (altrimenti si entra in altre dimensioni… asd) mentre il gruppo esterno colleziona queste ripetizioni interne e le salva in $2. Quindi se si ha la situazione:

style="uno" roba=asd pippo="gianni" style="due"

Questo sarà il valore della cattura in $2:

roba=asd pippo="gianni"

E quindi avverrà questo magico accorpamento dei due style, mantenendo il resto del ciarpame:

<td style="background-color:blue;" colspan="2" rowspan=1 style="color:red">
↓
<td style="background-color:blue; color:red" colspan="2" rowspan=1>

Notare che ci si è presi lo scrupolo di non far venire ;; nel concatenare le due proprietà CSS o di dimenticarsi proprio ; nella loro congiunzione.

D’altra parte se fin’ora abbiamo acchiappato e convertito i bgcolor ora questo processo dovrà essere ripetuto per color, valign, align ed altre cose, più o meno in quest’ordine. Perché in quest’ordine? Perché il color va sostituito dopo aver sostituito eventuali bgcolor, perché bgcolor può essere frainteso come color e se non avete voglia di piazzare un lookahead per decidere quando inizi il nome di un attributo HTML… insomma, bisogna considerare l’ordine.

C’è anche da dire che finché si sostituisce solo un singolo attributo come bgcolor si rischia al massimo di creare due style e questo problema è risolto con la sostituzione appena citata. Al contrario se gli attributi iniziano ad essere n occorrerà lanciare n volte l’espressione numero 4 affinché passo dopo passo tutti gli style si vadano ad inglobare passaggio dopo passaggio:

<td bgcolor=red color=red valign=left colspan="1" style="padding:1px">
↓
<td style="background:red" style="color:red" style="vertical-align:left" colspan="1" style="padding:1px">
↓
<td style="background:red; color:red; vertical-align:left" colspan="1" style="padding:1px">
↓
<td style="background:red; color:red; vertical-align:left; padding:1px" colspan="1">

(Come fai ad essere già qui? asd. Torna su a constatare i passaggi finché non ti convinci dell’efficacia della espressione regolare numero 4 e del fatto che basti lanciarla n volte per avere un corretto accorpamento dei n attributi deprecati esplosi nei vari style)

Ebbene, lanciando tutte queste espressi regolari su una pagina a caso ecco il risultato: test.

A questo punto si lancia il mio bottino personalissimo e si corregge Wikipedia:

./replace.php \
--always \
--wiki=itwiki \
--generator=search \
--gsrsearch='insource:bgcolor' \
--regex \
--summary="Bot: cose" \
REGEX1 SOSTITUZIONE1 \
REGEX2 SOSTITUZIONE2 \
...

E per oggi le nostre inutilità le abbiamo fatte.

E anche oggi siamo riusciti a non usare un parser HTML per fare ciò che bisognerebbe fare con un parser HTML. asd

P.S.
Naturalmente non solo è stupido pensare che qualcuno mi ringrazierà per aver fatto una cosa del genere (o forse a farlo sarà il World Wide Web Consortium? chissà. asd) ma sarebbe altrettanto stupido pensare che non sia scappato un errore da qualche parte in qualche corner-case allucinante in qualche voce a bassissima visibilità fuori dai controlli a campione, magari proprio mentre mi ero distratto un momento a rispondere alle domande impertinenti di quel bischero di Ferdi2005, mentre con una pupilla monitoravo il bot e con l’altra gli mandavo una gif di un Sofficino. Quindi, fra 2 anni, un utente verrà giustamente a cazziarmi e dovrò giustamente spiegargli come mai io mi sia permesso di non verificare come mai nella sua specifica circostanza un testo abbia potuto perdere la formattazione desiderata. Dannato Ferdi2005. Dannati Sofficini. asd

La vita non da gioie. Le espressioni regolari neanche. Ma almeno abbiamo dimostrato ancora una volta quanto le espressioni regolari siano bellissime. asd

BusTO — Libera il trasporto pubblico Piemontese

Il 29 ottobre 2014 alle ore 01:38 fu annunciato il rilascio della prima versione stabile di BusTO! Un’applicazione che permette a tutti i Torinesi di vedere gli orari di bus e tram in tempo reale utilizzando esclusivamente software libero, ovvero nel completo rispetto della propria privacy (ovvero totalmente il contrario di molte simili applicazioni sul Play Store).

L’app è scaricabile per ora esclusivamente da F-Droid, un altro software libero che rispetta la tua privacy e che contiene esclusivamente altro software libero! (Una matriosca di software libero!)

Disponibile su F-Droid
Installa F-Droid e cerca BusTO!
QRCode per scaricare BusTO da F-Droid
…o scannerizza il QRCode con Barcode Scanner

F-Droid è un luogo super-sicuro in cui puoi scaricare applicazioni molto utili oltre alla nostra BusTO. Sul tuo Android abilita Impostazioni > Sicurezza > Origini sconosciute per poter scaricare F-Droid in pace, e poter così iniziare ad amare BusTO!

Caratteristiche di BusTO @ F-Droid

Non sei tracciato

La stragrande maggioranza delle applicazioni del Play Store fanno largo uso di Google Analytics SDK, una libreria spiacevole che nasce con l’unico scopo di tracciare ogni utente di una certa applicazione e riferire allo sviluppatore ogni utilizzo.
BusTO@F-Droid non ti traccia in alcun modo.

Risparmio di Internet & Batteria

Molte app del Play Store si auto-risvegliano non appena il telefono ha una connessione ad Internet per tentare di riferire all’autore informazioni sull’utilizzo. Ci sono modi per bloccare l’invio di queste informazioni, ma non c’è modo per bloccare questo comportamento spiacevole.
BusTO@F-Droid non ha anti-funzionalità: non spedisce alcun dato di questo tipo nè in background e nè in primo piano e ciò comporta anche un risparmio di dati Internet e di batteria. Inoltre,
BusTO@F-Droid nasce con la logica di riciclare di ogni risorsa Internet: Se non serve richiedere via Internet il nome di una fermata, non serve farlo! Così abbiamo ragionato per svilupparla.

Pubblicità? AHAHAH!

Non è che ci fanno schifo i soldi: semplicemente non ci interessa diventare milionari a spese della tua privacy. A noi interessa esclusivamente avere un’applicazione funzionale e che non annoi con spiacevoli pubblicità invasive. Infatti la maggior parte delle applicazioni sul Play Store utilizza i servizi di Google Analytics e di Google Adword che identificano unilateralmente il tuo dispositivo, schedando i tuoi interessi per mostrarti pubblicità mirata inserita da inserzionisti che ti guardano come veri avvoltoi.
BusTO non scenderà mai a compromessi di questo tipo e perciò non ti traccierà e non conterrà mai pubblicità. Se vuoi sostenere BusTo per questa scelta, puoi donarci un caffè o una bella birra rossa che servirà a supportarci moralmente. Non avremo certo gloria con spam e tracking!

Supporto Material Design Android Lollipop!

Ai nostri utenti piace il Material Design e perciò BusTO è nata sfruttando al meglio l’interfaccia grafica di Android 5 Lollipop.

(Prova a trascinare verso il basso gli orari dei passaggi della fermata per ricaricarli!)

Prendi parte alla combriccola

BusTO nasce per essere un software libero: Hai il diritto di lamentarti con te stesso se qualcosa non ti piace, in quanto hai il potere di cambiare ogni singola riga di codice e puoi ricondividere le tue migliorie con tutti (soprattutto con noi!). In ogni caso ci sono tanti modi di migliorare quest’applicazione, per esempio inviando bug o idee o regalandoci la classica birra.

Come funziona?

Scarica l’app da F-Droid e premi il tasto Menù > Info, per scoprirlo! Perchè ci fai scrivere due volte le stesse cose? Suvvia!

I tuoi diritti

BusTO è un software libero. Significa che puoi:

  • Usare BusTO come ti pare
  • Studiare il suo codice come ti pare
  • Modificare il codice come ti pare
  • Condividere con chi vuoi il frutto del tuo lavoro

Tutto ciò è per permettere a tutti di verificare con i propri occhi quanto BusTO ami i propri utenti e rispetti la loro privacy, ma non solo: è per permettere a tutti di migliorarla anche mentre noi siamo sotto la doccia. Maggiori informazioni nel Menù > Info dell’applicazione.

Grazie!

Grazie per l’utilizzo, e grazie a tutti i contributori! In particolare grazie a Marco Gagino e a Ludovico Pavesi ed a me (Valerio Bozzolan!) :lol: Un ringraziamento speciale a 5T Srl che fornisce i dati in tempo reale.

Terapia anti-trauma da Terminale

E così anche tu vorresti smanettare col Terminale senza dar fuoco al tuo sistema? Se sei così disperato da finire su questo sito per capirne di più, allora eccoti questa guida per iniziare, probabilmente la prima e unica e migliore guida del terminale sulla faccia dell’universo conosciuto.

Immagine di un terminale di un sistema GNU/Linux
Ecco, un tenero terminale GNU/Linux <3

Ed ecco la tanto attesa serie di FAQ. (Se leggi sta roba, sei proprio messo male).

  • Cos’è GNU/Linux? Cos’è un terminale? Dove provo il terminale?
    Dov’è il terminale?? Alt. Stiamo parlando di sistemi operativi GNU/Linux (come Debian, Fedora, Ubuntu, Red Hat, Puppy, Zorin OS, Linux Mint, e altri miliardi e miliardi…) su cui si può avere accesso ad un terminale. E per la cronaca quella tanto inutile finestrella nera di $ Winzozz ® non è un terminale: con quello ti ci puoi anche pulire il c…omputer. Prendi un CD, un Hard-disk, una chiavetta USB, un telefono, una pietra, un qualsiasi cosa su cui possa partire un sistema operativo GNU/Linux, e quando hai fra le mani un sistema operativo GNU/Linux cerca e apri sto terminale: lo troverai sicuramente. Cerca! Pigrone.
  • Perchè il terminale è nero?
    Non è vero. Ma alla gente rozza e burbera piace nero. E poi prova te a tenere aperta una finestra completamente giallo all’una di notte, avanti! Inoltre il pinguino è in “abiti” neri. Coincidenze? Non credo. Si può ancora dire che il nero snellisca, ma la verità è che è eccitante farsi vedere mentre hai davanti una schermata NERA. Ha il suo fascino.
  • Perchè mi serve sto terminale?
    Ancora la solita storia. Forse ignori quanto esso sia uno strumento di dominio: Nel senso che con esso sei in grado di fare qualsiasi cosa sul tuo sistema in modo molto più diretto ed efficace che con un’interfaccia grafica, senza esagerare. O comunque se non sei in cerca di “questo dominio” ripetiamo comunque che usare un terminale fa molto da smanettone.
  • Sì ma è inutile! Perchè dovrei rinunciare all’interfaccia grafica?
    Da vero babbeo credi che oggi un’umano usi un PC soltanto da una finestra nera?? Beh, in realtà , molti lo fanno. Infatti il bello di GNU/Linux è anche che l’intero sistema che conosci (ovvero quella tenera interfaccia grafica) in realtà è solo uno specchietto per le allodole: Il sistema in realtà è ben altro, ben più stabile, e completamente gestibile dalla tua solida linea di comando (il terminale). Perciò sì: Puoi gestire il tuo sistema solo da una finestra nera se ti va. E sì: Il sistema non è per nulla dipendente da icone e pulsanti da femminucce. E no: non sei ovviamente costretto ad abbandonare la tua amata interfaccia grafica per non tradire la linea di comando: Le due cose convivono benissimo da sempre.

E ricorda!

  1. Ricorda che solitamente nel terminale che troverai nel tuo sistema operativo GNU/Linux CTRL+C e CTRL+V non li puoi usare per copiare e incollare perchè sono tasti riservati ad altre funzioni. Se proprio vuoi farlo di solito si usa: CTRL+Maiusc+C e CTRL+Maiusc+V.
  2. Ricorda che se scrivi un comando devi poi premere INVIO per lanciarlo! Ricorda inoltre che non tutti i comandi scrivono qualcosa sullo schermo! Non ti stupire perciò se lanciando un comando ti sembra che non succeda niente… Un comando lanciato viene sempre eseguito, e se vi sono errori di solito vengono stampati sullo schermo per aiutarti a riprovare.
  3. Ricorda che i comandi sono case-sensitive: MAIUSCOLE e minuscole sono cose molto diverse.

Da ora in poi apri il tuo terminale e prova tranquillamente tutti i comandi in questa pagina. Nessuno di questi ti distruggerà il sistema.
(O almeno credo… –Muahahah!-)

MAN

man è il comando che apre i manuali. Devi imparare ad usarlo, poichè qualche poveraccio avrà impiegano un sacco di tempo per scriverli, porta un po’ di rispetto.

Devi sapere che tutti i comandi hanno opzioni e valori differenti. Il manuale aperto da man ti permette così di sapere praticamente tutto su tutto.

(All’inizio è piuttosto caotica come esperienza. Si comprende però quanto questo sia uno strumento basilare. Impegnati per capire come siano organizzate le informazioni: Anche se ci vorrà un po’ per fare pratica, la documentazione dei manuali è uno standard da saper leggere.)

ATTENZIONE: Per uscire dal manuale si digita “q” (iniziale di quit). Ci si sposta con le frecce su-giù.

Esempi di utilizzo.

  • Per aprire il manuale del comando ping:
    man ping
  • Per aprire il manuale sul comando man:
    man man

NANO

Hai presente un qualunque programma per scrivere file di testo? Ecco. Questo comando apre un vero e proprio editor all’interno del terminale, con cui potrai scrivere. Ovviamente ti ricordiamo che ti devi scordare bottoni e pulsanti, quindi cerca di capire che tutte le cose che vuoi fare si potranno fare solo con la tastiera, e sicuramente in qualche modo sensato e intuitivo. (I programmatori sono molto pigri, niente sarà mai troppo complicato).

Significa che per salvare, uscire, tagliare, incollare, dovrai usare alcune furbe combinazioni di tasti, di solito CTRL + una lettera.

  • Aprire l’editor nano per lavorare su un file (esistente o non):
    nano file.txt

ATTENZIONE: Osserva in basso, vedrai queste azioni:

Le combinazioni di CTRL + lettera fornite da nano
Azioni tramite CTRL + Lettera

Queste sono azioni che puoi fare, attivabili con con CTRL+LETTERA. Per esempio ^O Salva, significa che salvi con CTRL+o.

Il salvataggio si conferma con INVIO.

PWD

Lo sai che il terminale è anche un gestore file? Nel senso che permette di andare su e giù per le cartelle del sistema. Col terminale sei sempre dentro a una cartella (chiamata cartella di lavoro o working directory). Per sapere in quale cartella ci si trova, si lancia il comando pwd (“print working directory”).

  • Sapere in che cartella mi trovo:
    pwd

    Risultato d’esempio:
    /home/nome_utente
    Significa che si sta lavorando nella cartella “nome_utente”, contenuta in “home”. Quando si apre un terminale solitamente è sempre così.

LS

Questo comando è utilissimo, significa list ed elenca i file e cartelle. Ha molti usi. Alcuni esempi:

  • Elencare i file dell’attuale cartella di lavoro (puoi sapere l’attuale cartella di lavoro con il comando pwd):
    ls
  • Per elencare i file di una cartella specifica:
    ls /home
  • Per elencare i file con una lunga serie di informazioni (vedremo dopo cosa sono queste informazioni):
    ls -l
  • Per elencare anche i file nascosti (i file che hanno il nome che parte con un punto si dicono “nascosti”):
    ls -a
  • Gli ultimi tre comandi messi insieme: (in quattro modi diversi, per fare la stessa cosa.)
    ls -l -a /home
    ls -a -l /home
    ls -la /home
    ls -al /home

Di per se questo comando stampa tutti i file che vi sono dentro alla cartella selezionata. Se trova altre cartelle, ovviamente non ci entra dentro per stampare pure il loro contenuto. Se invece desideri proprio stampare TUTTO quello che vi è dentro una cartella, che l’opzione -R, che sta per “Ricorsione”.

  • Stampare ricorsivamente tutti i file dentro a una cartella e dentro a tutte le cartelle di quella cartella eccetera:
    ls -R /home

CD

Questo comando è basilare, e significa change directory. Serve per spostarsi all’interno di una cartella a tua scelta. (Capitan Ovvio.)

Esempi:

  • Per entrare nella propria cartella personale di default (Esatto, il tuo utente ha una cartella personale di default):
    cd
  • Per entrare in una cartella specifica (come ad esempio la cartella /var/log, che è una cartella solitamente dedicata a tutti i file di log del sistema):
    cd /var/log
  • Oppure per fare la stessa cosa precedente, posso digitare questi uno alla volta: Col primo impongo di partire dalla base di tutte le cartelle (“/”), e poi via via mi addentro fino a dove voglio arrivare:
    cd /
    cd var
    cd log

MKDIR/RMDIR

Il comando mkdir sta per “make directory”, cioè crea nuove cartelle. Il suo opposto è rmdir, che però per sicurezza permette di eliminare soltanto cartelle vuote (vedremo più tardi come cancellare cartelle piene).

Esempi pratici:

  • Per creare la cartella PROVA:
    mkdir prova
  • Per creare più cartelle insieme, in un numero arbitrario:
    mkdir provauno provadue provatre
  • Per creare la cartella miao, dentro la cartella ciao, dentro la cartella prova:
    mkdir prova/ciao/miao

Per tutti ovviamente verrà un errore se la cartella esiste già, oppure se si sta creando qualcosa dentro una cartella che non esiste. Per cui:

  • Per eseguire il comando di prima senza eventuali errori:
    mkdir -p prova/ciao/miao

CAT

  • Hai un file di cui vorresti sapere il contenuto?
    cat file1.txt
  • Hai due o più file di cui vorresti sapere il contenuto?
    cat file1.txt file2.txt

Ah, non dimenticare che cat è un comando inutile.

Deluso?

Deluso da questa guida? Eh per forza!

La prossima volta vai su guide più serie.

https://www.debian.org/doc/manuals/debian-reference/ch01.it.html

http://wiki.ubuntu-it.org/AmministrazioneSistema/RigaDiComando (asd! no.)

Arduino – Best of Super Mario Bros (2 Voci)

Nei prossimi articoli approfondiremo l’argomento Arduino, la generazione di suoni, e molto altro…

Ma per ora limitiamoci ad attirare la vostra attenzione… Godetevi un assaggio, presentandovi il primo progetto creato da noi, per voi:

Apri il video in un altra finestra: https://www.youtube.com/watch?v=FuwiWEiv8_Y

Il codice sorgente di questo video è disponibile liberamente. Dovrebbe essere scontato, ma per usarlo devi possedere un Arduino, insieme a Sketch per Arduino.

Se desideri utilizzare il codice:

  1. Scarica il codice Download Super Mario Sketch
  2. Decomprimilo (è compresso in zip)
  3. All’interno troverai due cartelle:
    La prima è “Super_Mario“: Contiene il codice.
    La seconda è “Tone“: Contiene una libreria
  4. Per installare la libreria”Tone” guarda qui, oppure qui.
  5. Ora puoi usare il codice contenuto nella cartella “Super_Mario“.

Per usare il codice c’è bisogno di due speaker connessi su due pin PWM~ (nell’immagine sono 11 e 12. Se nel tuo Arduino essi non sono PWM puoi anche usare degli altri. In questo caso dovrai aggiornare il codice). Se vuoi puoi cambiare la velocità connettendo anche un trimmer (un potenziometro) alimentandolo con 5V e connettendo la sua base al pin A0 (analog in). Non scordardi di proteggere entrambi gli speaker con una piccola resistenza (nel disegno è R, circa 27Ω).

Super Mario per Arduino - Schema

Buon divertimento!

Un ringraziamento molto speciale a Joseph Karam, creatore degli spartiti sul sito mariopiano.com di cui abbiamo trascritto manualmente tutte le note musicali convertendole in codice Sketch per realizzare questo progetto fedelmente alle musiche di Super Mario.

Come intasare un PC – Reyboz Directory Invader 2012

Premessa

Questo articolo è molto vecchio e l’autore di questa pagina nel frattempo è maturato un filino culturalmente e quindi si vergogna molto di quanto vi sia scritto. Nello specifico, l’autore prova conati di vomito al solo pensiero di consigliare software non-libero ad un lettore.

Questi contenuti comunque rimarranno online per aiutare a ricordarsi di quanto si era ignoranti in Informatica solo pochi anni fa e di quanto sia stata sottile la linea che mi separava da Aranzulla.

P.S.
Se trovi un’altra guida del genere in Internet senza un simile disclaimer, insulta immediatamente quell’autore.

Ho scoperto nel cassetto un simpatico programma che avevamo realizzato per fare uno scherzo incoscenzioso ad una persona… Un programma molto banale che creava cartelle a non finire, ma arricchito con un simpatico regolatore di trasparenza (per nascondere la finestra), nonchè di un algoritmo che faceva in modo che il computer rimanesse stabile durante l’intera creazione.

Il programma è molto semplice:

  1. Scegli una cartella di destinazione (Ad esempio il Desktop)
  2. Decidi il nome che avranno le tue cartelle (Consecutive, o casuali)
  3. Modifichi la quantità (una, cinquecento, o 1 milione…)

E crei!

Crea - Reyboz Directory Invader 2012

Ecco come appare il mio Desktop dopo aver usato Reyboz Directory Invader. :D

Screenshot 1 - Reyboz Directory Invader - 2012

Screenshot 1 - Reyboz Directory Invader - 2012

Buona invasione!

Codice per convertire cifre in parole – Visual Basic VBA PHP e Javascript

Se hai bisogno di convertire un numero:

123.456.783

Nel suo corrispondente letterale:

Centoventitremilioniquattrocentocinquantaseimilasettecentottantatrè!

Il nostro codice ti potrà essere di aiuto poichè rispetta la grammatica Italiana e soddisfa fino a diciotto cifre!

Il nostro convertitore di numeri in parole (che abbiamo chiamato spell_my_int) è disponibile in diversi linguaggi: Bash, PHP, Visual Basic/VBA, e Javascript! ;)

Termini e condizioni!

I codici sorgente presenti in questa pagina sono rilasciati sotto i termini della licenza libera GNU General Public License versione 3 o successive: Hai il diritto di utilizzare, migliorare/peggiorare questo codice per qualsiasi necessità a patto che il codice da te prodotto sia chiaramente coperto dalla stessa licenza (affinchè io per esempio possa avvantaggiarmi delle tue migliorie :D ). Inoltre, ti prego di segnalare su questa pagina un link dove riporti un riferimento al tuo utilizzo, per facilitarmi appunto il mio lavoro di andare a vedere come la gente usa e migliora il mio codice :)

Il codice funziona. In ogni caso (come per ogni software Libero) non diamo alcuna garanzia o responsabilità :)

Grazie, e buon uso!

Versione Bash per GNU/Linux

Il nostro script per linea di comando Bash sui sistemi GNU/Linux (e credo Mac OS X) è disponibile su Launchpad con il nome di n2t-it (number to text – Italiano).
Per prima cosa occorre installare bzr da utente root:

apt-get install bzr

Quindi da utente normale bisogna scaricare il sorgente ed entrare nella cartella:

bzr branch lp:n2t-it
cd n2t-it

A quel punto si può usarlo (ha molte opzioni):

# Per la pagina di manuale
./n2t -h
 
# Esempio minimale
./n2t 123.45
 
# Esempio completo da STDIN
echo 123/44 | ./n2t -c "/" -t " virgola " -d

Versione per Microsoft Windows©

Screenshot spell_my_int() - Visual Basic - Reyboz Blog

Puoi scaricare il programma spell_my_int per Windows da questo indirizzo.
Oppure puoi vedere il codice del programma (in Visual Basic) scorrendo più in basso.

Versione in PHP

Puoi vedere la versione in PHP online su questo indirizzo.
Oppure puoi usarlo sul tuo sito personale inserendo nella tua pagina questo codice:

<iframe src="http://lab.reyboz.it/spell_my_int/PHP/?number=0" width="250" height="150" />
  <p>Your browser does not support iframes.</p>
</iframe>

Puoi inoltre scorgere il codice scorrendo più in basso.

Versione in Javascript

Visualizzalo online in JavascriptVedi codice Javascript

spell_my_int() in Visual Basic

'	Convertitore di numeri interi in corrispettivi letterali.
'	Esempio:	123 => centoventitrè
'	Born:	10 Giugno 2012
'	Licenza: GNU General Public License (versione 3 o successive)
'	Autore: Valerio Bozzolan - Reyboz.it
Public Function spell_my_int(ByVal num As Long, Optional ByVal centOOttanta As Boolean = False) As String
	Dim numstring As String = num.ToString
	Dim numlen As Integer
	Dim IDcent As Byte
	Dim subnumerostring As String
	Dim subnumero As Integer
	Dim cifra(2) As String
	Dim text(2) As String
	Dim prime2cifre As Integer
	Dim result As String = ""
	Dim sezione As Integer = 0
	Dim mono() As String = {"", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove"}
	Dim duplo() As String = {"dieci", "undici", "dodici", mono(3) & "dici", "quattordici", "quindici", "sedici", "dicias" & mono(7), "dici " & mono(8), "dician" & mono(9)}
	Dim deca() As String = {"", duplo(0), "venti", mono(3) & "nta", "quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta"}
	Dim cento() As String = {"cent", "cento"}
	Dim mili(,) As String = {{"", "mille", "milione", "miliardo", "bilione", "biliardo"}, {"", "mila", "milioni", "miliardi", "bilioni", "biliardi"}}
	Dim max As Long = (10 ^ (6 * 3) - 1) - 1
	If (num < 0) Then
		Return "Minimo 0!"
	ElseIf (num > max) Then
		Return "Massimo " & max & "!"
	ElseIf (num = 0) Then
		Return "zero"
	End If
	Select Case (numstring.Length Mod 3)
		Case 1
			numstring = "00" & num.ToString
		Case 2
			numstring = "0" & num.ToString
		Case Else
			numstring = num.ToString
	End Select
	numlen = numstring.Length
	'MsgBox("Numlen: " & numlen & "  subnumero: " & numstring)
	Do While ((sezione + 1) * 3 <= numlen)
		subnumerostring = Mid(numstring, (numlen - ((sezione + 1) * 3)) + 1, 3)
		subnumero = CInt(subnumerostring)
		cifra(0) = Mid(subnumerostring, 1, 1)
		cifra(1) = Mid(subnumerostring, 2, 1)
		cifra(2) = Mid(subnumerostring, 3, 1)
		'MsgBox("Sezione numero: " & sezione & ", cifre della sezione: " & cifra(0) & cifra(1) & cifra(2))
		If (subnumero <> 0) Then
			prime2cifre = CInt(cifra(1)) * 10 + CInt(cifra(2))
			'MsgBox(prime2cifre)
			If (prime2cifre < 10) Then
				text(2) = mono(cifra(2))
				text(1) = ""
			ElseIf (prime2cifre < 20) Then
				text(2) = ""
				text(1) = duplo(prime2cifre - 10)
			Else
				'ventitre => ventitrè
				If (sezione = 0 And cifra(2) = 3) Then
					text(2) = "trè"
				Else
					text(2) = mono(cifra(2))
				End If
				'	novantaotto => novantotto
				If (cifra(2) = 1 Or cifra(2) = 8) Then
					text(1) = Mid(deca(cifra(1)), 1, deca(cifra(1)).Length - 1)
				Else
					text(1) = deca(cifra(1))
				End If
			End If
			If (cifra(0) = 0) Then
				text(0) = ""
			Else
				' centoottanta => centottanta
				If (Not centOOttanta And cifra(1) = 8 Or (cifra(1) = 0 And cifra(2) = 8)) Then
					IDcent = 0
				Else
					IDcent = 1
				End If
				If (cifra(0) <> 1) Then
					text(0) = mono(cifra(0)) & cento(IDcent)
				Else
					text(0) = cento(IDcent)
				End If
			End If
			'	unomille	=> mille
			'	miliardo	=> unmiliardo
			If (subnumero = 1 And sezione <> 0) Then
				If (sezione >= 2) Then
					result = "un" & mili(0, sezione) & result
				Else
					result = mili(0, sezione) & result
				End If
			Else
				result = text(0) & text(1) & text(2) & mili(1, sezione) & result
			End If
		End If
		sezione = sezione + 1
	Loop
	Return result
End Function

spell_my_int() in VBA (Visual Basic for Application)

'	Convertitore di numeri interi in corrispettivi letterali.
'	Esempio:	123 => centoventitrè
'	Born:	10 Giugno 2012
'	Licenza: GNU General Public License (versione 3 o successive)
'	Autore: Valerio Bozzolan - Reyboz.it
Function spell_my_int(ByVal num As Long) As String
    Dim centOOttanta As Boolean
    centOOttanta = false
    Dim numstring As String
    Dim numlen As Integer
    Dim IDcent As Byte
    Dim subnumerostring As String
    Dim subnumero As Integer
    Dim cifra(2) As String
    Dim text(2) As String
    Dim prime2cifre As Integer
    Dim result As String
    Dim sezione As Integer
    Dim mono(9) As String
    Dim duplo(9) As String
    Dim deca(9) As String
    Dim cento(2) As String
    Dim mili(1, 9) As String
    Dim max
    max = ((10 ^ (6 * 3)) - 1) - 1
    '   Caricamento di mono() in formato esteso
    mono(0) = ""
    mono(1) = "uno"
    mono(2) = "due"
    mono(3) = "tre"
    mono(4) = "quattro"
    mono(5) = "cinque"
    mono(6) = "sei"
    mono(7) = "sette"
    mono(8) = "otto"
    mono(9) = "nove"
    '   Caricamento di duplo() in formato esteso
    duplo(0) = "dieci"
    duplo(1) = "undici"
    duplo(2) = "dodici"
    duplo(3) = "tredici"
    duplo(4) = "quattordici"
    duplo(5) = "quindici"
    duplo(6) = "sedici"
    duplo(7) = "dicias" & mono(7)
    duplo(8) = "dici" & mono(8)
    duplo(9) = "dician" & mono(9)
    '   Caricamento di deca() in formato esteso
    deca(0) = ""
    deca(1) = duplo(0)
    deca(2) = "venti"
    deca(3) = mono(3) & "nta"
    deca(4) = "quaranta"
    deca(5) = "cinquanta"
    deca(6) = "sessanta"
    deca(7) = "settanta"
    deca(8) = "ottanta"
    deca(9) = "novanta"
    '   Caricamento di cento() in formato esteso
    cento(0) = "cent"
    cento(1) = cento(0) & "o"
    '   Caricamento di mili(0 ,) in formato esteso
    mili(0, 0) = ""
    mili(0, 1) = "mille"
    mili(0, 2) = "milione"
    mili(0, 3) = "miliardo"
    mili(0, 4) = "bilione"
    mili(0, 5) = "biliardo"
    '   Caricamento di mili(1 ,) in formato esteso
    mili(1, 0) = ""
    mili(1, 1) = "mila"
    mili(1, 2) = "milioni"
    mili(1, 3) = "miliardi"
    mili(1, 4) = "bilioni"
    mili(1, 5) = "biliardi"
    result = ""
    sezione = 0
    If (num < 0) Then
        spell_my_int = "Minimo 0!"
    ElseIf (num > max) Then
        spell_my_int = "Massimo " & max & "!"
    ElseIf (num = 0) Then
        spell_my_int = "zero"
    Else
        numstring = CStr(num)
        Select Case (Len(numstring) Mod 3)
            Case 1
                numstring = "00" & CStr(num)
            Case 2
                numstring = "0" & CStr(num)
            Case Else
                numstring = CStr(num)
        End Select
        numlen = Len(numstring)
        'MsgBox ("Numlen: " & numlen & "  subnumero: " & numstring)
        Do While ((sezione + 1) * 3 <= numlen)
            subnumerostring = Mid(numstring, (numlen - ((sezione + 1) * 3)) + 1, 3)
            subnumero = CInt(subnumerostring)
            cifra(0) = Mid(subnumerostring, 1, 1)
            cifra(1) = Mid(subnumerostring, 2, 1)
            cifra(2) = Mid(subnumerostring, 3, 1)
            'MsgBox ("Sezione numero: " & sezione & ", cifre della sezione: " & cifra(0) & cifra(1) & cifra(2))
            If (subnumero <> 0) Then
                prime2cifre = CInt(cifra(1)) * 10 + CInt(cifra(2))
                'MsgBox (prime2cifre)
                If (prime2cifre < 10) Then
                    text(2) = mono(cifra(2))
                    text(1) = ""
                ElseIf (prime2cifre < 20) Then
                    text(2) = ""
                    text(1) = duplo(prime2cifre - 10)
                Else
                    'ventitre => ventitrè
                    If (sezione = 0 And cifra(2) = 3) Then
                        text(2) = "trè"
                    Else
                        text(2) = mono(cifra(2))
                    End If
                    '   novantaotto => novantotto
                    If (cifra(2) = 1 Or cifra(2) = 8) Then
                        text(1) = Mid(deca(cifra(1)), 1, Len(deca(cifra(1))) - 1)
                    Else
                        text(1) = deca(cifra(1))
                    End If
                End If
                If (cifra(0) = 0) Then
                    text(0) = ""
                Else
                    ' centoottanta => centottanta
                    If (Not centOOttanta And cifra(1) = 8 Or (cifra(1) = 0 And cifra(2) = 8)) Then
                        IDcent = 0
                    Else
                        IDcent = 1
                    End If
                    If (cifra(0) <> 1) Then
                        text(0) = mono(cifra(0)) & cento(IDcent)
                    Else
                        text(0) = cento(IDcent)
                    End If
                End If
                '   unomille    => mille
                '   miliardo    => unmiliardo
                If (subnumero = 1 And sezione <> 0) Then
                    If (sezione >= 2) Then
                        result = "un" & mili(0, sezione) & result
                    Else
                        result = mili(0, sezione) & result
                    End If
                Else
                    result = text(0) & text(1) & text(2) & mili(1, sezione) & result
                End If
            End If
            sezione = sezione + 1
        Loop
        spell_my_int = result
    End If
End Function

spell_my_int() in PHP

/*
	Convertitore di numeri interi in corrispettivi letterali.
	Esempio:	123 => centoventitrè
	Born:	10 Giugno 2012
	Licenza: GNU General Public License (versione 3 o successive)
	Autore: Valerio Bozzolan - Reyboz.it
*/
function spell_my_int($num, $centOOttanta=false) {
	$num	= (int) $num;
	$mono	= array("", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove");
	$duplo	= array("dieci", "undici", "dodici", "{$mono[3]}dici", "quattordici", "quindici", "sedici", "dicias{$mono[7]}", "dici{$mono[8]}", "dician{$mono[9]}");
	$deca	= array("", $duplo[0], "venti", "{$mono[3]}nta", "quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta");
	$cento	= array("cent", "cento");
	$mili	= array(
		0 => array("", "mille", "milione", "miliardo", "bilione", "biliardo"),
		1 => array("", "mila", "milioni", "miliardi", "bilioni", "biliardi")
	);
	$max	= pow(10, count($mili[0]) * 3) - 1;
	if( !is_numeric($num) ) {
		return "Non &egrave; un numero!";
	} elseif ( $num < 0 ) {
		return "Numero negativo!";
	} elseif ( $num > $max ) {
		return "Limite superato!";
	} elseif( $num == 0 ) {
		return "zero";
	}
	$result	= "";
	$sezione	= 0;
	$num	= (string) $num;
	switch( strlen($num) % 3 ) {
		case 1:	$num	= "00$num";
			break;
		case 2:	$num	= "0$num";
	}
	$numlen	= strlen($num);
	while( ($sezione + 1) * 3 <= $numlen ) {
		$cifra	= substr($num, (($numlen - 1) - (($sezione + 1) * 3)) + 1, 3);
		$numero	= (int) $cifra;
		$cifra[0]	= (int) $cifra[0];
		$cifra[1]	= (int) $cifra[1];
		$cifra[2]	= (int) $cifra[2];
		if( $numero <> 0 ) { 
			$prime2cifre	= (int) ($cifra[1] . $cifra[2]);
			if( $prime2cifre < 10 ) {
				$text[2]	= $mono[$cifra[2]];
				$text[1]	= "";
			} elseif( $prime2cifre < 20 ) {
				$text[2]	= "";
				$text[1]	= $duplo[$prime2cifre - 10];
			} else {
				//	ventitre => ventitrè
				if( $sezione == 0 && $cifra[2] == 3 ) {
					$text[2]	= "tr&egrave;";
				} else {
					$text[2]	= $mono[$cifra[2]];
				}
				//	novantaotto => novantotto
				if( $cifra[2] == 1 || $cifra[2] == 8 ) {
					$text[1]	= substr($deca[$cifra[1]], 0, -1);
				} else {
					$text[1]	= $deca[$cifra[1]];
				}
			}
			if( $cifra[0] == 0 ) {
				$text[0]	= "";
			} else {
				//	centoottanta => centottanta
				if( !$centOOttanta && $cifra[1] == 8 || ($cifra[1] == 0 && $cifra[2] == 8) ) {
					$IDcent	= 0;
				} else {
					$IDcent	= 1;
				}
				if( $cifra[0] <> 1 ) {
					$text[0]	= $mono[$cifra[0]] . $cento[$IDcent];
				} else {
					$text[0]	= $cento[$IDcent];
				}
			}
			//	unomille	=> mille
			//	miliardo	=> unmiliardo
			if( $numero == 1 && $sezione <> 0 ) {
				if( $sezione >= 2 ) {
					$result	= "un" . $mili[0][$sezione] . $result;
				} else {
					$result	= $mili[0][$sezione] . $result;
				}
			} else {
				$result	= $text[0] . $text[1] . $text[2] . $mili[1][$sezione] . $result;
			}
		}
		$sezione++;
	}
	return $result;
}

spell_my_int() in Javascript

/*
	Convertitore di numeri interi in corrispettivi letterali.
	Esempio:	123 => centoventitre'
	Born:	10 Giugno 2012
	Licenza: GNU General Public License (versione 3 o successive)
	Autore: Valerio Bozzolan - Reyboz.it
*/
function spell_my_int(numstr, centOOttanta) {
	mono	= new Array ("", "uno", "due", "tre", "quattro", "cinque", "sei", "sette", "otto", "nove");
	duplo	= new Array ("dieci", "undici", "dodici", mono[3] + "dici", "quattordici", "quindici", "sedici", "dicias" + mono[7], "dici" + mono[8], "dician" + mono[9]);
	deca	= new Array ("", duplo[0], "venti", mono[3] + "nta", "quaranta", "cinquanta", "sessanta", "settanta", "ottanta", "novanta");
	cento	= new Array ("cent", "cento");
	mili	= new Array ();
	mili[0]	= new Array ("", "mille", "milione", "miliardo", "bilione", "biliardo");
	mili[1]	= new Array ("", "mila", "milioni", "miliardi", "bilioni", "biliardi");
	text	= new Array ();
	cifra	= new Array ();
	result	= "";
	sezione	= 0;
	// In Javascript si fa così per dire che questo parametro e' opzionale, con valore false di default
	centOOttanta = centOOttanta || false;
	numstr += '';
	// Non deve cominciare per zero altrimenti parseInt() impazzisce...
	while ( numstr.substr(0, 1) == "0" && numstr.length != 1 ) {
		numstr	= numstr.substr(1, numstr.length);
	}
	num	= parseInt(numstr);
	switch( numstr.length % 3 ) {
		case 1:	numstr	= "00" + numstr;
			break;
		case 2:	numstr	= "0" + numstr;
	}
	numlen	= numstr.length;
	if( isNaN(num) ) {
		return "Non e' un numero!";
	} else if ( num < 0 ) {
		return "Numero negativo!";
	} else if ( numstr.length > 6 * 3 ) {
		return "Limite superato!";
	} else if( num == 0 ) {
		return "zero";
	}
	while( (sezione + 1) * 3 <= numlen ) {
		subnumerostring = numstr.substr(((numlen - 1) - ((sezione + 1) * 3)) + 1, 3);
		if( subnumerostring != "000" ) {
			subnumero = parseInt(subnumerostring);
			cifra[0] = subnumerostring.substr(0, 1);
			cifra[1] = subnumerostring.substr(1, 1);
			cifra[2] = subnumerostring.substr(2, 1);
			prime2cifre	= parseInt(cifra[1] * 10) + parseInt(cifra[2]);
			if( prime2cifre < 10 ) {
				text[2]	= mono[cifra[2]];
				text[1]	= "";
			} else if( prime2cifre < 20 ) {
				text[2]	= "";
				text[1]	= duplo[prime2cifre - 10];
			} else {
				//	ventitre => ventitrè
				if( sezione == 0 && cifra[2] == 3 ) {
					text[2]	= "tre'";
				} else {
					text[2]	= mono[cifra[2]];
				}
				//	novantaotto => novantotto
				if( cifra[2] == 1 || cifra[2] == 8 ) {
					text[1]	= deca[cifra[1]].substr(0, deca[cifra[1]].length -1);
				} else {
					text[1]	= deca[cifra[1]];
				}
			}
			if( cifra[0] == 0 ) {
				text[0]	= "";
			} else {
				//	centoottanta => centottanta
				if( !centOOttanta && cifra[1] == 8 || (cifra[1] == 0 && cifra[2] == 8) ) {
					IDcent	= 0;
				} else {
					IDcent	= 1;
				}
				if( cifra[0] != 1 ) {
					text[0]	= mono[cifra[0]] + cento[IDcent];
				} else {
					text[0]	= cento[IDcent];
				}
			}
			//	unomille	=> mille
			//	miliardo	=> unmiliardo
			if( subnumero == 1 && sezione != 0 ) {
				if( sezione >= 2 ) {
					result	= "un" + mili[0][sezione] + result;
				} else {
					result	= mili[0][sezione] + result;
				}
			} else {
				result	= text[0] + text[1] + text[2] + mili[1][sezione] + result;
			}
		}
		sezione++;
	}
	return result;
}

Utilizzi pratici di spell_my_int()

Utilizzo di spell_my_int() in Visual Basic:

 
' Scrivere qui il codice lungo di spell_my_int() in Visual Basic!
 
Sub prova()
	dim num as long
	dim num_in_parole as string
	num = 123
	num_in_parole = spell_my_int(num)
	msgbox(num_in_parole)
End Sub

Utilizzo di spell_my_int() in una macro VBA:

 
' Scrivere qui il codice lungo di spell_my_int() in VBA!!!
 
Sub prova()
	dim num as long
	dim num_in_parole as string
	num = 123
	num_in_parole = spell_my_int(num)
	msgbox(num_in_parole)
End Sub

Utilizzo di spell_my_int() dentro una cella di Excel: (prima bisogna copiare il codice lungo di spell_my_int() nel modulo “nomemodulo”)

=nomemodulo.spell_my_int(123)

Utilizzo di spell_my_int() in PHP:

<?php
 
// Scrivere qui il codice lungo di spell_my_int() in PHP!
 
$num	= 123;
$num_in_parole = spell_my_int($num);
echo $num_in_parole;
?>

Utilizzo di spell_my_int() in Javascript:

<script type="text/javascript">
 
// Scrivere qui il codice lungo di spell_my_int() in Javascript!
 
num = 123;
num_in_parole = spell_my_int(num);
alert(num_in_parole);
</script>

While – Utilizzi del ciclo iterativo

Premessa

Questo articolo è molto vecchio e l’autore di questa pagina nel frattempo non è più un bimbominkia e quindi si vergogna molto di quanto qui è stato scritto. Questi contenuti comunque rimarranno online per aiutare a ricordarsi di quanto si era ignoranti in Informatica solo pochi anni fa.

Ciclo infinito alert javascript - Reyboz blog

Il ciclo while si utilizza per ripetere un operazione solo finchè una funzione logica è vera. Cioè:

  • Controlla una formula logica
    • Se risulta vera esegue un comando fintanto che la funzione logica è vera
    • Se risulta falsa esce dal ciclo

Con un esempio:

  • Controlla se x è minore di 10
    • Se risulta vera esegue x=x+1 fintanto che x è minore di 10
    • Se risulta falsa esce dal ciclo

Ora che abbiamo meglio in testa cosa fa il ciclo while, proviamo a tradurre questo esempio in linguaggio javascript. Creiamo quindi una variabile x=0 e proviamo a seguire i passaggi logici sotto celati.

x=0;
while (x<10)
{
x=x+1;
}
document.write(x);

Se il valore di x in questo caso è zero (o), al termine di questo ciclo quanto varrà?

Se abbiamo capito bene il while possiamo calcolarlo semplicemente vedendo i suoi passaggi:

All'inizio x=0
Inizio ciclo
x= 0 ( 0 minore o uguale a 10? Vero. x= 0+1)
x= 1 ( 1 minore o uguale a 10? Vero. x= 1+1)
...
x=10 (10 minore o uguale a 10? Vero. x=10+1)
x=11 (11 minore o uguale a 10? Falso. Interrompi while)
Fine ciclo
→ x=11

Esattamente il risultato che ci fornirà la pagina: 11.

Utilizzi del ciclo while

Ora che abbiamo capito come funziona, proviamo ad utilizzarlo per creare un’applicazione che crea una serie di finestre window.alert in successione, a seconda di quante finestre decidiamo di visualizzare in precedenza.

Questo è il codice javascript:

contoallarovescia=10;
while(contoallarovescia==0)
{
window.alert("Mancano ancora "+contoallarovescia+" finestre!);
contoallarovescia=contoallarovescia-1;
}

Se volete potete provare il ciclo con questo link di prova. Buona navigazione.