martedì 15 novembre 2016

PETS vita da animali - la recensione


Allora la prima cosa da dire, guardando il trailer e la locandina e' che uno si aspetta un certo genere di film, ovvero che il film sia incentrato su cosa fanno gli animali quando i loro padroni non ci sono. Ed effettivamente i primi 3 minuti di film parlano di quello, e sono le stesse scene del trailer, finite le quali finisce anche il divertimento.

La storia (oltre a non essere per niente pertinente con il titolo del film), e' pure scarsina, nel senso un cane con una padrona che d'improvviso si trova con un inquilino tre volte piu' grosso di lui, litigano e per scappare si alleano con un rivoluzionario delle fogne.

Ci sono alcuni spunti carini, tipo il coniglietto mezzo matto, ma appunto sono solo spunti, non bastano certo per fare un film.

Pets da' la stessa idea di quando hai da fare un tema e devi scrivere minimo 4 colonne e non sai come riempirle, e allora temporeggi, allunghi il brodo in tutti i modi possibile, scrivi largo... Ecco a me ha fatto quest'effetto. Ci sono un sacco di scene che non dicono niente.

Ho riso 3 volte in tutto il film (e su 2h e' un po' pochino). Coinvolgimento pari a 0, la storia oltre ad essere deboluccia e' pure raccontata male. Quindi sinceramente no secondo me pets non vale la pena andarlo a vedere...

mercoledì 2 novembre 2016

Trenitalia e il biglietto regionale


Trenitalia ha annunciato il nuovo biglietto regionale. In soldoni non puoi piu' comprare un biglietto ed usarlo quando ti fa comodo, ma devi sapere esattamente quando viaggerai e che treno prenderai. Esattamente come succede con treni piu' importanti tipo Italo o le Frecce.

Secondo trenitalia questo dovrebbe combattere l'evasione, in realta' chi non faceva il biglietto prima non lo fa neanche adesso e chi lo faceva prima continuera' a farlo, con una rottura di scatole in piu'.

Uno che usa il treno tutti i giorni probabilmente avra' l'abbonamento e il problema non lo tange, il problema nasce per chi usa il treno salutariamente (es. vai a lavorare in moto ma se piove prendi il treno). Non puoi sapere a priori quando avrai bisogno del treno, con il vecchio biglietto regionale, bastava prenderne uno (o due) dal cassetto, andare in stazione (quando arrivavi arrivavi), obliterare e salivi sul treno (o quello dopo).

Adesso non piu', o lo fai in stazione (o nelle biglietterie abilitate) prima di partire, ma questo vuol dire alzarsi prima e pregare di non trovare traffico, oppure usi l'app. Ma questo vuol dire dover collegare una carta di credito, e non tutti ce l'hanno, e non tutti potrebbero voler fare acquisti su internet. Senza contare che il biglietto elettronico vale solo per quel treno. Cosa succede se quel treno non passa e devo prendere quello dopo?

Inoltre l'app e' una mezza chiavica, tipo stamani sono riuscito a comprare l'andata ma non il ritorno (eppure la c.c. funziona!) non permette l'acquisto del biglietto se l'orario di acquisto e' troppo a ridosso del treno che si vuole prendere (5 minuti! che per un pendolare medio sono un'eternita'), inoltre ti manda un'email con un pdf da mostrare al controllore, quando basterebbe un codice alfanumerico.

Se non si aumentano i controlli, come si spera di combattere l'evasione? Trenitalia si sta comportando come le case discografiche con il DRM, si tartassano gli utenti onesti ma non si fa niente per combattere davvero i disonesti.

Ci vuole davvero tanto a mettere dei gate che ti fanno entrare solo se hai il biglietto (e magari anche dei gate all'uscita per controllare che tu sia uscito davvero dove dovevi uscire e non dopo)? Ma nemmeno, basterebbe il controllore che controlli tutti i biglietti, e il primo che alza le mani (perche' ci sono persone che non comprano il biglietto e s'incazzano se glielo chiedi) taser.

Sinceramente, Trenitalia dovrebbe seriamente rivalutare le sue politiche verso gli utenti onesti, li sta vessando in ogni modo possibile e non sta facendo niente di reale per combattere i disonesti. Non stanno offrendo un servizio, ma un disservizio, francamente sono un po' stufo, il treno sarebbe un bel mezzo, comodo, ecologico, non crea code, e chi lo gestisce fa di tutto per non fartelo usare... #pendolareribellati !!!

giovedì 18 agosto 2016

JBoss failed to start (address already in use)

Capita che JBoss si "incatasti" ovvero che rimanga in esecuzione anche se dice di non esserlo e senza che ci siano processi relativi in esecuzione (tipo la sua istanza di javaw).

La soluzione e' abbastanza semplice, basta tramite netstat vedere chi c'e' in ascolto sulla porta che jboss ci segnala quando dice che non e' riuscito a partire.

Aprite una shell e vi fate un bel
netstat - ano | find "$NUMERO_PORTA"
dove $NUMERO_PORTA e' quel valore di cui parlavo sopra.

A voi interessa il pid (l'ultimo valore, quello che nell'immagine qua sotto ho evidenziato con un quadrato rosso)

Una volta che vi siete segnati il pid basta "ucciderlo". Come? con
taskkill -pid $PID
dove $PID e' il process id restituito da netstat.

Adesso potete riavviare jboss.

Alla prossima!

mercoledì 17 agosto 2016

Perl connessione ad oracle (con e senza tsanames)

Premessa

e' necessario usare il modulo DBI, e potrebbe essere necessario installare il driver per oracle (vedi cpan install per approfondimenti)

Primo modo (usando il tsanames)

semplicemente si passa soltanto il sid e dbi si va a leggere sul tsanames ip porta etc
my $sid = "";
my $dbh = DBI->connect("dbi:Oracle:$sid", "username", "password");

Secondo modo (senza tsanames)

E' necessario specificare nel connect che gli si sta passando l'host il sid etc nel nome host ci dev'essere solo il nome host e verra' usata la porta di default di oracolo, se per qualche ragione la porta dovesse essere diversa analogamente a come si specifica host e sid, si dovra' passare nell'indirizzi anche il parametro "port=" seguito dal valore e separato da ;
my $host = "";
my $sid = "";
my $username = "";
my $password = "";
my $dbh = DBI->connect("dbi:Oracle:host=$host;sid=$sid", $username, $password);

Ora io non ho valorizzato le variabili, ma perche' mi sembrava chiaro cosa ci va dentro.

giovedì 12 maggio 2016

Repubblica e i riempitivi

Questo uno screenshot di stamani dal sito di repubblica



Mentre questo e' l'articolo originale (link)



Che dire tutto fa...

giovedì 28 aprile 2016

Java - leggere tutti i file di una directory e scriverne il contenuto su file

Stessa identica cosa dello script in perl solo in java. Ho usato delle librerie esterne (per il log) e qualche classe in piu' (di utilita' etc).

Se non avete voglia di rileggervi i requisiti erano questi: La richiesta e' questa: leggere un x numero di files (non specificato) la cui estensione non e' nota e buttare tutto su un unico file. Inoltre e' richiesto di non metterci troppo tempo negli sviluppi e non c'e' richiesta di raffinatezze grafiche o robe cosi' (aka seghe mentali).

Di conseguenza ho eliminato del tutto l'interazione con l'utente (salvo un file di log)



Tre packages. Forse possono sembrare un eccesso per un progetto cosi' piccolo, ma fidatevi non e' cosi'. Avere una buona organizzazione mentale, e' fondamentale per tenere in ordine nei progetti, e questo e' indifferente che il progetto abbia 3 classi o 3000. Deve essere un processo automatico. Cosi' come i commenti. I packages:

  • file: contiene le classi che si occupano dei file, in questo caso chi legge/scrive
  • main: contiene la classe che esegue materialmente il codice (il main)
  • util: contiene le classi di utilita'

La Classe FileManager

Si occupa di leggere e scrivere i file, ha 4 metodi:

  • getListFile(file): che restituisce tutto quello che contiene la directory passata come parametro
  • readFile(File): legge il contenuto di un file e lo restituisce sotto forma di lista di stringhe
  • writeFile (String, List): legge il contenuto di una lista di file (passata come parametro e li scrive in un nuovo file (il cui nome e' passato come parametro)
  • write(BufferedWriter, List): usa un buffered writer passato come parametro per scrivere la lista passata (questo consente di scrivere piu' file in un unico stream e chiudere suddetto stream solo alla fine

La Classe EntryPoint

C'e' poco da dire, prende il path locale e lo passa al file manager, inoltre logga (come info) i vari file scritti e gli eventuali errori (come error) usando gli appositi metodi della classe LoggingUtil

La Classe LoggingUtil

ha 3 metodi statici.

  • getLogger(): per avere un'istanza del logger - se il log e' null lo istanzia perima di restituirlo
  • info(String): scrive la stringa come info
  • error(String, Throwable): scrive un error con il messaggio e lo stacktrace
A proposito di getLogger(): usa un basic configurator per prendere caricare il file log4j.properties, e' necessario usare un file appender da dare in pasto al log, altrimenti non avrete alcun file.

La Classe Utility

Non c'e' molto perche' non mi serviva molto, ho due metodi

  • formatDate(Date, String): formatta la data in stringa usando il pattern specificato
  • getActualTime(): prende la data attuale e formatta prendendo solo ora minuti e secondi separati da :

Il progetto Java e' piu' complesso, a parita' di risultato, e anche piu' pesante in termini di dimensioni (400KB rispetto ai 2 del perl) e anche di prestazioni. Ma ha il vantaggio che quasi tutti hanno una JRE installata e ha la possibilita' di crescere se viene creata un'interfaccina in swing per chiedere quali file mergiare e dove salvare il file mergiato (e come chiamarlo). Ma questo viene meno ai principi di semplicita' e velocita' di svilluppo che erano stati richiesti.

Perl - leggere tutti i file di una directory e scriverne il contenuto su file


Oggi niente Java, oggi perl. (Si non vi preoccupate l'ho fatto anche in java, solo che mi ispirava farlo anche in perl, visto che manipolare file e' la sua specialita' per cui vi propongo prima questo e poi quello).

La richiesta e' questa: leggere un x numero di files (non specificato) la cui estensione non e' nota e buttare tutto su un unico file. Inoltre e' richiesto di non metterci troppo tempo negli sviluppi e non c'e' richiesta di raffinatezze grafiche o robe cosi' (aka seghe mentali).

Di conseguenza ho deciso di ignorare totalmente l'input utente, lo script prende in considerazione la directory dalla quale viene eseguito, legge tutti i file ad eccezione di quelli che finiscono in jar, log, perl e che cominciano per "mergedFile" (che e' quello di output) e scrive tutto in un file che si chiama mergedFile_data(ora).txt. Inoltre produce un file che si chiama mergedFileLog_data(ora).log dove scrive i vari file letti (giusto per avere un riscontro di averli letti tutti)


Un po' di dettagli:

use Cwd; Cwd e' una libreria per ottenere il path corrente e poi lo infilo in $dir my $dir = getcwd

@months = qw( Gen Feb Mar Apr MaG Giu Log Ago Set Ott Nov Dic ); creo un array col nome dei mesi nel mio caso in italiano... my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); inizializzo un po'di variabili da localtime

my $file_to_write = "mergedFile_$year$months[$mon]$mday($hour$min).txt"; my $log_to_write = "mergedFileLog_$year$months[$mon]$mday($hour$min).log"; creo altre due variabili una per il file da scrivere e una per il log

#apro la directory da leggere opendir(DIR, $dir) or die $!; #apro il file da scrivere (in append) open(my $fh, '>>', $file_to_write) or die "Could not open file '$file_to_write' $!"; #apro il log da scrivere (sempre in append) open(my $log, '>>', $log_to_write) or die "Could not open file '$log_to_write' $!"; apro il tutto (o muori)

nel doppio ciclo scansiono la directory corrente per ogni file while (my $file = readdir(DIR))
salto se non e' un file next unless (-f "$dir/$file");
salto se inizia per mergedFile o finisce per jar, log o pl
next if ($file =~ m/^\mergedFile/ || $file =~ m/\.jar/ || $file =~ m/\.log/ || $file =~ m/\.pl/);

scrivo sul log il file che sto leggendo e lo apro say $log "leggendo: $file\n"; open (INPUT, $file) || next print "can't open $file: $!";

while (< INPUT >) { chomp; # appendo $_ sul file say $fh "$_"; } leggo il file e lo scrivo sull'altro

Se vi interessa eseguire perl:

  • Su linux e' nativo
  • Su windows potete scaricare strawberry perl da qui

Se vi interessa un editor perl (oltre a npp o gedit che vanno benissimo) potete usare PADRE