mercoledì 30 novembre 2016

No Shave November 2016

No-Shave November ends today, or at least November ends today.
A few centimeters so far, more on the hair than on bear.
No money, I'm sorry. Next year maybe I'll grow better.


PgDay.IT 2016: keynote

Il programma del PgDay.IT 2016 è ormai completo: anche il keynote che anora non era stato annunciato è stato posizionato.
Ad aprire la decima edizione della conferenza italiana dedicata a PostgreSQL sarà il dott. Giorgio Roncolato, attuale direttore dei Sistemi Informativi ULSS 5 di Arzignano, dove ovviamente viene usato massivamente PostgreSQL.

domenica 20 novembre 2016

PgDay.IT 2016: partner!

Ormai vicinissimo il PgDay.IT 2016 si arricchisce di diversi partner, e speriamo che presto altri allunghino la lista. Al momento si ha:

Partner Platinum
  • Interlogica
  • Esosphera
  • Miriade

Partner Silver
  • 2ndQuadrant Italia

Movie-like film reader/printer based on Perl 5

Again I found  myself inspired by a blogs.perl.org post that demonstrate how to let a computer print stuff as it was reasoning on what it was printing, that is a movie-like message reader. In other words, a king of char-by-char cay(1) implementation. So, how difficult could it be to do it in Perl 5?
And here it is my solution:


#!/usr/bin/perl

use v5.10;
use Time::HiRes qw( usleep );

open my $fh, $ARGV[0] || die "\nCannot open input file\n$!";
$/ = \1; # set one char at time (input record separator)
$| = 1;  # force autoflush
while ( <$fh> ){
    print;
    usleep( ( /[a-zA-Z]/ ? 1 : ( /[.!?\n]/ ? 10 : 2 )  ) * 75000  );
}

As you can imagine it is pretty simple: it does read an input file one char at a time, placing it into the topic variable ($_) and printing it on the screen (using autoflush, of course). Then I wait for a quite random time depending on the fact the char was a letter or something else. In this way I can simulate someone is really writing down the message, stopping after a dot or  anew line.
I have to use millisecs sleep in order to make it usable at all, since perl func sleep accepts only integers, and printing a message one second at time is a little dummy!

sabato 12 novembre 2016

Hangman in Perl 5: a simple example

Inspired by an article on blogs.perl.org I decided to write down a small version of the hangman game using Perl 5.
It was interesting and quite nice.
Here it is my version, with an eye on italian words (wovels marked as '+' on the guessing line), find it only on GitHub.

#!/usr/bin/env perl

use v5.10;
use Term::ReadKey;

my $word;

# search for a word
open my $word_fh, '<', '/usr/share/dict/words' || die "\nCannot read words!\n$!\n";
srand;
rand( $. ) < 1 && ( $word = lc( ( split( /[\s']/, $_ ) )[ 0 ] ) ) while( <$word_fh> );
close $word_fh;

# wovels converted to +
my ( %guess_status ) = map { $_  , ( /[aeiouèéòà ùì]/ ? '+' : '_' ) } ( split // , $word );
my $current_guessing = '';
my $max_trials       = 10;
my @wrong_chars      = ();

ReadMode 3; # allow for signals

# while there are undiscovered chars or other trials to do, go for it!
while( grep( /[+_]/,  values %guess_status ) &&  $max_trials > 0 ){

    # build the guessing line
    $current_guessing = join ' ' , map { $guess_status{ $_ } } ( split // , $word );

    say "\n\n|| $current_guessing ||\t" . join( ',', @wrong_chars );
    say "guess a char: ";
    my $current_char = lc ReadKey( 0 );


    if ( ! $guess_status{ $current_char } ){
        # not guessed
        $max_trials--;
        push @wrong_chars, $current_char;
        say "No [$current_char] in the word, you still have $max_trials trials.";
    }
    else{
        say "You guessed right [$current_char]!";
        $guess_status{ $current_char } = $current_char;
    }



}

say "You guessed [$word] !\n" if ( $max_trials > 0 );
say "Sorry, the word you were looking for was [$word]\n" if ( ! $max_trials );


ReadMode 0;




First of all, I read in a random word from a words file, using a quite well know "read-radom-line" approach (at least it is well documented in the Perl community, see ). Since the dictionary could contain multiple words per line, I cut them taking only the first one of them and excluding also shortings, and of course making the whole result lower case for ease of comparison. In other words something like "Bud's" become simply "bud", something like "Smooth words" become simply "smooth" and so on.

The selected word is split into its chars and each char is mapped either to a '+' or a '_'. The result is placed into an hash indexed by the plain char itself, so that the word 'hello' results in an hash as follows:

%guess_status = {
  h => '_',
  e => '+',
  l => '_',
  l => '_',
  o => '+',
}

(of course the hash is not sorted on the keys, and that does not matter).

Now the main loop: unless no more '+' or '_' are present in the hash, meaning that the user has guessed all occuriences of all chars, the user is prompted with the guessing line and asked for a char. I use Term::ReadKey for getting a single char, that is of course lowered and compared against the hash keys. If the current char is a key for the hash, the character is discovered and the guessing line re-prompted with the right character in the right place(s), otherwise the character is appended to an array of missed chars and the loop continues.
Each time the user inputs a wrong char a counter is decreased to allow the game to stop in a fixed number of missed trials.

There is of course a lot of room for improvements: for instance the guessing line does not need to be updated each time, but only when the user guesses a char. Therefore a little different version of the main loop becomes as follows:

$current_guessing = join ' ' , map { $guess_status{ $_ } } ( split // , $word );
while( $current_guessing =~ /[+_]/ &&  $max_trials > 0 ){


    say "\n\n|| $current_guessing ||\t" . join( ',', @wrong_chars );
    say "guess a char: ";
    my $current_char = lc ReadKey( 0 );


    if ( ! $guess_status{ $current_char } ){
        # not guessed
        $max_trials--;
        push @wrong_chars, $current_char;
        say "No [$current_char] in the word, you still have $max_trials trials.";
    }
    else{
        say "You guessed right [$current_char]!";
        $guess_status{ $current_char } = $current_char;
        # build the guessing line
        $current_guessing = join ' ' , map { $guess_status{ $_ } } ( split // , $word );
    }
}

where the guessing line is updated only when a good character is inserted. Having the guessing line built before the main loop allows me for searching directly for undiscovered chars in the line itself, instead of among the values of the hash (so avoiding a grep() applied to a values() ).
And in the case you are wondering why I don't compare the guessin line against the word to guess in the while condition, well, it is because I like to print the guessing line with spaces between letters to be guessed.

Hope it can be useful as simple base Perl program for someone!

venerdì 11 novembre 2016

PgDay.IT 2016: schedule is online!

The PgDay.IT 2016 is approaching and the schedule is available on line here. Of course it could be subject to some little changes, but it is pretty mich a complete list of what you are going to see at the tenth edition of the PostgreSQL Italian Day.

PgDay.IT 2016: programma online!

Il programma del prossimo (e ormai vicinissimo) PgDay.IT 2016 (decima edizione) è online. Anche se potrebbe subire qualche variazione da parte degli organizzatori, il programma online rende l'idea dei talk e degli aspetti che saranno trattati nel prossimo evento.

E se si vuole cogliere l'occasione per farsi un po' di pubblicità attraverso il PgDay.IT 2016 perché non diventare sponsor?

Haiku: quando root non è root!

Sicuramente ero già inciampato in questa specificità, ma non la ricordavo, e un utente molto piu' devoto di me di questo sistema operativo mi ha riportato alla mente che in Haiku l'utente "user" è equivalente a "root".






giovedì 10 novembre 2016

Eclipse: un bell'esempio OpenSource da oltre 15 anni!

Eclipse è un pezzo fondamentale della storia di qualunque programmatore, non importa il linguaggio o il sistema operativo, non conosco nessun developer che non abbia mai provato almeno una volte questo IDE.
Certo, IDE è riduttivo, Eclipse segue la filosofia di tanti progetti ambiziosi (es. Emacs) di creare veri e propri ecosistemi estendibili da parte dell'utente (sviluppatore) e che possono essere utilizzati come base per applicazioni e sistemi complessi.
Io stesso ho usato nel tempo Eclipse come ambiente di sviluppo e piattaforma per la costruzione di alcune applicazioni.
A parte la mia storia personale con questo strumento, che forse è diventato un po' troppo complesso ed enorme, Eclipse festeggia un importante ricorrenza: sono ormai 15 anni che il codice sorgente è diventato di pubblico dominio.

In un periodo nel quale l'OpenSource sembra un po' "passato di moda" questo è un buon promemoria di come una politica Open Source sia tutt'altro che sorpassata o sorpassabile.

Interessante spiegazione di vacuum e autovacuum

Sembra quasi un argomento da novellino: PostgreSQL deve usare la procedura di vacuum per mantenere la struttura dati (su disco) pulita e ordinata, in altre parole efficiente.
La necessità di vacuum è dovuta all'implementazione del sistema MVCC, non proprietario di PostgreSQL e usato anche in altri RDBMS. Spesso si accusa vacuum di essere uno degli svantaggi di PostgreSQL, senza considerare i vantaggi di MVCC.
Consiglio caldamente la lettura di questo articolo, ben strutturato, che dettaglia la necessità di vacuum nonché come ottimizzare il demone di autovacuum al fine di mantenere buone prestazioni anche in un database di grosse dimensioni.




Falcon: un pezzetto di storia (mia e sua)

C'era una volta un bambino con la passione per le macchinine radiocomandate, ma non proprio per il modellismo in generale.
Ero io quel bambino.

A darmi la passione per il radiocomando fu' la Gig-Nikko Turbo Panther, la "seconda" vettura piu' veloce della serie di quegli anni, se si escludono le 4WD.
Successivamente, grazie allo sforzo dei miei genitori (soprattutto economico), arrivò la Tamiya Falcon.
Una vera rivoluzione.

Ricordo ancora l'evento: la vigilia di Natale mi trovavo già  in montagna per gli (allora) usuali festeggiamenti.
Mio padre arrivò in tarda serata, portando su la tanto sognata macchinina e tutti i pezzi. E mentre tutti gli altri parenti erano già  a letto, io e lui passammo la serata in cortile al freddo a provare la fiammante dune buggy. E per ricaricare i due power pack (uno nuovo, uno usato), ci riscaldavamo in auto con un super charger collegato all'accendisigari.

Pochi giorni dopo, grazie alla pazienza e meticolosità  di mio padre, avevo una valigia completa in cui custodire tutta l'attrezzatura, libretti di istruzioni compresi.
Come mio solito, essendomi appassionato, studiavo il modellino, lo pulivo continuamente, oliavo le parti che lo richiedevano e controllavo con un tester le batterie. Tutto era sempre in ordine, tutto era sempre perfetto.



Le carrozzerie le preparavamo io e papa' verniciandole con una bomboletta in garage, rigorosamente nere. Ne facemmo due, fondamentalmente identiche (nere) se non per la disposizione degli adesivi e qualche piccola finitura.




Ogni tanto mettevamo a dura prova la Falcon facendola "salire" per la strada che portava a Luminasio, e rimasi stupito la prima volta che riuscì ad affrontare senza sosta la famigerata curva che faceva "fischiare le gomme" (dell'automobile) .

Con il passare del tempo i miei interessi cambiarono, e all'interesse per la Falcon sostitui quello per la FI...TARCO (prima) e per la GN...U (dopo). E così il modellino se ne stette in solaio per diversi anni, fino a quando cambiai casa e lo ritrovai, ancora in ordine nella sua valigia nera. Mancavano però le carrozzerie, perse durante la "grande ristrutturazione" del tetto.
Era l'epoca pre-ebay e quindi reperire le carrozzerie era quasi impossibile. Fra le altre cose anche i power pack si erano ossidati ed erano inutilizzabili. E non conoscevo nessuno che fosse in grado di aiutarmi a sistemarla e farla funzionare.
E così da una soffitta ad un'altra, la Falcon ha atteso di essere nuovamente considerata come meritava.

Poi circa un anno fa l'idea di provare a venderla su subito.it, non per il guadagno (misero) ma per poterla donare a qualcuno che l'avrebbe rimessa in pista. Ammetto che prima di questa opzione ho provato a regalarla a qualche appassionato, ma ho solo trovato appassionati del motore a scoppio che schifano letteralmente quello elettrico.
Comunque metto foto e dettagli online, cercando di essere preciso come sempre.
E con stupore vengo letteralmente inondato di richieste e contatti. Ma nessuno che si dimostra serio, nessuno disposto a valutare la Falcon per quello che è, e così mi trovo costretto a perdere molto tempo e a dover rifiutare "generose" offerte che spaziano dai 10 ai 15 euro.
Finalmente si fa viva una persona che è interessata e che decide di venirla a vedere dal vivo. Un ragazzo a prima vista simpatico che finalmente dichiara apertamente "è¨ veramente bella".
Quella sera era un po' triste per aver perso questo pezzetto della mia storia, ma dopotutto non ci avrei fatto nulla.
E sono comunque lieto che la persona che l'ha presa mi abbia fino ad ora aggiornato sui progressi di "riparazione" e sia riuscito a metterla nuovamente in pista, funzionante.

La Falcon farà  un pezzetto di storia anche per qualche altra persona!

Un nuovo sguardo

Ho deciso di cambiare la mia immagine principale del blog, come pure il mio hackergotchi, che da oggi di fatto non è piu' una immagine di quel tipo.
Fino ad ora ho sempre usato gli "occhi di gatto", anzi gli occhi della Duchessa, immagine pluripremiata ai concorsi fotografici e che mio padre aveva scattato tanti anni fa.
Ho deciso semplicemente di sostituirla, non per rompere il legame sentimentale e l'emozione che tale immagine mi da, ma per dare posto ad un'altra emozione.
E lo faccio inserendola appositamente sfuocata, come ormai la mia vista.




domenica 6 novembre 2016

OSX Dock: basta emularlo!

Non sono solito voler sminuire i progetti OpenSource, specialmente quelli creativi, ma veramente, basta tentatre di emulare il dock di OSX!
Da quando la Apple ha lanciato OSX abbiamo assistito a ogni forma di emulazione: temi liquid, schemi di colore, menu' piazzati in alto e distaccati dalle finestre (una cosa che sta tornando in Qt 5), e il temuto dock di OSX.
OK, il dock è molto elegante, è sicuramente molto flessibile, ma dopo aver lavorato tante ore con sistemi differenti posso dire che il vecchio pannello old-style è quello che rende piu' comfortevole l'ambiente.
Non mi importa di avere le icone che fanno zoom, rimbalzano, si illuminano o altro, mi interessa che il dock occupi poco spazio e che la roba che mi serve sia al suo posto (e possibilmente fissa!).
Quindi voto negativo all'ennesimo sforzo di emulare questo dock.

Ricordi...


Credo che questo sia uno dei video piu' belli di Madonna che abbia mai visto.
Lo guardavo e riguardavo ogni volta che lo trasmettevano su MTV (eh si, era l'epoca pre- YoutTube) e rimanevo sempre incantato per le movenze.