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)

martedì 11 settembre 2018

Java Telegram Bot


Breve appunto di come si ho fatto per fare un bot in java per telegram e di come l'ho fatto funzionare su tomcat8 e su jboss 10 + configurazione proxy.

Prima di tutto perche' un bot? Beh un bot che ti risponde su un'app di messaggistica istantanea ha delle potenzialita' notevoli, per esempio ti permette di interagire con l'applicativo senza essere loggato sull'applicativo stesso direttamente dal cellulare ovunque tu sia, e' una bella comodita'. Mi incuriosivano le potenzialita' del bot quindi mi sono detto: perche' no?

Primo passo:
le dipendenze. Se usate maven

<dependency> <groupId>org.telegram</groupId> <artifactId>telegrambots</artifactId> <version>3.6.1</version> </dependency>
(perche' proprio la 6 e non che ne so la 3? Per via del proxy...)

Secondo passo:
registrarsi usando BotFather
aprite telegram cercate BotFather
/start - per iniziare
BotFather vi dara' tutta una lista di comandi che puo' eseguire manteniamoci sul semplice:
/newbot - vi permette di creare un nuovo bot
vi chiedera' il nome del bot, il nome utente e vi dara' un token segnatevi tutto

Secondo passo:
creare il vostro bot ed estendere TelegramLongPollingBot il nome della classe dev'essere il nome del bot
dovrete estendere due metodi
getBotUsername() che deve restituire l'username scelto
getBotToken() che deve restituire il token che vi ha dato il botdrino
io per comodita' mi creo un metodo statico per registrare il bot in modo da avere tutto il codice relativo al bot in un punto solo

public static void registerBot(){ ApiContextInitializer.init(); TelegramBotsApi papi = new TelegramBotsApi(); //questo serve se la macchina che fa girare il bot e' proxata DefaultBotOptions botOptions = ApiContext.getInstance(DefaultBotOptions.class); HttpHost httpHost = new HttpHost("proxy_address", proxyPortAsInt); botOptions.setHttpProxy(httpHost); //ovviamente devi avere un costruttore con DefaultBotOptions come parametro IlTuoBot bobi = new IlTuoBot(botOptions); try{ papi.registerBot(bobi); }catch(TelegramApiException e){ //TODO faqquacos } }

Terzo passo:
implementare onUpdateReceived
che e' il metodo che vi permette di rispondere a chi vi scrive

bene ragassuoli, questo e' il metodo piu' importante di tutti perche' vi permette di interagire con l'utente
(se lui scrive per primo)

@Override public void onUpdateReceived(Update arg0) { if(arg0.hasMessage() && arg0.getMessage().hasText()){ //qui ho un nuovo messaggio //il chat id serve per poter rispondere ad un client specifico //se avete bisogno di inviare un messaggio automaticamente //salvatevelo da qualche parte (db?) Long chatId = arg0.getMessage().getChatId(); //il messaggio che il bot inviera' come risposta String text = "bot non ancora implementato"; SendMessage sm = new SendMessage(chatId, text); try{ execute(sm); }catch(TelegramApiException e){ //TODO faqcs } } }

Se volete che il bot scriva "suo sponte" a qualcuno dovete salvarvi il chat id da qualche parte
(io per sicurezza me lo faccio comunicare dall'utente che vuole interagire con il bot a mano, il bot su richiesta lo fornisce, l'utente se lo salva me lo da' a me io so chi e' etc)
non e' un metodo "obbligatorio" quindi la signature e' quella che vi pare a voi, basta che poi usiate la classe SendMessage e il metodo execute

Il bot puo' fare molto altro, puo' anche ricevere ed inviare contenuti multimediali tipo file immagini video etc. Quindi sbizzarritevi...

$NON_RICORDO_IL-NUMERO passo:
eseguire il bot.
- tramite main:
registrate il bot se deve solo rispondere non c'e' bisogno di fare altro. Finche' il main gira il bot sta su. - tramite server:
in tomcat8 avevo un filtro dichiarato nel web.xml e il bot lo inizializzo li'
su jboss 10 ho creato un singleton da eseguire allo startup (quindi una sola volta mentre si avvia il server) tramite le annotation

@Startup @Singleton annoti un metodo con @PostConstruct e li' dentro registri il bot

Penso (spero) sia tutto...