Sparalink #4
  • Quelli "sicuri": cosa si ottiene combinando quelli del browser più sicuro al mondo insieme allegriaa quelli con la security in mind sin dal primo giorno? Si ottiene l'unico browser al mondo vulnerabile al baco di QuickTime . Come direbbe Mike Buongiorno: allegria!
  • Bachi conosciuti: un giorno racconterò la storia del baco internamente più famoso del Framework 1.1; nel frattempo mi consolo con il fatto che "qualcuno" rilascia un update software pur sapendo che potrebbe rendere un sistema in-operativo; quando l'unica soluzione è cancellare tutti i dati senza neanche "spostarli"
  • I migliori clienti di Vista? indovinate su cosa gira usa il 10% delle copie retail di Vista (secondo qualcuno circa 2,4 utenti visto che in tutto sono state vendute 2 dozzine di copie)? Lo dice Joe Wilcox. In tutta onestà non so se sia un bene o un male. Smile
  • È uscito Visual Studio 2008 già da una settimana. La feature più interessante del C# 3.0? Linq, ancora meglio Linq2SQL degno erede di ObjectSpaces. Scott Guthrie parla nel suo blog di come una LINQ diventa SQL.

-Allegriaaaaaaaaaah!

Pubblicato venerdì 30 novembre 2007 alle 5:22 PM - 10 commenti so far
Archiviato in: Link, Cazzate

Metodi dinamici di delegazione

Questi giorni sto giochicchiando con i DynamicMethod di .Net e ho pensato di condividere. Lo scopo di tali classi - conosciute anche come lightweight code generation - è di generare codice IL (il P-code di .Net) dinamicamente. Accoppiandoli con i metodi delegate (puntatori a funzione) si possono fare cose veramente interessanti. Gli esempi che seguono sono alquanto banali (il classico "Hello World"), ma con la LCG si possono fare cose moooolto deliziose: esempio 1, esempio 2.

Altrettanto interessante è il funzionamento della Virtual Machine stack based di .Net: il set di istruzioni è documentato qui ma se si vuole giocare seriamente a questo tipo di giochi pericolosissimi (roba impossibile da debuggare capace di creare codice a fungo atomico in men che non si dica) consiglio _IL_ testo di riferimento che è "Compiling for the .Net Language Runtime" il cui unico neo è quello di essere basato sulla CLR 1.0 (niente template e altre corbellerie "moderne"). Volendo, la via più breve per capire l'IL da generare, è l'uso "a posteriori" di reflector.

Ed ora gli esempi, giusto per stimolare l'appetito:

using System;
using System.Reflection;
using System.Reflection.Emit;

public class TestClass
{
    string message;
    public delegate void TestMethod();
    TestMethod myTestMethod;

    public TestMethod MyTestMethod
    {
        get { return myTestMethod; }
    }

    public TestClass(string aMessage)
    {
        this.message = aMessage;
    }

    public void RealTestMethod()
    {
        Console.WriteLine(this.message);
    }

    public void CreateMethod()
    {
        /*
         * this is equivalent to:
         * Console.WriteLine("Hello world!");
         * there is no access to object members 
         * so the method can be declared as 'static'
         * 
         */
          
        // declare the method signature as void HelloWorld()
        //
        DynamicMethod dm = 
            new DynamicMethod("HelloWorld",  // name of the method
            typeof(void),           // return type
            new Type[] { },         // input types
            typeof(TestClass)); // class to 'attach the method to
        ILGenerator il = dm.GetILGenerator();

        // create a constanst string using the 
        // message and put it on the stack
        il.Emit(OpCodes.Ldstr, this.message);

        // invoke Console.WriteLine(string)
        // since it's a static method it only 
        // requires a string (the one on the stack)
        il.Emit(OpCodes.Call, 
            typeof(Console).GetMethod("WriteLine", 
            new Type[] { typeof(string) }));

        // return
        il.Emit(OpCodes.Ret);

        // create a delegate
        this.myTestMethod = 
            (TestMethod) dm.CreateDelegate(
            typeof(TestMethod)
            );
    }


    public void CreateMethod2()
    {
        /*
         * this is equivalent to:
         * Console.WriteLine(this.message);
         * there is access to object members 
         * so the method cannot be declared as 'static'
         * 
         */

        // declare the method signature as 
        // void HelloWorld(TestClass implicitThis)
        // it will be mapped to 
        // TestClass.HelloWorld() as instance method
        //
        DynamicMethod dm = new DynamicMethod(
            "HelloWorld",                      // name of the method
            typeof(void),                      // return type
            new Type[] { typeof(TestClass) },  // input types
            typeof(TestClass));     // class to 'attach' the method to
        ILGenerator il = dm.GetILGenerator();

        // puts the arg_o (this) on the stack
        il.Emit(OpCodes.Ldarg_0);

        // puts (POP)->message on the stack
        il.Emit(OpCodes.Ldfld, typeof(TestClass).GetField("message", 
            BindingFlags.NonPublic | BindingFlags.Instance));

        // invoke Console.WriteLine(string)
        // since it's a static method it only 
        // requires a string (the one on the stack)
        il.Emit(OpCodes.Call, 
            typeof(Console).GetMethod(
                "WriteLine", new Type[] { typeof(string) }
                )
            );

        // return
        il.Emit(OpCodes.Ret);

        // create a delegate
        this.myTestMethod = 
            (TestMethod)dm.CreateDelegate(typeof(TestMethod), this);
    }
}


public class HelloWorld
{
 
    public static void Main(string[] args)
    {
        TestClass myTestClass = new TestClass("Hello World!");
        myTestClass.CreateMethod();
        myTestClass.MyTestMethod();

        myTestClass.CreateMethod2();
        myTestClass.MyTestMethod();
    }

}

-quack

Pubblicato giovedì 29 novembre 2007 alle 3:43 PM - 9 commenti so far
Archiviato in: Codice

Burocrazie

Oggi nella casella della posta ho trovato una simpatica sorpresa: la patente americana rinnovata. Non che sia una patente grande sorpresa perché il "rinnovo" - per la prima volta - l'ho fatto online alcuni giorni fa. Però mi ha portato a riflettere della differente burocrazia tra il paese che mi ospita e l'Italia.

Innanzitutto non so neanche se la mia patente italiana è scaduta o meno: questo perché la scadenza del documento italiano è legata alla data di rilascio e di quella data mi ricordo a malapena l'anno. Il documento americano invece, intelligentemente, scade il giorno del proprio compleanno. Vuoi mettere tra le due date quale sia la più facile da ricordare?

Poi ci sono i costi: 25$ tutto compreso pagabili via carta di credito. Da aggiungere la completa informalità della lettera che mi invita a rinnovare il documento con tanto di torta con le candeline e scritta con un linguaggio ultra-semplice. In Italia, tutte le comunicazioni ufficiali, sono seriose e scritte in gergo burocratico.

Infine la comodità: tra rinnovare online e fare 30-40 minuti di fila allo sportello non c'è proprio paragone. Tanto in tutti e due i casi la patente verrà comunque spedita a casa per verificare l'indirizzo fornito. Una delle tante cazzate geniali!!

-quack

Technorati tags:

Pubblicato mercoledì 28 novembre 2007 alle 6:20 PM - 3 commenti so far
Archiviato in: Cazzate, Seattle e dintorni

Venerdì nero

Il giorno dopo il Thanksgiving (che appunto è il quarto Giovedì di Novembre) si chiama Venerdì Nero. È un giorno in cui tutti i commercianti fanno sconti pazzeschi su alcuni articoli molto appetibili come regalo di Natale. La teoria più accreditata su tale nome fa coincidere con il Venerdì nero, sia per gli sconti che per la posizione strategica nel calendario, il giorno in cui le attività commerciali raggiungono "la parità". Tutti i giorni precedenti sono considerati "rossi" quelli successivi "verdi". I negozi aprono molto presto (Fry's apriva i battenti alle 5 e mezza) e la gente fa ore ed ore di fila per accaparrarsi gli articoli più convenienti. Dietro questa manovra molto consumer friendly parrebbe nascondersi un interesse molto subdolo dei commercianti: pare che in base ad una legge ammerigana, se si restituisce un prodotto senza essere provvisti di scontrino, il commerciante ha il diritto di restituire il prezzo storicamente più basso durante i 30 giorni precedenti alla restituzione; con un paio di giorni di supersaldi strategicamente piazzati (come appunto il Venerdì Nero) è possibile garantirsi un interesse economico non trascurabile su tutti i regali di Natale - ovviamente senza scontrini - non perfettamente azzeccati! Quanto sia vera questa storia, non lo so neanche io: mi è stata raccontata da Forrest - mio collega quasi-onnisciente - tanto, troppo tempo fa

Questo è il primo anno in cui ufficialmente ho deciso di fare shopping. Attirato a Fry's come una allodola allo specchietto da un paio di offerte molto interessanti: combo Intel QuadCore (Q6600) + scheda madre SiS (di quelle che danno i problemi coi mouse su Ubuntu Big Smile) a 200$, prezzo di molto inferiore al costo del processore soltanto; drive USB da 8GB a 30$ (con rebate!); drive da 4GB a 13$ (sempre con rebate). Purtroppo siamo arrivati tardi (circa 10AM): l'affare più goloso (il processore) era andato già esaurito. La fila alle casse, che si estendeva labirinticamente per tutto il negozio, stimabile in circa 120 minuti di attesa non è valsa la pena per gli altri deal (sono un freddo e cinico calcolatore).

E così io e Beppe, anche lui alla prima esperienza di VN, abbiamo abbandonato sconsolati il paradiso di Fry's alla ricerca di altri lidi. Siamo approdati da Circuit City che aveva una super offerta su Guitar Hero II + chitarra per XBOX 360 a 60$.

GuitarHero2

Ormai scettici ci siamo avventurati lo stesso ma per fortuna, vuoi perché tutti magari erano da Fry's, ne abbiamo trovata una (ce n'erano diverse). Per par condicio abbiamo pensato anche alla formichina, ormai dietologa iscritta all'albo, con una confezione di Dance Dance Universe corredata di tappeto sensore allo stesso prezzo nonostante l'adesivino indicasse 20$ in più. Per la prossima stagione festiva siamo ormai ben attrezzati. A questo punto, la foto commemorativa di Beppe in versione rock-star, non poteva mancare:

BeppeRockStar

Un paio di canzoni ed il dolore del mancato (?) affare sul processore è sfilato via.

Enjoy!

Technorati tags:

Pubblicato sabato 24 novembre 2007 alle 12:58 AM - 8 commenti so far
Archiviato in: Cazzate

Happy turkey weekend

turkey

No c'è un refuso. Parlo di questo "turkey":

turkey

P.S. il weekend comincia oggi.

-quack

Pubblicato giovedì 22 novembre 2007 alle 5:49 PM - 1 commento so far
Archiviato in: Cazzate