mercoledì 12 giugno 2019

Java get or else get


Quando si ha una lista in mano in Java 1.8 lo stream e' uno strumento molto potente, puo' essere usato per un fracco di cose tra cui la trasformazione della lista in qualcos'altro. Per evitare al programmatroto una .get(0) per prendere il primo (o uno qualsiasi) della lista sempre lo stream ti viene incontro con i metodi findFirst e findAny. La differenza? Il primo ti garantisce che l'elemento sia sempre quello.

Ovviamente suddetti metodi restituisco un Optional - a questo punto avete un po' di possibilita' davanti:

  1. Ve ne battete allegramente e fate la get che c'e' c'e' (non devo dirvi perche' non e' una buona idea)
  2. Fate un ifPresent e nel caso fate la get ma son righe in piu' di codice. Che scherzi?
  3. Invocate uno dei due metodi che sono l'oggetto di questo post

Qual'e' la differenza? orElse restituisce direttamente l'oggetto passato come parametro. Quindi potete tranquillamente passare null. orElseGet (come dice il nome) fa la get su quello che gli passate (quindi dev'essere un Supplier) e non devo dirvi (di nuovo) perche' non e' una buona idea passare null.

Se invece volete lanciare un'eccezione c'e' orElseThrow




Se non sapete cosa c'incastri l'immagine con il post andatevi a cercare cosa vuol dire "stream" in Inglese


giovedì 13 dicembre 2018

Dateception


Oggi mi sono imbattuto in questo esempio di fulgida programmazione. Ho censurato le parti "sensibili" (che potrebbero fare capire da dove proviene) e numerato i punti per facilitarvi la comprensione.

  1. Inizializza una stringa con una data di default
  2. Inizializza un oggetto date ad oggi
  3. Formatta la data odierna come stringa (e la mette nella stringa di prima)
  4. Riparsa la stringa per ritrasformarla in data
  5. Salva e Persiste l'oggetto

Ma seriamente?
Prima di tutto: che senso ha inizializzare una stringa con una data di default se poi non la usi.
Poi convertire una data in stringa e riconvertirla in data. Passare direttamente la data no eh? Troppo facile...
save => salva l'oggetto (nuovo) quindi se gia' esiste va in eccezione.
persist => si gestisce il fatto che l'oggetto possa esistere (equivalente di saveOrUpdate).

Che dire? Nulla ho finito le parole...

I nostri valori


Ecco a voi un estratto da "Metello" di Vasco Pratolini. I motivi per i quali Ida viene considerata una buona ragazza...

martedì 23 ottobre 2018

Il router introverso


E via che si va. Correva l'anno... No l'anno non lo so era tra il 2008 e il 2010 e ancora lavoravo come tecnico informatico (prima di passare al lato oscuro del software). Arrivo' l'allora capo con un router che non riconosceva la password di amministratore per accedere alle impostazioni del router.

Primo pensiero: l'avranno cambiata e non se la ricordano (anche se dicono di no). Lo resetto. Effettuo il reset, attendo che il router mi confermi di essere resettato, vado sul manuale mi leggo quali sono le password di default e...

...non funzionano...

Non e' che il produttore l'ha aggiornato e si e' scordato di aggiornare il manuale? Prova tutte le combinazioni di password note con l'utente "admin".
Niente.

Rileggi il manuale e cerca online. Tutti riportano "admin" come username e "admin" come password.
Forse non mi ha preso il reset.
Ri-reset.
Nada.

Mi viene in mente una cosa: il produttore e' straniero e il manuale e' in italiano e guarda caso "admin" e' la traduzione di "root".
Non e' che...

Si era che. Il fenomeno che ha tradotto in italiano il manuale ha tradotto anche username e password...

venerdì 5 ottobre 2018

Repubblica e gli airbag


Mi sono imbattuto in questo articolo di repubblica in cui si sostiene che gli airbag siano obbligatori da almeno 30 anni.

Siccome me la ricordavo un pelino diversa sono andato a verificare... Il primo articolo che ho trovato e' dell'aci che spiega in maniera molto stringata come gli airbag non siano obbligatori. Forse troppo stringata.

Poi mi imbatto in questo da cui si ricavano un po' piu' di informazioni. Tipo che l'airbag e' obbligatorio per rispettare nel le normative Euro ma solo dal 2002 mentre non lo e' per le altre (quelle che sono state immatricolate senza). Per cui in un certo senso ha ragione l'ACI.
L'articolo pero' aggiunge un'informazione su quando e' stato il primo collaudo degli airbag e sulla cifra, almeno, Repubblica ci ha preso...

mercoledì 3 ottobre 2018

Antibufala iperfast: scafisti per necessita scarcerati

Aggiustero' l'articolo forse dopo.
Comunque ipervelocemente: basta leggere le motivazioni della sentenza.

L'articolo e' qui.

Gli imputati si sarebbero messi alla guida delle imbarcazioni per scappare dall'inferno dei lager dov'erano rinchiusi in Libia.  

I tizi scarcerati non erano scafisti. Erano gente normale che ha guidato il gommone per sfuggire dalla Libia.


Praticamente degli scafisti per caso (scusate non ho resistito a fare la battuta anni '90)...

Perl chiamare altri script


Oggi ci occupiamo di come si possa (tramite perl) invocare altri script perl.
C'e' anche il verso di farsi restituire l'output a me non interessava quindi per il momento non lo trattero'.

Ho creato due script di prova (hello.pl e hello2.pl) che non fanno altro che scrivere una riga (diversa!) in console.
Come prerequisito e' che tutti gli script stiano nella stessa directory del "lanciatore" (ma se nell'array specifichi il nome assoluto del file dovrebbe funzionare lo stesso).
Mi creo un array dove ficco tutti i nomi degli script da eseguire (in modo da essere piu' flessibile nel caso si aggiungano script) ciclo sull'array e li eseguo tramite system

my @script = ('hello.pl', 'hello2.pl');

foreach(@script){
     system("perl $_");
}

Finito! Ovviamente se gli script sono sparsi da altre parti dovete specificare il path assoluto (ma non ho provato quindi non sono sicurissimo che funzioni)