lunedì 21 gennaio 2019

Trovare i file in tutte le sottocartelle con il comando DIR (e filtrarli, se necessario) - episodio 1

Buongiorno e benvenuti ad un altro episodio del mio blog, nel quale cerco di riportare in auge la potenza degli script e della command line per l’amministrazione e la gestione dei sistemi.

Oggi parliamo del comando DIR e delle sue potenzialità inespresse.

Può capitare infatti che ci venga richiesto di elencare solo determinati tipi di files in TUTTE LE SOTTODIRECTORY di un albero di cartelle.

Che fare dunque? Andare ad aprirle tutte a mano? Ma certo che NO!

Premessa

Per seguire questo articolo è necessaria una minima conoscenza del comando DIR. Minima minima…
… almeno averlo usato una volta nella vita…

Tutta la potenza di DIR

Vediamo insieme l’help di DIR, così da capire quali sono le moltissime potenzialità, spesso sconosciute, di questo comando di sistema, tra i più vecchi ed affidabili della storia dell’informatica.

C:\Users\DiegoC>dir /?
Mostra l'elenco dei file e delle sottodirectory in una directory.

DIR [unità:][percorso][nomefile] [/A[[:]attributi]] [/B] [/C] [/D] [/L] [/N]
  [/O[[:]ordinamento]] [/P] [/Q] [/R] [/S] [/T[[:]campo data]] [/W] [/X] [/4]

  [unità:][percorso][nomefile]
              Specifica unità, directory e/o file da elencare.

  /A          Visualizza i file con gli attributi specificati.
  attributi    D  Directory                  R  File sola lettura
               H  File nascosti              A  File archivio
               S  File di sistema            I  File non indicizzati
               L  Reparse point             - Prefisso per negare l'attributo
  /B          Utilizza lista file senza intestazione o informazioni di
              riepilogo.
  /C          Visualizza il separatore delle migliaia nelle dimensioni dei
              file. Impostazione predefinita. Utilizzare /-C per disabilitarla.
  /D          Come /W ma con i file ordinati per colonna.
  /L          Utilizza caratteri minuscoli.
  /N          Nuovo formato lungo, con nomi file a destra.
  /O          Elenca file ordinandoli.
  ordinamento  N  Per nome, alfabetico       S  Per dimensione, dal minore
               E  Per estensione, alfabetico D  Per data e ora dal più vecchio
               G  Mostra prima directory     - Prefisso per invertire l'ordine
  /P          Mostra elenco una schermata per volta.
  /Q          Mostra il proprietario del file.
  /R          Visualizza flussi di dati alternativi del file.
  /S          Mostra file della directory e delle relative sottodirectory.
  /T          Controlla campo data visualizzato o utilizzato per ordinare.
  campo data  C  Creazione
              A  Ultimo accesso
              W  Ultima scrittura
  /W          Visualizza in formato ampio.
  /X          Mostra i nomi brevi generati per i nomi con formato lungo.
              Il formato è come quello di /N con nomi
              abrevi prima del nome esteso. Se non ci sono nomi brevi
              vengono visualizzati spazi bianchi.
  /4          Mostra l'anno in formato 4 cifre

Le opzioni possono essere preimpostate nella variabile d'ambiente DIRCMD.
Le opzioni preimpostate vengono annullate con un trattino, es./-W.



Non mi soffermerò qui sui comandi più banali di DIR, perché, come detto, mi aspetto che almeno il minimo lo abbiate già fatto (dir *.*, dir c:\test\, dir /W, …) ma andrò direttamente al “succo” dei comandi + interessanti.

/S e /B combinati: preparare l’output perché venga usato come input da un altro comando.

Come avete potuto apprezzare nell’help, il /S prevede che la ricerca non si fermi alla prima cartella / directory dell’albero, mentre il /B prevede che l’output sia un semplice elenco di file e cartelle, senza informazioni di intestazione etc… vediamo due esempi:

dir /S 




dir /B 



Ma che succede se combiniamo queste due opzioni?

La cosa mitica è che vedremo un elenco di files e cartelle, senza intestazioni o informazioni, con TUTTO IL LORO PERCORSO ASSOLUTO.
Questo è fantastico se dobbiamo, ad esempio, eseguire un comando su ogni file di un certo tipo in tutte le sottocartelle (come vedremo + avanti nell’articolo)

Dir /S /B




Come elencare solo le directory in tutte le sottocartelle

Come abbiamo visto nell’help, l’opzione del comando che filtra per determinati attributi è /A, combinata con una lettera che indica l’attributo, appunto, da cercare.
Possiamo, ad esempio, cercare solo le CARTELLE:

dir /AD /S



… e se le vogliamo vedere tutte una dietro l’altra (come detto nel paragrafo precedente):

dir /AD /S /B


Come trovare tutti i files nascosti 

Ecco come, con il parametro del comando /A è possibile filtrare per altri attributi.
Ho infatti assegnato al file C:\interventi\test\10000\10001\testTxtfile.txt gli attributi di NASCOSTO e SOLA LETTURA.

E' possibile inoltre filtrare in modo NEGATIVO, escludendo i files e le cartelle con un determinato attributo, con la NEGAZIONE per mezzo del meno. Avremo che:

dir /A-DH /S /B 



significa: trova tutti i files che NON sono cartelle E che HANNO l'attributo nascosto (hidden - file nascosti)

Come elencare / listare solo i files di tipo … escludendo le cartelle

… xml, pdf, word, docx, excel, xlsx, … insomma: ci potete mettere quello che volete, alla fine dei 3 puntini…
Di fatto vi basta aggiungere un *. nell’opzione [nomefile] del comando, per filtrare / selezionare SOLO i file con una certa estensione in TUUUTTO l’albero delle cartelle.

Ed ecco qui un paio di esempi:

dir /A-D /S /B C:\interventi\test\*.xlsx
dir /A-D /S /B C:\interventi\test\*.pup
dir /A-D /S /B C:\interventi\test\*.txt



Come avete visto, utilizzo il /A-D per escludere volontariamente le cartelle, perché le cartelle POSSONO contenere il punto nel nome… quindi ci possono essere dei falsi positivi e poi, hey: l’ho detto che parlavo solo dei comandi “avanzati”, giusto? 😊



… per oggi abbiamo finito …

Presto invierò il secondo articolo di questa mini-serie sul poderoso comando DIR. Nel frattempo:
HAPPY SCRIPTING!


sabato 19 gennaio 2019

dsget, dsquery, dsadd, dsmod - strumenti sottovalutati se siete amministratori di rete - Quarta parte: dsmod

Buongiorno a tutti, questa è la "puntata conclusiva" di questa mini-serie sui mitici strumenti batch per l'interazione con Active directory : dsquery, dsget, dsadd, dsmod. 




Oggi parliamo di DSMOD

Dsmod, come suggerito dal nome, serve per modificare oggetti di Active Directory dalla command-line.

Ecco quindi, per le vie brevi, cosa possiamo modificare con dsmod (dall'help del comando):
  • dsmod computer - Modifica un computer esistente nella directory.
  • dsmod contact - Modifica un contatto esistente nella directory.
  • dsmod group - Modifica un gruppo esistente nella directory.
  • dsmod ou - Modifica un'unità organizzativa esistente nella directory.
  • dsmod server - Modifica un'istanza di controller di dominio Active Directory o di AD LDS esistente nella directory.
  • dsmod user - Modifica un utente esistente nella directory.
  • dsmod quota - Modifica una specifica di quota esistente nella directory.
  • dsmod partition - Modifica una specifica di partizione esistente nella directory.

Come detto in precedenza, ogni comando ha un suo help contestuale a cui si può accedere con dsmod -?

... ecco a questo punto un paio di esempi:

Modificare un utente active directory da command line:

Sono tante le caratteristiche di un oggetto utente in AD, molte delle quali si possono modificare con dsmod. Per un elenco completo di quello che è possibile cambiare, come sempre: dsmod user -?

ecco dunque il nostro comando:

dsmod user "CN=Dieguito C,OU=ZZZ_TEST,DC=miodominio,DC=local" -desc "prova2 di descrizione - modificata" -disabled yes


ed ecco i risultati



Modifcare un gruppo di AD con uno script batch:

I gruppi sono oggetti un attimo meno complessi come numero di proprietà. Anche in questo caso, usate l'help per sapere quali potete cambiare con dsmod.

digitiamo quindi:

dsmod group "CN=tst_DLsecGroup,OU=ZZZ_TEST,DC=miodominio,DC=local" -desc AAAAAA


ed otterremo:




Rimuovere o aggiungere un utente ad un gruppo di Active directoy con dsmod da command line:

Tra le cose che si possono modificare di un gruppo di AD, c'è l'elenco membri. Utilizzando le opzioni: -addmbr | -rmmbr | -chmbr, possiamo modificare a piacimento l'elenco dei membri del gruppo.

ad esempio, se vogliamo rimuovere l'utente:

dsmod group "CN=tst_DLsecGroup,OU=ZZZ_TEST,DC=miodominio,DC=local" -rmmbr "CN=Dieguito C,OU=ZZZ_TEST,DC=DASItalia,DC=local"



ed otterremo il risultato






FINE

Spero di aver solleticato la vostra creatività, scriptomani.

Happy scripting!

venerdì 18 gennaio 2019

dsget, dsquery, dsadd, dsmod - strumenti sottovalutati se siete amministratori di rete - Terza parte: dsadd

Buongiorno a tutti, oggi continuiamo a parlare dei mitici strumenti batch per l'interazione con Active directory services: dsquery, dsget, dsadd, dsmod.

Oggi parliamo di DSADD

Dsadd, come suggerito dal nome, è uno strumento per aggiungere oggetti ad Active Directory.
Ecco, dall'output della guida del comando, cosa si può fare con dsadd.

dsadd computer - Aggiunge un computer alla directory.
dsadd contact - Aggiunge un contatto alla directory.
dsadd group - Aggiunge un gruppo alla directory.
dsadd ou - Aggiunge un'unità organizzativa alla directory.
dsadd user - Aggiunge un utente alla directory.
dsadd quota - Aggiunge una specifica di quota a una partizione
di directory.

In sintesi, per ogni "gusto" di dsadd si possono aggiungere ad Active Directory oggetti di una determinata tipologia.
Per un elenco delle tipologie di oggetto che possono essere aggiunte, potete lanciare il comando seguito da /? o -? . Come ad esempio:
dsadd group -?

Chiaramente, anche oggi, non andremo a sviscerare tutte le possibilità offerte dal coando, ma prenderemo ad esempio alcune situazioni comuni:

Premessa: il DistinguishedName

Se non avete ben chiaro cosa è il DN di un utente o, in generale, di un oggetto AD, beh, andate a vedervi il primo articolo di questa serie, poi tornate qui.


Aggiungere / Creare un utente Active Directory da batch:

Con dsadd è possibile creare utenti active directory da script e, contestualmente, impostare molte delle proprietà possibili dell'oggetto. In questo esempio vedremo come creare un nuovo utente specificando nome, cognome, nome visualizzato, una descrizione, il telefono dell'ufficio e, ovviamente, lo username e la password.

ecco qui:
dsadd user  "CN=Dieguito C,OU=ZZZ_TEST,DC=miodominio,DC=estensione"-fn Diego -ln Castelli -display "Castelli Diego TEST" -desc "Utente di test - da cancellare" -samid DieguitoC -hometel "+39123456789" -pwd "PasswordDiProva..12345"




... ed ecco il nostro risultato comparire nella OU zzz_test, come specificato.



Aggiungere / Creare un gruppo Active Directory con uno script:

Con dsadd possiamo aggiungere anche gruppi, sempre specificando molte delle loro caratteristiche. Qui creiamo un gruppo, sempre nella nostra OU di test, definendo che è un gruppo di sicurezza, che ha scopo locale al dominio e la sua descrizione.

Come si può notare dal contenuto della guida dsadd group -? è possibile anche aggiungere membri al gruppo mentre lo si sta creando. E noi, in questo esempio, aggiungeremo ANCHE il nostro utente appena creato al gruppo.


ecco il comando:
dsadd group "CN=tst_DLsecGroup,OU=ZZZ_TEST,DC=miodominio,DC=local" -secgrp yes -scope l -desc "gruppo di sicurezza di test - da cancellare" -members "CN=Dieguito C,OU=ZZZ_TEST,DC=miodominio,DC=local"
dsadd operazione riuscita:CN=tst_DLsecGroup,OU=ZZZ_TEST,DC=miodominio,DC=local




...ed ecco il nostro risultato comparire bello e pronto nella nostra OU:

Aggiungere / Creare una OU Active Directory con un .bat:

ed eccoci arrivati all'ultimo esempio che ho intenzione di trattare: inserire una OU, una organizational unit (o unità organizzativa) in active directory, usando solo "la forza" del nostro amato linguaggio di scripting...

a differenza degli altri esempi, le propietà che possono essere impostate già durante la creazione dell'oggetto OU sono ... UNA SOLA. Infatti una OU non ha molte proprietà e possiamo impostare, oltre ovviamente al suo percorso, solo una descrizione.

ed ecco qui il comando:
dsadd ou "OU=TEST-subOU,OU=ZZZ_TEST,DC=DASItalia,DC=local" -desc "descrizione della OU"





bene, spero di avervi fatto venire voglia di creare mille script per automatizzare tutti gli aspetti di gestione utenze...

Happy Scripting!

lunedì 14 gennaio 2019

Android e WiFi: tutte le soluzioni (ovvero: perché Android non vede una rete wifi)

Da tempo vi state arrovellando il cervello per capire perché il vostro smartphone android ...

... non vede la rete wireless?



Beh, tenetevi forte perché adesso vedremo una carrellata di possibili motivazioni e, per ciascuna, la soluzione.

Capita talvolta che il nostro amato cellulare “intelligente” non sembri poi così “smart”. Soprattutto quando siamo gli unici in mezzo ad altri che non riescono a navigare con la wi-fi ospiti nella hall di un albergo oppure di un ristorante.

Tra le mura domestiche, poi, se il nostro android “jelly bean”, “kitkat” o “Lollipop” non prende nemmeno la rete wireless di casa… … ci arrabbiamo talmente tanto che ci verrebbe voglia di lanciarlo fuori dalla finestra e sostituirlo subito con un nuovissimo dispositivo Android “Pie” o, al più , “Oreo” (e forse questo ci da anche la “scusa” per farlo).

Ma che fare se, anche sostituendo il device, questo non prende la wifi?

Oppure ancora, che fare se proprio non vogliamo abbandonare il nostro smartphone, sia esso aggiornato a “Nougat”, “Marshmallow” o ancora a “KitKat”?     

Vediamo di seguito una carrellata su molte delle cause più comuni di questa disfunzione e come risolvere in ciascuna situazione.


DISCLAIMER:
Prima di tutto, mettiamo in chiaro una cosa: se decidi di seguire queste procedure, lo fai a tuo rischio e pericolo. Soprattutto quelle “rischiose”, che coinvolgono la modifica di qualsiasi cosa a livello non standard. Se qualcosa non funziona o si rompe, non venire da me.


Problema 1: ci si sta provando a connettere a una rete 5GHz, avendo attivato solo la banda 2.4 GHz, o vice-versa.

Non so se lo sapete, ma il segnale WiFi può attestarsi su due “macro-bande” di frequenza: 2.4 GHz e 5 GHz.
I telefoni moderni ed i computer, hanno tutti una scheda che permette di funzionare ad entrambe le frequenze. Tuttavia, in android, esiste una impostazione che permette di selezionare se attivare la compatibilità con una sola o entrambe le frequenze.

Soluzione: verificare che l’impostazione permetta la banda della rete WiFi a cui ci vogliamo connettere

Recarsi su impostazioni->Wireless e reti->Wi-Fi poi cliccare sul tasto menu (i tre puntini) e scegliere avanzate. Quindi selezionare Banda di Frequenza Wi-Fi e scegliere “Automatica”, nel caso in cui si voglia consentire al telefono di usare reti wireless sia a 2.4 GHz che a 5 GHz.





Problema 2: è attiva l’impostazione “Evita connessioni deboli”

Se invece la rete wireless la vedete, ma non riuscite a rimanere connessi, può darsi che sia attiva l’impostazione “Evita connessioni deboli”. Questa opzione permette di switchare indietro all’uso della connessione cellulare, nel caso la connessione ad internet della wifi fosse lenta o instabile. In pratica il telefono “verifica la qualità” della connessione.

Soluzione: disattivare l’opzione

Per disattivare questa opzione recarsi su impostazioni->Wireless e reti->Wi-Fi poi cliccare sul tasto menu (i tre puntini) e scegliere avanzate. Infine togliere la spunta a “Evita connessioni deboli”.






Problema 3: su Android è impostato male il “regulatory domain” o il canale (Channel) del Wi-Fi

Il Regulatory Domain è uno spettro di frequenze utilizzabili dal wifi che, per convenzione internazionale, cambia da paese a paese. In sintesi, la wi-fi negli Stati Uniti potrebbe usare frequenze diverse da quelle usate in Italia ed ANCHE potenze di trasmissione massime diverse.

Se volete approfondire:
Se su android avete impostato un regdomain diverso da quello della nazione in cui siete (magari avete inavvertitamente modificato qualcosa o un amico smanettone ha deciso di farvi uno scherzo), il vostro telefono potrebbe non rilevare la rete o non connettersi correttamente.
Il canale e la “region” del wireless, in android, vengono teoricamente assegnati dalla SIM (si, dalla SIM), in quanto riconosce il paese in cui si sta utilizzando il dispositivo. Tuttavia talvolta questo meccanismo può non funzionare in modo perfetto…
Ecco quindi alcune possibili soluzioni.

Soluzione 1: attivare la geolocalizzazione e riavviare

Attivando la geolocalizzazione, c’è la possibilità che il telefono “capisca” da solo dove si trova e quale canale/frequenza deve utilizzare con il WiFi.

Soluzione 2: cambiare il canale e/o il regulator domain sul router.

É più avveduto, se non si sa esattamente quello che si sta facendo, cercare di cambiare il canale sul router, che potrebbe avere impostato un canale fuori dal range accettabile per lo smartphone (si dice che alcuni cellulari avessero problemi con i canali superiori a 11).

Per fare ciò, è necessario consultare il manuale del vostro router, perché non tutti i router sono uguali e le istruzioni cambiano troppo significativamente da modello a modello.

Soluzione 3: modificare il canale wifi di android (sconsigliato)

In generale, se non sai esattamente cosa stai facendo, ti sconsiglio di proseguire per questa strada. Tuttavia, se proprio non riesci in altro modo a connetterti alla rete e questo sta pregiudicando una parte importante della tua giornata, ecco una soluzione un po’ drastica ma efficace:
Un membro della nota community xda-developers ha sviluppato una utility che si chiama “WiFi Codes”.
Questa utility è in grado di accedere alle configurazioni del wifi del telefono android e cambiare il regulatory domain.
Ecco il link (in inglese) alla pagina del progetto sulla community, con tutte le istruzioni.




Problema 4: la rete a cui ci si vuole connettere è una rete ad-hoc e si dispone di uno smartphone Android che non supporta le reti ad-hoc

Se la rete a cui stiamo tentando di connetterci è una rete ad-hoc, dovete sapere che Android non supporta ufficialmente questo tipo di connessioni. Ci sono varie notizie sul fatto che con le ultime versioni di android questo ostacolo sia finalmente scomparso, tuttavia il problema rimane per le versioni precedenti.

Soluzione: modificare il wpa_supplicant con i permessi di root

Molto tempo fa ho scritto un articolo su come abilitare le reti ad-hoc su android, addirittura direttamente sul dispositivo, senza utilizzare il PC… Ecco il link

In sostanza si deve trovare e scaricare (magari da una fonte sicura, come xda_developers) una versione modificata del wpa_supplicant per il proprio dispositivo e versione android e sostituirlo a quello originale (mi raccomando fare il backup), utilizzando i permessi di ROOT.




Ecco, in questo articolo vi ho dato una carrellata dei problemi secondo me più comuni e della loro soluzione, quando android non si connette ad una rete WiFi.



Spero di essere stato utile a qualcuno e, in ogni caso, happy scripting a tutti!

giovedì 20 dicembre 2018

Emulazione di tastiera ITALIANA per arduino - episodio 1 - Lo Scriptomane



(per i processori ATMEL che supportano USB nativamente)


Buongiorno a tutti!
Questo è il mio primo post su Arduino, spero vi sia utile.
Oggi vedremo come sia possibile emulare una tastiera con Arduino. Inoltre, con un po' di nazionalismo, vedremo come "rientrare" nelle tastiere supportate dalla libreria, dato che la keyboard language localization della libreria integrata nell'arduino IDE è SOLO AMERICANA.

Arduino è grande e mitico

Per prima cosa bisogna dire che Arduino, il progetto open hardware tutto italiano che ha avuto un successo mondiale, permette di prototipare rapidamente progetti di elettronica e costruire… …beh praticamente qualsiasi cosa vogliate (se avete tempo e budget infiniti, ovvio).
Essendo io appassionato di informatica, ovviamente ho cominciato subito a pensare ad interfacciarlo con il PC e dopo un bel po’ ecco la prima applicazione pratica (nel campo della cybersecurity e, nello specifico, nel penetration testing).

La USB Rubber Ducky

Un'altra premessa da fare: la rubber ducky è un famoso (nel campo della cybersecurity) strumento dell’altrettanto famoso (nel medesimo campo) show di YouTube: Hak5.
In sostanza si tratta di un piccolo dispositivo per Keystroke Injection Attacks (debuttati in grande proprio con la sua invenzione): emula una tastiera e comincia a lanciare comandi "alla massima velocità".
L’emulazione di tastiera e/o di altri dispositivi di input “HID” (Human Interface Device) apre le porte a tutta una serie di possibilità circa gli attacchi fisici perpetrabili in regime di penetration testing “red team”.
Come può un computer ritenere dannosi i comandi che il suo stesso utente inserisce dalla tastiera?...

Insomma: un tool spaziale, in particolar modo per chi, come me, si intende di scripting.
VOLEVO AVERLO.

Se non altro per "evangelizzare" i miei utenti e conoscenti circa la buona pratica di bloccare il pc prima di allontanarsene... ... quando si è in ufficio o in un luogo a cui hanno accesso altre persone, ovviamente... Quando siamo a casa in pantofole e andiamo a farci il caffè NON SERVE!

Non siamo paranoici; solo "quasi paranoici". :-)

Ecco, però, c'erano dei “piccoli problemi”:

1 – il costo: la USB Rubber Ducky cost 45 dollari (senza contare l’iva e le tasse doganali di farsi spedire qualcosa dall’america, questione che io ho sperimentato sulla mia pelle, nel 2006 circa, facendomi inviare dei gadget Microsoft riservati ai Microsoft Certified Professionals)

2 – la distanza: al tempo in cui avevo guardato io, nemmeno la spedivano in Italia.

La soluzione

Ho quindi cominciato a pensare come fosse possibile COSTRUIRNE una partendo dal “mio amico” Arduino (e magari molto più economica).
Cercando su internet ho subito cominciato a trovare molto materiale ed ho scoperto di “non essere solo”. Tuttavia mi sono subito scontrato con la prima difficoltà: gli Arduino che avevo in casa non potevano emulare la tastiera.

Con QUALE Arduino è possibile farlo

Eh, si, perché NON TUTTI GLI ARDUINO SONO UGUALI…. Infatti, nelle sue versioni + vendute (UNO e NANO, ad esempio) montano una MCU (la CPU dei microcontrollori) a 8 bit di tipo ATMega 328 che NON SUPPORTA il protocollo USB.
Se vi state domandando come fa Arduino a connettersi con la USB beh, la risposta è davvero semplice: montano, embedded sulla scheda, un convertitore USB/Seriale standard. Questo CHIP permette di tradurre il linguaggio USB per parlare (in seriale) con Arduino.
Alcune MCU della ATMEL (che sono le MCU che “danno vita” ad Arduino), tuttavia, supportano nativamente il protocollo USB ed è quindi possibile programmarle per emulare un dispositivo non appena vengono connesse.

Fantastico!

Sul sito della Microchip (che ha recentemente comprato ATMel), è possibile scaricare una scheda specifiche che consente di capire quali MCU solitamente montate su Arduino supportano USB nativamente.
Se non avete voglia di leggere o non siete curiosi, vi basta sapere che ATMega 32u4 (montato su Arduino Pro Micro) lo supporta.

Un altro problema: la libreria standard è solo US (americana)

Ecco quindi, dopo l’arrivo del tanto atteso pacchetto da Amazon con l’arduino PRO MICRO (che, nella mia versione, monta un ATMega 32u4), che mi sono messo al lavoro per testare per benino la libreria Keyboard.h di Arduino per scoprire… … con sommo orrore che la tastiera emulata è SOLO Americana e che non è supportata ufficialmente la localizzazione.

Il problema di ALT-GR

Fin qui, non ero ancora scoraggiato, perché aprendo il codice sorgente della libreria ho visto che esistevano definizioni di costanti e array di mappatura che potevano essere modificate, quindi… … mi sono messo al lavoro, soprattutto per capire se qualcuno lo avesse già fatto… purtroppo le mie prime ricerche non mi hanno portato lontano ed ho incontrato anche il problema dell’ALT-GR.
Infatti, in Italia, alcuni caratteri speciali ESSENZIALI per gli script (come ad es. le parentesi graffe {} o “curly braces”) richiedono la pressione di più di un tasto modificatore (es ALT-GR + SHIFT + è = “{“ ) e questo non solo non è supportato dalla libreria (e potrete trovare anche un sacco di post e thread in giro che ne parlano e lo asseriscono come se fosse un problema inevitabile), ma NON E’ PROPRIO CONTEMPLATO!
Ero abbattuto, ma non volevo rinunciare… stavo pensando di “sniffare” la USB della mia tastiera per capire la bitmap del segnale che passava mentre premevo alt-gr e altri modificatori, per poi applicare le operazioni BITWISE con le costanti a mano all’interno della libreria…
… ed ecco che il mio amico PAK mi ha tirato fuori dal cilindro la soluzione: NON SOLO qualcuno aveva già fatto il lavoro, ma lo aveva fatto per QUASI TUTTE LE LINGUE! (e a me interessa solo l’italiano… :-) ).

La soluzione ALT-GR e il link dove scaricare tutte le asciimaps

Su Github, quel BENEFATTORE dell’umanità che ha nickname Nurrl, ha persino creato un GENERATORE di librerie modificate per la propria localizzazione di tastiera!
Ora, io non sono un fan delle sovrastrutture, quindi ho aperto il js, ho visto cosa faceva e, in sostanza, ho preso il file della localizzazione ed ho effettuato le stesse operazioni a mano, ricavando la libreria modificata.
Inoltre, dato che avevo ricevuto dal cielo il lavoro più grosso già fatto, mi sono anche preso la briga di modificare il nome ed i metadati della libreria, creandone di fatto una copia che ho chiamato KeyboardIT (senza cambiare il nome delle classi, anche per mantenere impossibile inizializzare 2 lib keyboard nello stesso progetto).

Ed ecco, la allego al post, così che la possiate scaricare ed usare direttamente (va messa la cartella dentro “libraries” nelle sottocartelle del programma Arduino IDE)


Un programma per testare la nostra nuova tastiera

Ecco qui un piccolo programmino che testa i caratteri speciali che si possono fare ed elenca quelli che invece sono, ahimè, per ora, proibiti. Dico per ora perchè magari troverò delle altre soluzioni mirabolanti da "fondere" con questa.. 


#include
void typeKey(int key)
{
  Keyboard.press(key);
  delay(50);
  Keyboard.release(key);
}
/* Init function */
void setup()
{
  // Begining the Keyboard stream
  Keyboard.begin();
  delay(1500);
  Keyboard.press(KEY_LEFT_GUI);
  Keyboard.press('r');
  Keyboard.releaseAll();
  delay(200);
  Keyboard.print("notepad");
  delay(500);
  typeKey(KEY_RETURN);
  delay(750);
  Keyboard.print("SpecialChars");
  typeKey(KEY_RETURN);
  delay(200);
  //Keyboard.print("ALL SPECIAL - {}|\\!\"$%&/()=?'^[]+-_.:,;"); //FUNZIONA CON LA LIBRERIA MODIFICATA
  //èéòçà°ù§ì£5€`~ sono PROIBITI, secondo la libreria
  // £ apre EDGE sulla guida di windows (F1?) e Si disconnette la seriale di Arduino con uno dei caratteri speciali che seguono (RISCHIOSO?). stringa iniziale {}|\\!\"£$%&/()=?'ì^[]+ùàò-_.:,;
  // ` è il CAPS LOCK...
  // ho tolto i caratteri proibiti adesso
  Keyboard.print("ALL SPECIAL - {}|\\!\"$%&/()=?'^[]+-_.:,;"); //OK, SONO TUTTI OK, QUESTI
  typeKey(KEY_RETURN);
  delay(200);
  // Ending stream
  Keyboard.end();
}
/* ######################################################  Keyboard Layouts #########################################
 * http://ascii-table.com/keyboard.php/103P-1  <- inglese="" o:p="" us="">
 * http://ascii-table.com/keyboard.php/142   <- italiana="" o:p="">
*/
/* */
void loop() {}



Conclusioni

Ecco, finalmente anche noi italiani siamo in grado di emulare la tastiera con il nostro arduino.

Happy Scripting e Merry Christmas a tutti!

mercoledì 19 dicembre 2018

Script Batch con parametri nominali

Buongiorno a tutti, eccoci oggi a parlare di un altro argomento di scripting ultra-classico:
i parametri con nome. Pronti?

Vuoi sapere come usare gli slash per assegnare i parametri di un file .bat?


Vuoi sapere come passare parametri/variabili ad uno script senza bisogno di rispettare un ordine preciso?


Vuoi che i tuoi script batch risultino professionali a chi li usa?


Ecco lo script che fa per te. Vediamo insieme:

Come usare i parametri nominali con batch.

In sostanza qui si tratta di permettere di inserire parametri così:
ilmioscript.bat /nomeDir:cartella1 /numFiles:25

invece che così:
ilmioscript.bat cartella1 25

Ma quanto fa più "figo" richiamare uno script nel primo modo? 

E inoltre NON CI SI DEVE RICORDARE LA POSIZIONE DEI PARAMETRI!

La cosa è molto molto semplice in realtà e non so davvero perchè nessuno lo faccia, in giro per il mondo...
.. basta parsare il parametro "%*", che contiene TUTTI I PARAMETRI passati allo script nella command line e quindi "splittare" per slash (" / ") e per due punti (" : "), usando il trick delle variabili con nome dinamico (spiegate in quest'altro mio POST).


Ma bando alle ciance, vediamo come si fa:


@echo off
setlocal enabledelayedExpansion

FOR %%x IN (%*) DO (
    set riga=%%x
    FOR /F "delims=/: tokens=1,2,*" %%a IN ("!riga!") DO (
        set %%a=%%b
        REM echo %%a e' Uguale a %%b ?
    )
)
echo nick=!nick!
echo nome=!nome!
echo cognome=!cognome!
echo.




Come avete visto, passando tutti i parametri (separati da spazio, comportamento di default del ciclo FOR) in %* e poi "splittandoli" con il metodo del "nested for" (come già visto per altro nel mio mitico POST: Come prendere l'output di un comando e impostarlo come variabile), definendo qindi tutto ciò che sta prima dei " : " come NOME della variabile e tutto ciò che sta dopo come VALORE... ecco raggiunto il nostro scopo con pochissimo sforzo...

Da oggi, se dovete parametrizzare qualcosa in batch sono convintissimo che userete questo metodo: è troppo più comodo e bello!


Happy Scripting a tutti e Buone Feste!

martedì 18 dicembre 2018

Variabili con nome dinamico e ARRAY in batch

Buongiorno a tutti, oggi vediamo come utilizzare un trick molto speciale con il nostro amico batch...

... vediamo come "usare variabili con nome variabile" nei nostri script .bat

In inglese si potrebbe ricercare "Dynamic Variable Names in Batch"
ossia "Nomi di variabile dinamici in batch"


Con un po' di impegno vedremo anche come utilizzare una pseudo ARRAY (matrice).
Dico "pseudo" perchè le array non esistono davvero in batch: si tratta di usare un nome particolare di variabile per farlo "sembrare" una array (es: %a[0]%, che si ottiene con: set a[0]=xxx) ed utilizzarlo come tale.


Ci sono almeno un milione di casi in cui questo è utile, ma ne cito qui solo un paio:

  • memorizzare in variabile le risultanze di un comando in un For loop, salvandole in una variabile diversa e indicizzata per numero di ciclo (%a[123]% contiene la risultanza del 123esimo ciclo).
  • richiamare una variabile diversa in base al risultato di un comando o di una operazione, che da come risultato il nome di quella variabile (lo so: sono contorto ma, fidatevi, mi è capitato).

Ma ecco, vediamo come fare, in questo script con alcuni esempi.

@echo off
REM è NECESSARIO usare la DelayedExpansion, sia perchè così possiamo usare sia il punto esclamativo che il percentuale come
REM delimitatori, sia perchè solitamente le variabili con nome dinamico sono all'interno di un loop.
setlocal EnableDelayedExpansion


REM settiamo %a% = alla stringa pippo e poi settiamo la variabile %pippo%
set "a=pippo"
set "pippo=ciao, questo e' un messaggio che verrà richiamato solo se sai il mio nome variabile"

REM quindi, per mezzo di questa bellissima DOPPIA NOTAZIONE con il ! e il %, richiamiamo la variabile %pippo%
echo !%a%!

REM ######################## ESEMPIO 2: ARRAY e FOR LOOP con Dynamic Variable name.

for /L %%c in (1,1,50) DO (
    set array[%%c]=siamo nel ciclo %%c
)
echo !array[25]!
REM come vedete becchiamo ESATTAMENTE la variabile 25.


BENE! spero di avervi solleticato abbastanza con questo tema.
Buone Feste a tutti e, come sempre, Happy Scripting!