Claudio Cherubino's blog Life of a Googler

30Jul/083

Vista è già superato?

E' passato circa un anno e mezzo dall'uscita di Windows Vista e, come vi ho già raccontato, le mie prime impressioni non sono state sicuramente le migliori, tanto da spingermi a reinstallare XP.

Quello che non vi ho detto è che, grazie all'acquisto del nuovo notebook, ho dato una seconda chance a Vista e sono finalmente riuscito ad apprezzarlo a pieno.

Tuttavia, a quanto si legge su Internet, la maggioranza delle persone continua ancora a preferire Windows XP, sostenendo che il nuovo sistema operativo sia pieno di bug e, in generale, di scarsa qualità.

Si tratta di giudizi motivati o di semplice opinione diffusa ma senza fondamenti, anche grazie alla martellante campagna negativa Mac vs Windows di Apple?

Per sciogliere questo dubbio, in Microsoft hanno fatto un esperimento, che io personalmente trovo geniale.

Questo esperimento, chiamato Mojave Experiment, consisteva nell'invitare circa un centinaio di utenti Windows, Linux e MacOS per fargli provare in anteprima il successore di Vista, chiamato proprio Mojave.

Alla fine del test, gli utenti erano invitati a valutare questo nuovo sistema operativo e ben il 90% di essi lo hanno giudicato molto positivamente (in media 8,5 su 10), mentre il voto medio per Vista era stato circa 4,5.

Peccato che Windows Mojave non esista e che il sistema operativo appena testato fosse semplicemente Vista sotto falso nome!

Non dico che Vista sia perfetto, ma di sicuro ci sono troppi pregiudizi e molta gente si lascia trasportare da quello che si dice in giro.

Ecco perché l'azzeccato slogan della nuova campagna di Microsoft è "decide for yourself"...

10Jun/088

Google Interview Question: Product of other Elements in an Array in O(n)

Last time I was interviewed for a software development engineer position, the recruiter asked me some of the classical Microsoft interview questions, such as "How Would You Move Mount Fuji?" or "How many gas station are there in your country?".

It was the first time for me to be asked such questions but having obtained the job I think my answers were good enough.

After that day, I looked for other well-known interview questions and I discovered that Google has a totally different approach, focusing on algorithms, data structures and complexity.

For instance, one of Google interview questions says:

There is an array A[N] of N integers. You have to compose an array Output[N+1] such that Output[i] will be equal to the product of all the elements of A[] except A[i].

Example:
INPUT:[4, 3, 2, 1, 2]
OUTPUT:[12, 16, 24, 48, 24]

Solve it without division operator and in O(n).

Without the two constraints at the end of the puzzle it would have been straightforward, but now we have to be smart.

Actually, the product of all elements of A[] except A[i] is equal to the product of all elements before A[i] and those after A[i].

We can traverse A[] twice, once from left to right and once in the opposite way and multiply all the elements we find before A[i].

We'll pretend to have a new array called Output[] to store the output of the first pass, assigning Output[i] the product of all elements preceding A[i]:

let rec firstpass product input =
    match input with
    | [] -> []
    | x::xs -> product :: firstpass (product * x) xs

For the second pass we need to move from right to left, but this can be done by reversing the input arrays and moving as usual:

let secondpass product input arr =
    let rev_input = List.rev input
    let rev_arr = List.rev arr
    let rec rev_secondpass product (input:list<int>) arr =
      match arr with
      | [] -> []
      | x::xs -> rev_secondpass (product * input.Head) input.Tail xs @ [(x * product)]

    rev_secondpass product rev_input rev_arr

Both firstpass and secondpass expect an integer argument called product, which will be always be 1 at the beginning and will be used to store the intermediate products during the recursive calls.

With these functions we can just define an input array and apply them to get the result.

The following is the complete F# code:

#light

let input = [ 4; 3; 2; 1; 2 ]

let answer values =

  let rec firstpass product input =
    match input with
    | [] -> []
    | x::xs -> product :: firstpass (product * x) xs

  let secondpass product input arr =
    let rev_input = List.rev input
    let rev_arr = List.rev arr
    let rec rev_secondpass product (input:list<int>) arr =
      match arr with
      | [] -> []
      | x::xs -> rev_secondpass (product * input.Head) input.Tail xs @ [(x * product)]

    rev_secondpass product rev_input rev_arr

  values |> firstpass 1 |> secondpass 1 values
13May/080

Guardare la tv con Windows Live Messenger

Per una volta siamo noi italiani ad essere all'avanguardia rispetto al resto del mondo.

Da un team italiano di Microsoft è nata infatti la Messenger TV, un servizio che integra la comunicazione via chat che tutti conoscono con la possibilità di guardare (e condividere) i canali televisivi preferiti.

L'offerta attualmente include una selezione dei migliori programmi di MTV Italia, fra cui Very Victoria e Loveline, ma è già stata annunciate un'altra partnership con Mediaset, che consentirà di visionare Canale5, Italia1 e Rete4.

Previsti inoltre accordi con Sony Bmg, Ansa, Agr, Coming Soon e Sportal.

Se volete provare questo nuovo servizio dovete seguire questi seguire questi 3 semplici passaggi:

Istruzioni per usare Windows Live Messenger TV

  1. Aprire una finestra di conversazione e cliccare sul pulsante Attività
  2. Selezionare la voce Messenger TV
  3. Scegliere il canale ed il video

Buon divertimento!

20Feb/082

The 2008 Winter Scripting Games: Pairing Off

Since 2005 Microsoft sponsors an annual scripting competition called Winter Scripting Games, whose competitors are given a series of exercises to be solved with VBShell, Powershell or Perl scripts.

I confess that I only discovered this competition a couple of days ago, and I think that some of the proposed exercises can be useful to practice F# as I'm doing with Project Euler.

There are two Divisions (Beginner and Advanced) with 10 problems each, and today we'll try to solve the first exercise of the Beginner division, called Pairing Off:

In this event we’ll be working with a standard deck of playing cards. A standard deck consists of four suits: Hearts, Spades, Clubs, and Diamonds. Within each suit are the numbers two through ten, plus a Jack, a Queen, a King, and an Ace.

Given a random set of five cards, your task is to find out how many pairs are in that set. In other words, if your five cards are the 2 of hearts, the 4 of spades, the 4 of clubs, the queen of diamonds and the queen of spades, you have 2 pairs: 2 fours and 2 queens. As another example, you might have a 3 of clubs, a 3 of diamonds, a 3 of hearts, a 10 of spades and an ace of hearts. In that case you have 3 pairs: 3 of clubs and 3 of diamonds; 3 of diamonds and 3 of hearts; and 3 of clubs and 3 of hearts.

Let's write the F# solution and then we'll comment it line by line:

#light
open System

let deck =
    [| for y in ["Hearts"; "Spades"; "Clubs"; "Diamonds"]
      for x in [1 .. 13] -> (x,y) |]

let swap a i j =
    let t = a.[i]
    a.[i] <- a.[j]
    a.[j] <- t

let shuffle a =
    let rand = new Random()
    Array.iteri (fun i _ -> swap a i (rand.Next(Array.length a))) a

let rec pairs elem list =
    match list with
    | [] -> 0
    | x::xs when (fst x) = elem -> 1 + pairs elem xs
    | x::xs -> pairs elem xs

let rec count_pairs hand =
    match hand with
    | [] -> 0
    | x::xs -> pairs (fst x) xs + count_pairs xs

do shuffle deck
let hand = deck |> Seq.to_array |> Seq.take 5

let answer = hand |> count_pairs

First of all we need to simulate a deck of cards, with four suits and 13 cards for each suit, and this is done at line 4 thanks to array comprehension.

We need now to shuffle the deck, in order to randomly get five different cards every time we run the application. To do so, we defined the shuffle function at line 13, which swaps the elements of an array in-place, i.e. without returning a new object.

In fact the shuffle function is of type array -> unit, and unit is a special type that means "no value".

When this function is applied to our deck, it iterates each element and swaps it with a random selected one from the same array, using the swap function defined at line 8.

Since the shuffle function doesn't return anything, to call it we have a special syntax: instead of "let" we have to use the "do" keyword, as in line 28.

We are now able to create a card deck and shuffle it, the next step will be writing a function to count the number of pairs contained in a hand of cards.

To accomplish this task we have two functions, called count_pairs and pairs. The idea is to take the first card and check how many couples can be formed with the cards next to it.

The count_pairs function simply applies the pairs function to each element of the hand array, and the pairs function counts how many times the numeric part of the given card is equal to the number contained in the other cards.

To get our answer we just create a random hand of five cards and then apply the pairs_count function to it.

Nice, isn't it? Please let me know if you liked this article and you'd like to read some other on this topic, I'll be glad to write more.

19Feb/080

Microsoft eroe opensource

Da qualche giorno è apparsa una nuova pagina web all'interno del sito Microsoft, ma della quale non si sa praticamente nulla a parte l'indirizzo, che è molto suggestivo: www.opensourcehero.com.

All'interno della pagina, tutta nera, c'è solo una scritta "{Forge} New Powers" e una data, il 27 Febbraio 2008.


Opensource Hero

Su Internet molti si chiedono cosa succederà il 27 Febbraio, e soprattutto cosa leghi Microsoft al mondo open-source, di sicuro è strana la scelta della data, che coincide con quella dell'evento "Heroes Happen Here" dedicato al lancio di Windows Server 2008, Visual Studio 2008 e SQL Server 2008.

C'è chi sostiene che "{Forge} New Powers" si riferisca al rilascio anticipato della versione 2.0 di Silverlight, la tecnologia ideata da Microsoft come rivale di Flash, ma la versione più accreditata è quella del lancio del progetto "The WorldWide Telescope" per l'esplorazione dell'universo.

Di sicuro non sapremo la verità fino al 27 Febbraio, però c'è da ammettere che anche Microsoft sta imparando a sfruttare il viral marketing...

18Feb/083

Il Blu-Ray ha vinto la guerra

Qualche anno fa sono stati presentati al pubblico due formati in competizione fra loro come successore del dvd, caratterizzati ovviamente da maggiori capacità e qualità dell'immagine.

I due formati, Blu-Ray e HD-DVD, sono supportati rispettivamente da due grossi consorzi di imprese. Nel primo caso, il principale promotore è sicuramente Sony, mentre l'altro gruppo vede forti le partecipazioni di Toshiba e Microsoft.

Per quanto riguarda il confronto fra i due tipi di supporto, possiamo dire che HD-DVD costituisce una sorte di evoluzione naturale del dvd e quindi i costi dei lettori e dei masterizzatori è stato sin dall'inizio più contenuto.

Blu-Ray invece è basato su una tecnologia più avanzata (ma anche più costosa) che consente di ottenere capacità di immagazzinamento dati superiori rispetto alla concorrenza.

Come sempre però l'affermarsi di un prodotto non è dovuto esclusivamente alla sua tecnologia, ma soprattutto alla capacità dei produttori di farsi adottare dai consumatori, ed in questo Sony è stata sicuramente più abile.

Innanzitutto la Playstation 3 contiene un lettore Blu-Ray e anzi questo lettore è stato per un discreto periodo di tempo il lettore Blu-Ray più economico sul mercato. Oltre a questo, la Sony è stata in grado di promuovere il formato Blu-Ray come il vero successore del dvd, tanto che moltissimi consumatori non sanno nemmeno dell'esistenza di HD-DVD.

In risposta a ciò, la Microsoft ha messo sul mercato un lettore HD-DVD esterno per la propria consolle X-BOX 360, ma probabilmente si è mossa troppo tardi, e questo accessorio non ha avuto quasi alcun successo.

La battaglia fra Blu-Ray e HD-DVD è durata un bel pò, ma pare che adesso ci sia un vincitore: Toshiba ha deciso di issare bandiera bianca e abbandonare il formato HD-DVD.

La cosa non può che fare felici noi consumatori, visto che un appassionato si trovava costretto a comprare due diversi lettori per poter vedere i film in alta definizione. Di certo non sarà altrettanto felice chi ha già comprato un HD-DVD Player e adesso si trova in casa un costoso (e inutile) soprammobile!

Io per fortuna non avevo ancora fatto la mia scelta proprio per evitare problemi di questo tipo, magari non appena la PS3 cala ulteriormente di prezzo ci faccio un pensierino...

22Jan/082

Sorting odd and even numbers in F#

An Italian Microsoft Evangelist posted today a small programming exercise on his blog, presenting the solution with LINQ.

The exercise says (translated from Italian by me):

Given a list of unordered numbers (for instance 1, 7, 9, 2, 3, 4, 3, 4, 2, 3, 4, 5, 2, 0, 9), create a new list with all even numbers first and then all the odd ones.

The proposed solution also goes a little further, showing not only how to split the original list into odd and even numbers, but also putting them in the correct order, thus returning "022244413335799".

The following is the C# code used:

List<int> elenco = new List<int> { 1,7,9, 2, 3, 4, 3, 4, 2, 3, 4, 5, 2, 0, 9 };
var pariEdispari = elenco.OrderBy(s => s % 2 != 0);
var pariEdispariOrdinati = elenco.OrderBy(s => s % 2 != 0).ThenBy(s => s);

foreach (var item in pariEdispariOrdinati)
{
      Console.WriteLine(item);
}

And now let's compare it with an F# approach:

#light
let numbers = [ 1; 7; 9; 2; 3; 4; 3; 4; 2; 3; 4; 5; 2; 0; 9 ]

let result = numbers |> List.sort Int32.compare |> List.partition (fun x -> x % 2 = 0)

print_any ((fst result) @ (snd result))

As you can easily see, everything is done at line 4, where we apply twice the pipeline operator (|>).

This operator allows to chain functions, passing the output of one of them to the next one.
The same line could be written as:

List.partition (fun x -> x % 2 = 0) (List.sort Int32.compare numbers)

Line 6 is only used to print the result, but it has to take into account that the output of List.partition is a tuple, so we have to concatenate the two elements that can be retrieved with the fst (first) and snd (second) functions.

The @ operator actually concatenates the two lists.

I'm not sure that this is the best (and most elegant) solution, but I think that it is way ahead than any imperative solution, do you agree with me?

18Jan/080

fsharp.it, il nuovo portale su F#

Qualche tempo fa anticipavo la mia intenzione di avviare un nuovo blog più tecnico e adesso quel momento è arrivato!

Ho aperto un portale tematico dedicato ad un tema abbastanza specialistico nel mondo dell'informatica ma che sta acquisendo sempre più popolarità.

Si tratta della programmazione funzionale ed in particolare di F#, il linguaggio basato su questo paradigma sviluppato da Microsoft per contrastare le alternative più diffuse, principalmente Erlang e Haskell.

So che per molti di voi quello che sto scrivendo non ha assolutamente senso, ma se vi occupate di informatica vi consiglio almeno di dare un'occhiata a questo nuovo mondo, magari partendo proprio dagli articoli del portale.

L'indirizzo è www.fsharp.it ed i contenuti sono scritti in lingua inglese, ma questo non può essere un freno per chi lavora nel settore.

Dategli un'occhiata e poi magari lasciate un commento, chissà che un giorno non mi ringrazierete! :wink:

15Jan/080

let title = "Hello World"

When I was attending the first year of my university course, a teacher of mine used Haskell to teach us the basics of software development.

It was amazing, functional programming makes you think differently about programming.

In the functional paradigm functions are used in their real mathematical sense.
Hence, they are only computation objects and there is no information about state or mutable data.

Functional programming languages exist since more than 50 years ago, LISP is one of them, but they have never been seriously adopted outside the academia.

Now, the computer science world is gradually moving toward functional programming.

There is a lot of hype surrounding Erlang, a functional language originally developed by Ericsson, and in 2007 Microsoft presented F#, which is a multi-paradigm language targeting .Net and largely based on OCaml.

In this blog I'll write down my progresses in learning this language and I hope that you can profit from my experience.

I'll come back to you soon with the first article, if you want in the meanwhile you can start from the links on the right side of the page.

Bye!

20May/070

Di ritorno dal PHPDay

Ho dovuto puntare la sveglia alle 5 e andare dalla parte opposta del Paese per partecipare al PHPDay, ma ne è valsa sicuramente la pena.

L'evento è stato un grande successo, circa 200 partecipanti, sponsor del calibro di Microsoft, Zend, Yahoo, Codegear e php | architect, e speaker di alto livello, suddivisi in due canali: Developer ed Enterprise.

Tutti i talk del canale Developer sono anche stati filmati e trasmessi in streaming grazie a Ustream.tv, e molti di essi sono disponibili sul sito dell'evento insieme alle slide.

In particolare ci sono stati due talk strepitosi, quello di Jacopo Romei sull'Extreme Programming e quello di Gabriele Lana sul testing delle applicazioni web.

Buona l'idea di organizzare dei Lightning Talks durante le pause, peccato che il tempo fosse poco e comunque la gente ha bisogno di fare delle pause, soprattutto se è sveglia dalle 5 del mattino! :-)

Unica nota negativa della giornata il pranzo al ristorante convenzionato con l'evento, mi sa che la prossima volta bisognerà  trovare una soluzione migliore.

A parte questo, non può che renderci felici l'annuncio dell'intenzione di raddoppiare il PHPDay e organizzare un secondo evento prima della fine dell'anno, speriamo bene!