PDI^2

Facebook Developer Garage a Milano

programmazione, web April 16, 2009 7:51 am (Save post)

Se siete a Milano il forse vi interesserà partecipare al Facebook Developer Garage, evento dedicato a chi usa facebook come una piattaforma per lo sviluppo e non solo come tool per rompere le palle a quella che al liceo era una figa ma non gliela ha mai data.

No, certo è un esempio a caso.

Ad ogni modo, penso sia la prima volta che si tiene un evento simile nel bel paese il che lo rende anche più interessante. E poi visto che passo da milano e potrei esserci pure io è una buona occasione per vedermi, no? ;)

Ad ogni modo l’appuntamento è in via San Barnaba, una prima bozza di programma la trovate qua e se avete qualcosa da presentare io sarei felice di vederlo anche in anteprima :D

Tanto per dirlo

python, personale, italia February 4, 2009 5:31 pm (Save post)

Non ho tempo di fare un cavolo, ma volevo segnalare un bell’articolo su una cosa pessima, ovvero la programmata chiusura dell’aeroporto di ciampino. Ci vorrebbe una petizione per far capire di che idiozia si tratti.

E segnalo anche una cosa bella, il primo libro italico su Django, di Marco Beri. Ci vorrebbe una petizione per averne di più.

Eh lo so, sono un ottovolante emozionale.

Post Archivio n° 24

programmazione, personale, firefox, web, media December 15, 2008 9:13 am (Save post)

Scusate, vado di fretta, scriverò poi la seconda parte di quei tre post di cui ho scritto la prima, ora scrivo una prima parte di un post secondo me.

  • Economia. Leggo un libro in cui è scritto che gli economisti sono scienziati, in quanto basano il loro approccio sul metodo scientifico: osserva, formula una teoria, sperimenta, correggi la teoria. Ovviamente, però non possono sperimentare quindi aspettano che gli capiti davanti un esperimento . Come gli astronomi, dice l’autore, anche quelli sono scienziati. Come gli astrologi, si potrebbe chiosare.
  • Finanza. Il signor Madoff ha fregato il mondo con uno schema di ponzi, ovvero:

    ti do il 110 euro domani se me ne dai 100, tanto il tuo vicino me ne darà 100 perché io gliene do 110, perché il suo vicino me ne darà 100 visto che gliene do 110, perché il suo vicino..

    La cosa curiosa è vedere chi sono gli ingenui che hanno abboccato. HSBC, Santander, Nomura, RBS.
    Diciamoci la verità, il sor Madoff meriterebbe di cavarsela perché ha fregato gente che di professione deve solo non farsi fregare da queste cose. Peccato, adoro i piani ben riusciti.

  • Culinaria. Credo di essere disposto a sposare una donna come questa solo perché mi prepari cestini per il pranzo così.
  • Perl. Ho contribuito a Rakudo, la versione di perl6 che gira su parrot! La mia patch è orrenda ma fa passare dei test in più, tipo due. Lo so, Caro Lettore, che sei convinto che non vedrai mai perl6, per cui forse sarai stupito di scoprire che nella test suite del linguaggio ci sono circa 10k test e ne passano 7k
  • Python. Intanto python 3 è ufficiale. Non sono convinto che nonlocal sia una buona idea, ma è comunque fico. Non abbastanza fico, però, sarà che già c’era un sacco di roba nella 2.6.
  • Javascript. Simpatico podcast da James Robertson che stavolta intervista uno degli sviluppatori di mozilla riguardo TraceMonkey. Frase chiave:

    voglio dire, qui il mondo continua ad usare JavaScript che è un linguaggio disegnato davvero in due settimane

  • Positivismo storico. La turchia usa la marina militare per bloccare navi che cercano petrolio a largo di cipro. In grecia continua una sommossa. In irlanda non si può più mangiare carne di maiale e manzo. A roma muore gente nel tevere che esonda (da quando si è iniziato a usare il termine “esondare”?). In Kosovo arrestano spie tedesche che mettono bombe (o arrestano poliziotti tedeschi che indagano sulla corruzione del novello stato criminale). Ciao diciannovesimo secolo, che piacere rivederti.
  • Etimologico. De Mauro ammazza il dizionario online e lascia solo sinonimi e contrari. Nel frattempo Treccani mette online l’enciclopedia, con tanto di concorso, web tv, toolbar, social fuffa e programmi a lungo termine. Poteva andare peggio.
  • Mozilla 1. Inoltro da pseudotecnico l’invito a fare questo sondaggino di mozilla sull’uso di FF nel vostro paese.
  • Mozilla 2. E inoltro la scoperta di Perla Scandinava che commentava qua, bypassando i captcha, riguardo la scoperta di Webvisum, plugin per FF che risolve i captcha ottici, liberando persone con problemi di vista da tale idiozia (si lo so, essendo utente di blogsome dovrei stare zitto).
  • Italiano. Su SvN chiedono se qualcuno abbia usato rosetta stone, un software per imparare le lingue che dalle demo sembra una figata. Questo è del tutto irrilevante, la cosa interessante è che su 69 persone che rispondono 12 dicono che stanno imparando o hanno imparato l’italiano. Notando che circa una persona su tre dice cosa sta imparando questo significa che il 40% degli americani web2.0 studia l’italiano.
  • Ungherese. L’ungherese è huffman encoded, come molte lingue. Ma qua si esagera, al punto che siccome il caso comune di essere è alla terza persona, allora quando parli in terza persona puoi ometterlo. Cane bello. Cibo caldo. Il verbo avere è eliminato in quanto ridondante, basta dire esiste una casa mia, dove ovviamente esiste è optimized away nel secondo passaggio. Visto che la struttura del linguaggio è stack based tipo giapponese o FORTH mi chiedo se capire il compilatore di Factor potrebbe aiutare.
  • Latino. Eo, is, ivi, itum, ire.
Higher Order Perl scaricabile liberamente

programmazione, lettura December 10, 2008 9:57 am (Save post)

Piccolo post tanto per notificare i lettori che ancora non lo sapessero della possibilità di scaricare liberamente Higher Order Perl, un bellissimo libro che insegna ad usare perl5 in modo intelligente, non come un awk con la sintassi cambiata. “Cambiata” poi..

Ammetto che io leggendolo a volte mi son sentito uno snob, da nativo rubyista.. un intero capitolo dedicato a implementarsi gli iteratori? Davvero le dispatch tables meritano 22 pagine?
Ma mi rendo conto che in realtà il fatto che abbia già certe conoscenze non significa che siano banali, e MJD è un ottimo autore e gli esempi sono sempre interessanti quindi val la pena rileggerle. E poi viene fuori che alla fine non le conosco tanto bene.

Inoltre, i capitoli avanzati sono oggettivamente fichissimi: chi avrebbe pensato di sviluppare un software per disegnare diagrammi in ASCII spiegando la programmazione con vincoli?

Infine il libro va letto per tre motivi non tecnici.

Primo, il typesetting è bellissimo, se non sbaglio è una versione adattata di quello che si ottiene con ClassicThesis in LaTeX, o comunque qualcosa basato su gli elementi dello stile tipografico.

Secondo, la pagina about the cover, anche non voleste leggere il libro, anche non aveste idea di cosa è perl, non siete programmatori e non lo sarete mai, vi consiglio di leggere questa pagina.

Terzo, perché nella pagina per il download c’è una citazione geniale, che riporto qua in italiano perché so che non cliccate mai sui miei link, in risposta alla domanda perché ci è voluto tanto

[…]Ero.. rimasto senza benzina. Avevo una gomma a terra. Non avevo i soldi per prendere il taxi. La tintoria non mi aveva portato il tight. C’era il funerale di mia madre! Era crollata la casa! C’è stato un terremoto! Una tremenda inondazione!
LE CAVALLETTEEE!!!

Buona lettura :)

ordinare un array a grandi linee, revisited

programmazione December 1, 2008 11:46 am (Save post)

In occasione del Ruby Social Club milanese Matteo ci aveva proposto un problemino, che ri-riscrivo qui:

vogliamo ordinare un array in modo che tutti gli elementi X vengano prima di quelli Y.
Ad esempio, ordinare [1,2,3,4,5,6,7] in modo che tutti i dispari vengano prima dei pari: [1,3,5,7,2,4,6].
In spazio costante (quindi in place).
Come si fa con una partizione in tre (minori, medi, maggiori) ?

Matteo ci aveva presentato la cosa da un punto di vista interessante, ovvero quello dell’osservazione delle invarianti. Di recente ha parlato della stessa cosa (invarianti, non il giochino) al XP Day Benelux e ha postato slide & problemini che sono interessanti, e in questo modo mi ha fatto tornare in mente questo problema, che mi ero scordato continuamente.

La mia soluzione al problema
Quando ho cercato di risolvere questo problema son partito da questo codice:


def order(ary,&big)
  start = 0
  fin   = ary.size-1
  while start < fin
    if big[ary[start]]
      # this is big, we move it to end and ..
      ary[start],ary[fin] = ary[fin], ary[start]
      # ..skip end
      fin = fin -1
    else
      # this is small and shall be here, we skip it
      start = start+1
    end
  end
  ary
end

Per ordinare un array composto da 1 e 2 si userebbe così:


tc  do
  def chk(*ary)
    # the definition of the \"not small\" property
    order(ary) {|x| x==2}
    is ary.sort, ary # as assert_equal
  end
  t \"mini\" do
    chk 1,2
  end
  t \"three els\" do
    chk 1,2,2
  end
  t \"inverse\" do
    chk 2,1
  end
  t \"middle\" do
    chk 2,1, 2
  end
  t \"last \" do
    chk 2, 2, 1
  end
 t \"middle 2 in 4 \" do
    chk 1, 2, 2, 1
  end
 t \"two 1 in 4\" do
    chk 2, 1, 1,2
  end
 t \"mixed\" do
    chk 1, 2, 1, 1,2
  end
 t \"mixed large\" do
    chk \"2 2 1 2 1 1 2 1\".split
 end
end

Come estendo questa cosa a tre valori o n? Per pigrizia ho pensato di riusare tutto: l’ordinamento/partizionamento in 3 è semplicemente

  1. dividere tutti in piccoli e mediograndi
  2. dividere i mediograndi in medi e grandi

In codice, avendo fattorizzato la logica del metodo order in un helper, un ordinatore per 1,2 e 3 è semplice:


def order_helper(ary,start,fin,big)
	
  while start < fin
    if big[ary[start]]
      # this is big, we move it to end and skip end
      ary[start],ary[fin] = ary[fin], ary[start]
      #skip end
      fin = fin-1
    else
      # this is small and shall be here, we skip it
      start = start+1
    end
  end
  [ary,start,fin]
end
	
def order2(ary)
  start = 0
  fin   = ary.size-1
  _ , _, start = order_helper(ary,start,fin, proc {|x| x>1})
  order_helper(ary,start,fin, proc {|x| x>2})
 end

Questo codice fa esattamente quello che dicevamo: lavora sull’intero array per partizionare tra piccoli (gli 1) e mediograndi (2,3), poi lavora sul sub-array che inizia dalla fine dei piccoli per partizionare medi (2) e grandi (3).

E ovviamente i test


tc do
  def chk(*ary)
    order2(ary)
    is ary.sort, ary
  end
  t \"sorted\" do
    chk 1,2,3
  end
  t \"mixed\" do
    chk 2,1,3
  end
  t \"reversed \" do
    chk 3, 2,1
  end
  t \"half rev \" do
    chk 3,1, 2
  end
  t \"five els \" do
    chk 1,2, 3,1, 2
  end
  t \"large \" do
    chk 1,2, 3,1, 2
  end
  t \"it still works with lesser arity sets!\" do
    chk 2,2
  end
end

Giovanni nella sua soluzione effettuava una partizione tra maschi (piccoli), femmine (grandi) e gender-neutral (medi). Ok chiaramente lui intendeva “gay”.
Da me diventerebbe questa:


def order_sex(ary)
  start = 0
  fin   = ary.size-1
 # put males at the start
  _ , _, start = order_helper(ary,start,fin, proc {|x| x!='m'})
 # put gays at the start of the end. No moral judgement intendend :P
 order_helper(ary,start,fin, proc {|x| x=='f'})
end
	
tc do
  def chk(*ary)
   order_sex(ary)
   is ary.sort.reverse, ary
  end
  t \"gio 1\" do
   chk(*%w(g g g g f f f m g f))
  end
  t \"gio 2\" do
   chk(*%w(g m f g f g f g f m g f))
  end
end

Sei un Deficiente! che è successo alla OOP?
Beh, due cose: primo non mi serviva, secondo non mi bastava.
Mi spiego, sarebbe banale spostare la definizione di big in un metodo di, diciamo, Integer piuttosto che Person, no?
No. Perché ovviamente il concetto di piccolo o grande è relativo alla dimensione della nostra partizione. Se per due valori basta avere piccolo e grande, per tre ci serve un medio, il che significa che dobbiamo ridefinire tutto e rompere le cose.

La soluzione, pensata qualche miliardo di anni fa, è di stabilire un ordinamento tra X e Y. Strano, vero, ma adesso ha senso tutta quella fuffa su <=>, cmp() etc, vero?

Solo che è noioso da fare per tipi generici quando non c’è il multiple dispatch _e_ i subset type stile perl6. Poi ne riparliamo.

Comunque si, si può fare ad oggetti. L’unico problema è che se introduciamo una relazione di ordine su cui basare la partizione allora avremo bisogno di controllare due elementi per volta (i.e. non possiamo dire array[x]!=2 ma dobbiamo dire array[x] != array[y]). Per ora sorvoliamo, poi ci torno.

Ma non siamo un po’ lenti?
Penso di si, in fondo questa cosa impiega un tempo N per scorrere l’array la prima volta, e un tempo N-S (tutti meno i numeri piccoli) per farlo la seconda volta.
Il numero di swap, immaginando sia l’operazione più costosa, è al max M+B (medi più grandi, primo loop) + B.

La soluzione di Giovanni invece fa tutto in un passaggio, il che per un sacco di tempo mi ha lasciato convinto che fosse largamente migliore. Però non ne sono sicuro: il loop è N, ma l’interno del loop ha un numero maggiore di confronti. Questo perché c’è quell’ if annidato. Ma non lo capisco bene, per cui, benchmark, con una lista creata così:


require 'benchmark'
	
n = 50000
Benchmark.bm do |x|
  a=(\"m f g \"*150000).split
  b= a.dup
  x.report { 2.times{a.sex_partition}}
  x.report { 2.times{b.order_sex}}
end

Sembra che la soluzione del nemico sia consistentemente più veloce della mia, cavolo

      user     system      total        real
  5.500000   0.020000   5.520000 (  5.601005)
  4.820000   0.020000   4.840000 (  4.918940)
	

Ingrandendo un po’ il set (150k a 200k):

      user     system      total        real
  6.860000   0.030000   6.890000 (  6.996474)
  6.000000   0.030000   6.030000 (  6.114625)

e un altro po’ (200k a 300k)

      user     system      total        real
 12.050000   0.070000  12.120000 ( 12.287683)
 10.620000   0.050000  10.670000 ( 10.937084)

Mannaggia, la mia soluzione è consistentemente la più lenta. Mh. consistententemente.
Eh si, sembra che tutte e due crescano allo stesso modo, e quindi la lentezza è overhead implementativo (probabilmente le proc, stupido ruby) e non algoritmica. Fico.
Tanto per verificare, ho provato a cambiare l’array aumentando il numero di femmine o di gay, e i cambiamenti sembrano nuovamente consistenti.

E, si, i risultati sono uguali, a parte quando ci sono input semi-invalidi (i.e. un array con soli tre maschi).

Si, lo so, sono assolutamente antiscientifico :)

E che c’entra la storia delle invarianti?

Ah! Ne parlo la prossima volta, che adesso è ora di pranzo, c(hi)are fresche et dolci patate con i cavoli.

Hell becoming colder

programmazione, web, software September 28, 2008 9:52 pm (Save post)

Prima google usa codice open source pubblicato da microsoft, poi leggo da NRK che microsoft mette codice open source in visual studio.

Nel frattempo, Sun accoglie sviluppatori di linguaggi alternativi per la JVM a casa sua, che non si sa mai possano dargli un consiglio, e la Diesel pubblica porno safe for work .

Succede sempre un casino appena io mi scollego da internet per un paio di settimane.

Note dal Ruby Social Club Milano 3

ruby, personale, rubyonrails, ruby-it September 27, 2008 1:41 pm (Save post)

Passando da milano un paio di giorni fa i rubyisti locali hanno avuto l’ottima idea di organizzare un meeting.
In fondo un po’ me lo meritavo, essendo stato presente al primo storico RSC dovevano farmi vedere come siam cresciuto in due anni :)

E cavolo se siamo cresciuti! La prima volta eravamo in cinque o sei, se non ricordo male, stavolta eravamo una trentina! Note sparse:

  • l’accoglienza di mikamai è stata ottima. Anche perché mi hanno fatto stare da loro per due giorni oltre alla sera del meeting :)
  • ben tre donne!
  • nei talk si è parlato, tra le altre cose, di tecnologie di scraping, amazon EC2, assistenti virtuali, visualizzazione di social network con Processing
  • all’ultimo momento ho scoperto di dover fare un mini-talk anche io. Come speaker faccio schifo. La micropresentazione è online, ma siccome è stata accroccata in fretta e con il takahashi method non credo ci capirete niente. Però se volete chiedere fate pure :)
  • Matteo Vaccari ha tenuto una pico-sessione al proiettore presentandoci un problema interessante:

    supponiamo di voler partizionare/ordinare un array in modo che tutti gli elementi X vengano prima di quelli Y.
    Ad esempio, ordinare [1,2,3,4,5,6,7] in modo che tutti i pari vengano prima dei dispari.
    La cosa va fatta in place, in modo che lo spazio usato sia costante (qualche variabile ausiliaria va bene). E in tempo lineare.
    Questo è facile, effettuando uno scan della lista e scambiando ogni volta l’elemento i-esimo con l’elemento j-esimo, dove i è inizialmente zero (incremento quando non scambio) e j è array.length -1 (fine array, decremento quando scambio).
    In questo algoritmo l’invariante è che ogni passo riduce la dimensione dell’array lasciando le parti esterne ordinate (l’inizio che si è già passato perché composto da elementi “minori” e la fine che si è allontanata perché composta da elementi “maggiori”).
    Come si fa con una partizione in tre (minori, medi, maggiori) ?

    Divertitevi, sulla ML c’è un thread (spezzato in due) a riguardo

  • io avevo anche promesso a un paio di persone di dargli i dati precisi di un altro problemino, ma non mi ricordo a chi l’ho detto. Beh in ogni caso il problema è il seguente:

    Dato un array A di lunghezza N vogliamo produrre in output un array B della stessa lunghezza in cui ogni a ogni elemento A[i] corrisponda il prodotto di tutti gli elementi dell’array tranne se stesso.
    Ad esempio per A= [1,2,3,4] avremmo B= [2*3*4, 1*3*4, 1*2*4, 1*2*3] = [24, 12, 8, 6].

    Ovviamente, in tempo lineare.
    Se ora state per dire “basta usare la divisione..” beh ovviamente no, senza usare divisione, modulo e similari.

  • tra le altre cose di cui mi ricordo di aver parlato: couchdb, linguaggio io, bloody mary, le cameriere, django, biologi, ungheria, irlanda, etc etc
  • è sempre bello incontrare persone che hai sempre letto sullo schermo e scoprire che hanno una terza dimensione

Mi scuso con quelli che mi son stati vicini perché credo di aver parlato troppo e ascoltato poco, ma mi ha fatto molto piacere incontrarvi, spero si possa fare di nuovo, e d’altronde sarebbe anche ora di fare un nuovo RSC meeting a roma :)

Ignorance is bliss

programmazione September 4, 2008 3:35 pm (Save post)

È bello essere un non informatico.

Quando sei un non informatico e fai il recupero password sul sito della wizzair e ti arriva la tua vecchia password via mail in chiaro non ti incazzi.

Quando cerchi di prenotare un volo sul sito di citylink usando browser diversi da IE e ti capita un errore server side di websphere non ti incazzi.

Quando ti capita un errore sul sito di ryanair e ti viene detto The connection failed for Server = ‘FRRZPHEDQ502\REZOLPRD01,52900′, Database = ‘REZFROL01′ e ti danno la possibilità di visualizzare lo stacktrace:


Server stack trace:
   at Navitaire.NewSkies.RemotingServices.ServiceManagers.SessionManager.Logon(LogonRequest request)
   at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
   at System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(RuntimeMethodHandle md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
   at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)
	
Exception rethrown at [0]:
   at Navitaire.NewSkies.UI.Web.SkySales.HttpHandlers.SkySalesApplicationHandler.ProcessRequest(HttpContext context)

..tu mica ti incazzi.

Come si dice, beato te, che non capisci un cazzo.

Complessità: diventare un programmatore java, e un semantic web’aro

programmazione, personale August 7, 2008 10:45 pm (Save post)

Ovvvero, quando sono arrivato a galway ero una persona semplice, e riparto più complicato, se non più complesso.

Guardavo l’ontologia più diffusa al mondo, foaf, ad esempio. La usano livejournal, vox, opera e un milione di altri siti.
Serve a descrivere persone, e relazioni tra di esse, ma siccome è stato il primo vocabolario ad avere un’ampia diffusione, è diventato un contenitore per una marea di robe astrattissime, come ad esempio “topic” che collega una pagina al soggetto della stessa.

Eppure, se volessi specificare il nome di una persona, fondamentalmente non funziona. Perché hai le proprietà “name”, “surname”, “first_name”, “givenname” e “familyName”.
Indovina quali devi usare? E come specificare un secondo nome? E perché non c’è un filo di consistenza nel dare un nome alle proprietà?
Broken. E come fissarlo? Lasciando il problema aperto per anni.

Il semweb’aro medio non pensa a risolvere un problema. Pensa a risolvere meta-meta-problemi. O a fare proof of concept che poi la gente adotta lo stesso e restano broken per anni. RDF Review anyone?

Io ad esempio ho provato a chiedere di poter collegare una vcard a una foaf:Person. Semplicemente, avere una proprietà foaf:hasBusinessCard.
Ne è nata una discussione su come gestire le proprietà, come gestire automaticamente gli aggiornamenti delle ontologie, e come usare un metodo di sviluppo basato su personae e uno pseudolinguaggio naturale che sia machine readable.
Due mesi dopo, quella singola riga di codice per aggiungere una cosa che a me serviva ancora non esiste.

Eppure dopo un po’ ti infettano, un pomeriggio parlando con paolo ho incominciato a dirgli che dovevo scrivere un’ontologia per gestire dei prodoti e che però era scomodo da fare con i tool esistenti e quindi avrei dovuto scrivere un tool per farlo ma che sarebbe stato meglio scrivere uno strumento che mi permettessi di generare questo tool e…
Stai diventando un semanticwebb’aro, mi ha detto lui. Ha ragione, solo che era una complessità che aveva senso, per me.

Allo stesso modo, io sono arrivato a galway rubyista, e me ne rivado javanese.

Poco prima di partire, paolo s’è messo a scrivere una servlet che gestisse i ping per il nostro progetto (pensa: tu mi dici un url, io recupero la pagina).
Si poteva risolvere in dieci righe in modo stupido. Lui s’è messo a scrivere la cosa, poi ha generalizato per astrarre il database, e per rendere tutto testabile, e per avere diverse strategie di fetch. A un certo punto s’è girato e m’ha detto sono arrivato a scrivere una abstract factory, sto diventando un javista.

La cosa drammatica è che tutta quella complessità non era assurda per me, ma motivata,tutto aveva perfettamente senso, solo che non si riusciva a vedere a occhio perché invece di essere due righe di codice erano diventate mille.

Quando un ambiente ti porta a pensare cose complicate, è difficile pensare semplicemente.

Antoine de Saint-Exupery, dicendo “perfection is achieved, not when there is nothing left to add, but when there is nothing left to remove” lo diceva ignorando i fattori sociali.
La perfezione è raggiunta quando non c’è niente da togliere, ma la tua impressione di necessità cambia sempre in base all’ambiente.
Non serve a niente bollire l’acqua prima di berla. Il fatto che fosse infetta a galway l’estate scorsa ti fa rivalutare la cosa.

articoletto su darcs

programmazione, web February 4, 2008 8:02 am (Save post)

Su StackTrace l’editor della categoria SW Engineering (piergiuliano bossi) ha pubblicato un mio articoletto su darcs, andate a darci un’occhiata :)

Se l’editor di The Ruby Mine (andrea reginato) trova tempo di riscriver^Wcorreggerlo, dovrebbe apparire un mio articoletto anche lì.

E con questo posso tirare una riga su “Cose da fare nel 2008: scrivere qualcosa per TRM e ST“.

Get free blog up and running in minutes with Blogsome
Theme designed by Janis Joseph