Ping parlante

Invariabilmente, quando faccio una dimostrazione di questo script, mi chiedono: “Sì, ma a che serve?”

È un ping che oltre a scriverti a video il tempo di round-trip in millisecondi, te lo pronuncia pure. Solo uno strumento in più. Magari un giorno ti capiterà un’occasione in cui ti potrebbe far comodo.

Quando sono al computer, il feedback acustico è per me piuttosto importante. Molto banalmente, mi permette di utilizzare le orecchie, oltre che gli occhi, per ottenere informazioni dal computer. Posso verificare ipotesi e monitorizzare eventi senza guardare, anche mentre sto facendo tutt’altro. Anche da lontano, basta alzare il volume. Posso ricablare in sala cavi mentre il computer fa bip e parla in sala server, oltre la porta e dietro l’angolo, raccontandomi come sto andando. Posso sparare questo script come un fire-and-forget che mi avverta quando il provider Internet avrà ripristinato la linea, senza stare io a controllare ogni tre minuti (vero, Capo?). Posso misurare letteralmente a orecchio se la nuova configurazione del firewall sta mandando a pallino la latenza delle connessioni. Quando poi ho troppa gente in stanza accendo tutto, bip, blip, woot, crash, phweet, fiii, cip cip cip, bau, ding, che danno sui nervi a tutti quanti, e la stanza si svuota.

Lo script in questione è un file batch per Windows XP e successivi, con unico requisito aggiuntivo un qualche output audio, fisico o virtuale che sia; a volte funziona anche con Windows 2000, ma ha bisogno di componenti aggiuntivi; in altre parole può funzionare su quasi tutti i desktop e portatili odierni, e su quasi nessun server.

Ecco il codice, io lo chiamo pping.bat:

:: Titolo: “Ping Parlante”
:: Versione: 1.2
:: Data: 18-Oct-2009
:: Autore: “Alessandro Pini”
:: e-mail: md1871@mclink.it
:: File: pping.bat
:: Scopo: Utilizza il sintetizzatore vocale di Windows XP per pronunciare il tempo di ping.
:: Utilizzo: Più o meno come il ping standard senza opzioni. Attenzione, questo script è “buono abbastanza per me”, ma non è perfetto, né elegante: al momento fa tutto quello che *mi* serve, anche se in maniera piuttosto inefficiente; non sono previsti grandi miglioramenti, ma il sorgente è facilmente modificabile, accomodatevi pure.
:: History:
::     1.0 [04-Jun-2007 “Primi esperimenti; funziona al primo colpo.” “Alessandro Pini”]
::     1.1 [- “Al momento non divulgabile.” “Non divulgabile”]
::     1.2 [18-Oct-2009 “Aggiunto timestamp per ogni riga.” “Alessandro Pini”]
:: Bug noti:
::     Lo script è version-, language- e settings-dependant, cioè va adattato a seconda della versione di Windows, della lingua utilizzata (dubito che “durata” sia lungo 6 caratteri in tutte le lingue) e delle impostazioni (al momento il timestamp è l’unica cosa che mi viene in mente); come ho già scritto, è solo “buono abbastanza per me”.
::     Riporta solo risultati positivi standard: in caso di problemi l’utente viene lasciato a brancolare nel (uhm) silenzio; in quel caso, usate il ping standard.
::     Tempi inferiori a 1 ms vengono riportati come 1 ms.
::     L’HTA Ruba il focus ad ogni esecuzione, causando una specie di singhiozzo al sistema.
::     Questo header utilizza un formato ibrido liberamente ispirato a quello del linguaggio REBOL: sarebbe il caso di dargli una raddrizzata.
:: Futuro:
::     Pronuncia degli altri tipi di risultati, per esempio “Impossibile trovare l’host…”
::     Timestamp in formato fisso e non ambiguo (al momento dipende da come sono impostate le opzioni internazionali e della lingua di Windows).
::     Variazione a piacere della voce: SAPI.SpVoice.Speak permette discegliere la voce, cambiarne tono e velocità… Sembra un giochino inutile, ma se avete diverse applicazioni parlanti permette di capire “a orecchio”, immediatamente, da quale applicazione sta arrivando un certo messaggio.
::     Parametrizzazione da linea di comando (parametri, voce, file di output…)
::     Maggiore user-friendliness (per esempio, help in linea).
::     Controllo degli errori.
:: Licenza:
::     Quest’opera è stata rilasciata sotto la licenza Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Italy. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-nc-sa/2.5/it/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

:: Il prossimo comando disattiva la visualizzazione di ogni comando prima della sua esecuzione.
@echo off
:: Il prossimo comando permette di utilizzare in un certo modo le variabili all’interno dei cicli For.
setlocal enabledelayedexpansion
:inizio
:: Il prossimo comando esegue un ping quasi standard e ne scompone il risultato, mettendone le componenti in alcune variabili.
for /f “usebackq tokens=1,2,3,4,5*” %%a in (`ping -n 1 %1`) do (
:: Il prossimo comando filtra via qualsiasi riga di risultato che non sia una risposta standard.
if %%a.==Risposta. (
:: Il prossimo comando ricostruisce la risposta standard e la stampa preceduta dal timestamp (ricostruire è una pessima idea in generale, ma qui non vale la pena di fare di meglio, attualmente).
echo %date%   %time%   %%a %%b %%c %%d %%e %%f
:: Il prossimo comando assegna la durata a una variabile apposita; sì, è una variabile in più, ma aumenta la pulizia del codice a costo (denaro, tempo e risorse del computer) quasi zero.
set durata=%%e
:: Il prossimo comando elimina i primi 7 caratteri, cioè le stringhe “durata=” o “durata<“; potrebbero essercene altre, ma non ne ho incontrate e non ho verificato come si deve (o si dovrebbe).
set durata=!durata:~7!
:: Il prossimo comando sostituisce la stringa “ms” con la stringa vuota, cioè elimina “ms”.
set durata=!durata:ms=!
:: Il prossimo comando pronuncia la durata. MSHTA crea al volo un’HTA (applicazione HTML), che utilizza SAPI 5 (Speech Application Programming Interface).
mshta vbscript:CreateObject^(“SAPI.SpVoice”^).Speak^(“<sapi>!durata!</sapi>”^)^(Window.close^)
)
)
goto :inizio
:: Il prossimo comando chiude il contesto locale aperto da setlocal. Sarebbe superfluo, poiché il contesto locale viene chiuso automaticamente all’uscita dal batch, ma preferisco chiuderlo esplicitamente (mi pare più “elegante” e mi eviterà problemi in futuro se dovessi decidere di riciclare questo codice).
endlocal

Per la cronaca, WordPress ha modificato il codice sorgente che vedete qui sopra, anche se di poco: meglio scaricarlo da qui.

Questo script è un accrocco (nel senso buono, spero) che esegue a sua volta il comando ping standard di Windows. L’output di ping viene masticato dall’interprete di comandi, scrivendone un sottoinsieme a video (questa parte è discutibile sotto molti aspetti: diciamo solo che lunghe scoraggianti prove mi hanno portato alla forma attuale per aggirare bug e limitazioni dell’interprete in alcune versioni italiane). La sola durata in millisecondi viene poi pronunciata utilizzando la SAPI con uno sporco trucco. Infine si ricomincia da capo, in loop infinito. Facile, no?

Per modificare la voce, la lingua o la pronuncia, al momento l’opzione più rapida è il pannello di controllo, sintesi e riconoscimento vocale. Per quanto ne so, da qualche tempo non è più disponibile gratuitamente alcuna voce italiana decente. Suggerisco di imparare a contare in lingua inglese.

Una volta raggiunta la forma attuale dello script, ho perso lo stimolo a sviluppare oltre l’idea, dal momento che così com’è va bene a me. Ne esiste una versione leggermente migliorata, modificata da un mio ex collega. Ho richiesto il suo permesso per pubblicarla qui, citandolo come coautore. Una volta ottenuto il permesso, aggiornerò questo post.

http://en.wikipedia.org/wiki/Speech_Application_Programming_Interface

Autore: Alessandro Pini

Sinclair ZX-81;
Commodore VIC-20;
Apple ][ Europlus;
Apple //e;
Amiga 2000 (Motorola 68000);
Amiga 4000 (Motorola 68040, 68060, PPC);
Sinclair ZX Spectrum;
PC compatibile (Intel 8088 @ 4.77 MHz);
… poi ho perso un po’ il conto (due o tre, troppo simili l’uno all’altro)…
tower assemblato custom “galactica”;
tower assemblato custom “pegasus”;
IBM Thinkpad [boh? qualcosa] “defiant”;
Compaq/HP Pavilion ze4300 “defiant”;
virtual machine VMWare Server “phantom” (fu defiant);
MSI Wind U100 “defiant”;
Nokia e71 *nero* “blackbird”;
tower assemblato custom “spaceball1”;
HP Pavilion g6 “gunstar”;
Raspberry Pi 2 “lamponcino”, “rasputin”;
virtual machine assortite.

Sì, esatto, non ho mai posseduto il Commodore 64.
Non sono quel tipo di geek.

Spazio per un commento