Ognuno vota le tasse che vuole pagare 

Le persone (tutte: i ricchi, la classe media e i poveri) votano esprimendo una preferenza per il livello delle imposte che desiderano o ritengono giusto, considerando che i benefici maggiori della spesa pubblica, finanziato attraverso le imposte, andranno ai poveri. 

Società caratterizzato da alti tassi di disuguaglianza tenderanno a votare per alti livelli di tassazione, perché la popolazione povera che beneficerebbe dei trasferimenti pagando poche imposte é largamente maggiore rispetto alla popolazione ricca o benestante. 

Ora, una tassazione alta riduce gli incentivi a investire e a lavorare sodo, e ciò riduce il tasso di crescita dell’economia. 

Da “Chi ha e chi non ha”, Branko Milanovic 

j j j

Tasse e disuguaglianza

Nel periodo in cui la tassazione diretta è aumentata rispetto a quella indiretta, la disuguaglianza é diminuita; nel periodo in cui la tassazione indiretta é diminuita rispetto a quella in diretta, ovvero negli ultimi 25 anni, la disuguaglianza è aumentata. 

(Studi di Thomas Piketty, da “chi ha e chi non ha”, Branko Milanovic) 

j j j

Esportazioni e reddito

Una maggiore apertura al mercato dovrebbe ridurre la disuguaglianza nei paesi poveri, favorendo l’aumento della domanda per prodotti ad alta intensità di lavoro poco qualificato, per esempio i tessili, in cui sono di solito specializzati questi paesi. Ciò dovrebbe contribuire a far salire il livello dei salari dei lavoratori non qualificati rispetto a quelli dei lavoratori qualificati o rispetto al profitto dei capitalisti. 

Nei paesi ricchi, l’apertura al commercio produrrebbe l’effetto opposto. Poiché questi paesi tendono a esportare prodotti ad alta tecnologia, la loro produzione richiede personale qualificato, per esempio ingegneri e tecnici; in tal modo il salario di chi ha compiuto studi superiori cresce rispetto a chi ha solo un’astrazione di base e la disuguaglianza, di conseguenza, aumenta. 

(da “Chi ha e chi non ha”, Branko Milanovic) 

j j j

Come riconoscere (e perché assumere) un buon “giocatore di squadra” 

Un buon “giocatore di squadra” ha queste qualità:

  • Voglia di superarsi, fare più del dovuto per quell’extra che fa la differenza
  • La capacità di essere una persona che fa “gruppo”, che sa stare con gli altri e sa comunicare
  • L’umiltà di mettere da parte l’ego per il bene del gruppo. 

Se manca una sola di queste tre qualità, il team intero ne risentirà. 

Questo é un sunto del libro “The Ideal Good Player“, ma potrei anche dire che é un sunto della mia esperienza lavorativa. Avendo lavorato con tante persone, sia più junior che senior di me, ho visto centinaia di casi umani da manuale: 

  • La persona che senza neanche presentarsi ti definisce bugiardo / incapace / you know it… 
  • La persona che pretende il tuo aiuto 
  • Colui che si prende il merito di una tua idea o,  peggio, di una tua esecuzione 
  • Quello con cui non ti trovi bene
  • Quello con cui tutto il team esibisce problemi relazionali (se é il capo, ahia! ) 
  • Quello che se ne frega di quello che fai, e come, l’importante é che lo fai in tempo
  • Colui che dice sempre che é colpa di qualcun altro 
  • Quelli che nei meeting hanno sempre qualcosa da dire 
  • …..! 

I colleghi con cui mi sono trovato meglio invece erano: 

  • Quelli con cui ti puoi fare una pausa caffé in tranquillità, anche per parlare di un problema di lavoro. (Esistono studi sul fatto che le pause caffé contribuiscono a risolvere problemi) 
  • Quelli che sono davvero appassionati di ciò che fanno
  • Quelli che il lavoro é il loro hobby preferito 
  • Quello a cui ho chiesto aiuto, anche alle 18, ed é rimasto con me a risolvere un disastro… 

Non siamo tutti uguali e non siamo sempre nella stessa categoria, anzi in base ai progetti, momenti, colleghi noi stessi cambiamo umore e atteggiamento. Io stesso sono stato un pessimo stronzo e un generoso altruista, con le stesse persone a distanza di poche settimane!  

Un’altra verità é che rockstar vere e proprie nel mio settore non le ho conosciute (tradotto: non ci ho mai lavorato assieme). Sto parlando di persone capaci di programmare una libreria da soli, nel tempo libero.

Di sicuro esistono, perché il web é pieno di persone con le palle che sanno quel che dicono; ma in generale, la stragrande maggioranza é fatta di medi o medio-scarsi. 

Siamo dunque condannati alla mediocrità

No!

Ci sono studi scientifici che riescono a dimostrare come l’intelligenza del gruppo sia superiore di quella del fuoriclasse. 

Questo significa anche che, una volta formato il team giusto, avrete tra le mani un mostro capace di giocarsela con Cristiano Ronaldo (nelle ipotetiche olimpiadi della calcio-programmazione). 

Ma… C’é sempre un ma. I dipendenti non vanno solo trovati, assunti e foraggiati con lavoro e soldi; bisogna anche coccolarli, farli crescere (competenze, responsabilità…), dargli uno scopo. Motivarli. Se lo saprete fare, potrete giocarvela alla pari con tutto il Portogallo e, perché no, vincere l’Europeo! 

j j j

I was not satisfied with Time Machine so I wrote my own Backup System

When I bought my first Apple computer, 4 years ago, I had a big problem: my data would be backed up in an encrypted and proprietary format. This meant that I could not access to my data from a linux or windows computer. I’m not a fanboy, and I happily use every possible system on earth, so this is a huge issue for me. 4 years ago I decided to overcome this problem by starting the writing My Own Cross-Platform bash-based Time Machine!

Design principles

  • incremental backups – the first backup is a specular copy of your hard drive (well, in my case, of my home directory); the next backups will only transfer changed files.
  • Space-efficient – using hard links, I can do as many backups I want (every hour, every day…), non-changed files will be linked, not copied. No extra space is involved in this operation 😉
  • Snapshot view /File Versioning – every directory is named after a timestamp, like “20161210-1359”, so I know that this backup started at 13:59 the 10th of december of 2016.
  • Work with my private NAS – I bought a NAS System by Synology, so my data is safely stored in my house.
  • Work on different networks – When I’m far from home, I want to backup as well. This means I can backup from everywhere – as long there’s a free internet connection 😉
  • Possibility to be launched from every system – since it is a bash script, compatibility with Linux and Mac is assured. Some testing is required on Windows, but since Bash is now available on the platform, this should not be a big issue anymore.

Prerequisites

  • You should have your own server / NAS, and you can access it via SSH.  I have the cheapest Synology, but it’s perfect for my data because it has two mirrored disks. You may try with online systems like S3, as long you have ssh access, you can use it.
  • SSH access must be configured to access without password: to do this you must generate a pair of private/public keys and configure your server to accept your key. If you don’t do this, the script will work but will ask the password 4 times.

How did I do this?

  • The magic is all by rsync: this software is the real engine that does the transfer, securely, efficiently.
  • the script is programmend in bash, the worst programming language ever. There is no debug, no IDE support, the strangest syntax, but it is also the software that powers the best available shell.

How does it work?

  1. The script will try to connect to the server and check if the backup folder exists.
  2. since every backup is stored in a directory named after date and time (example: 20161225-1400), sort the directory and take the latest. This will be the base directory for calculating the difference.
  3. create a new directory named after the current date and time, and hard link the files that are not changed on your computer.
  4. copy only the modified files in the newly created directory.

A hard link is a pointer to a file. If you create a hard link to a file, you can access the same file from two locations on filesystem. If you delete a hard link the other will continue to work. When you delete all the hard links, the file is lost forever (and the OS will mark that disk location as available for writing).

What will you do now?

  • The project is very simple and open source! Feel free to understand how does it work.
  • I’m still developing a system to schedule backups on Mac. Next I’ll move on other platforms. This means that now you have to launch the script by hand with ./start.sh .
  • I also want to add some toast messages to say “hey! I’m going to backup everything. Click here if you don’t want to” (for example, when you are under a mobile connection).
  • I also want to implement a solution that deletes unnecessary backups: it keeps 1 backup for every year, 1 backup for every month of the last 12 months, 1 backup per day for the last week, and one backup per hour for the last day.

WHERE IS THE SOURCE!!!

I was forgetting the most important part. You’ll find the script on github. Cheers!

j j j

OrientDB 

Convenite con me che fare un DB é la cosa più difficile che ci sia? Seconda solo a fare un sistema operativo, diciamo 😇

Stasera ho conosciuto uno degli sviluppatori di OrientDB, un DB multimodello (parolone!). In pratica i dati possono essere memorizzati come nodi di un grafo, e le relazioni sono gli archi.

La cosa più simpatica é che i dati possono essere interrogati con un linguaggio molto simile all’sql, e si può accedere ai dati in formato Json con la dot notation.

La cosa positiva, rispetto a tutti gli altri DB NoSql, é che questo almeno gestisce i vincoli d’integrità, di univocità, cosa che MongoDB invece non fa.

OrientDb ha altre feature come la gestione del cluster completamente automatica e quindi la scalabilità, la navigazione tra oggetti che non comporta costosissime join…

Una feature visuale simpatica é la possibilità di vedere i dati come un grafo, invece che come tabella,quindi le relazioni sono esplicitate benissimo.

Non vi resta che scaricarlo, estrarlo, e lanciare la console di amministrazione. Buona sperimentazione!

j j j

Develop a microservice with Ratpack

Ratpack is a lightly opinionated framework that’s perfect for backends written with a RESTful specification. I am using it in a project that we are developing, and of course it’s a microservice.

schermata-2016-10-28-alle-15-16-51

Ratpack is completely written in Java 8, and you can use it with Java if you like. However, it’s in Groovy that it really shines. Groovy is a functional scripting language for the JVM, and enhances Java under many aspects.

I was scared of using Groovy, a language that I have never studied systematically. But Groovy is not that difficult. In fact, I found it easier to read (and write) Groovy examples than the Java counterpart.

So, right now I’m stuck with the Java version of the framework, that is functionally equivalent to the groovy one. But I have already in mind to rewrite everything in groovy, once I have stabilized the requirements. Microservices are also this: the possibility to rewrite everything when you find a better option.

So, what’s great about ratpack? what are it’s main features? Let’s dig in it.

Ratpack Features

Ratpack does not force you to stuck with their idea on how structure your code.

Ratapack has built in support for startup configuration coming from json, yaml, environment variables, system arguments, and java classes. This is great since many of us are going to use Ratpack in a container.

With ratpack you can specify the API of your backend in a fluent way, so that it’s very easy to declare and to understand who will answer a call. Here’s an example:

It has native support for headers, status codes, Exceptions, query parameters, forms, json, and all the like.

Guice is the default dependency injection, but you can go on with Spring if you want.

The class that responds to a http call is a Handler, that you have to imagine like a java servlet that intercepts a request.  You can, for example, log all requests in a handler, then pass the control to the next that will extract data from headers, and according to that data it will call the right handler for you. You can also pass data between handlers so that it’s very easy to work with it.

Want more? Ratpack is implemented using Nettyan asynchronous event-driven network application framework. Does this definition say anything to you? It’s the same philosophy taken by NodeJS. So you can expect to handle a lot of connections. (This power comes at a cost. Develop responsibly)

Testing is a breeze. I have done only functional tests, but I’m confident that the application works exactly like I am expecting. Ratpack encourages to use Spock, but I’m using JUnit and I’m not regretting it.

And finally, in development mode (launching it with “gradle -t run”) it will auto-reload the server everytime there’s a change on filesystem. If you have ever worked with tomcat, you know how much time this can save you.

How to learn?

Don’t read the official documentation – it’s just a waste of time. Instead, buy a copy of Learning Ratpack – this book is clear and covers every aspect of a Ratpack application. I’m still at chapter five but it’s very easy to go through!

Plans for the future

I want to rewrite everything in Groovy, as I said. I also have to finish the book to uncover all Ratpack powers. I have made many mistakes in the past, expecially from not having undestood how handlers work and how to pass data between handlers. That’s why I say the book is useful.

If you have ever tried ratpack, feel free to give me your impressions! Expecially if they are negative.

j j j