- Quelli "sicuri": cosa si ottiene combinando quelli del browser più sicuro al mondo insieme
a 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.

- È 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!
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
Oggi nella casella della posta ho trovato una simpatica sorpresa: la patente americana rinnovata. Non che sia una
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:
Ammeriga
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
) 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$.
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:
Un paio di canzoni ed il dolore del mancato (?) affare sul processore è sfilato via.
Enjoy!
Technorati tags:
Guitar Hero
No c'è un refuso. Parlo di questo "turkey":
P.S. il weekend comincia oggi.
-quack
Il brevetto ep287578, non so se sia un numero ufficiale ma come titolo fa figo, è quello considerato come il "brevetto base MP3".
Mai più che mai vale il disclaimer quello che segue è farina del mio sacco personale.
La mia microanalisi che segue si basa su una voce wikipedia per un motivo semplice: se wikipedia su questi articoli fosse di parte penderebbe dal lato della "fondazione". Cominciamo dal LAME. In passato è stato detto che il codec LAME è "brevettualmente pulito" in quanto non usa l'implementazione di Fraunhofer. Wikipedia è abbastanza chiara, nonostante l'uso del condizionale:
Like most (if not all) MP3 encoders, LAME may implement technology covered by patents owned by the Fraunhofer Society and other entities. The developers of LAME do not license themselves the technology described by these patents. Distributing compiled binaries of LAME, its libraries, or programs which are derivative works of LAME in countries which recognize those patents, may be considered infringing on the relevant patents.
Il codec LAME potrebbe infrangere il brevetto e gli sviluppatori non ne hanno mai comprato la licenza che lo ricopre. Gli sviluppatori di LAME, ignari su tale infrazione, danno però un consiglio abbastanza chiaro:
they advise obtaining a patent license for any relevant technologies that LAME may implement before including a compiled version of the encoder into a product
In poche parole, se volete compilare e ridistribuire il codec, compratevene una licenza (come hanno fatto quelli di Linspire). Ma perché secondo tali sviluppatori non c'è nessuna infrazione? Semplice. I brevetti sono considerati documenti pubblici e come tali consultabili e - immagino - ripubblicabili liberamente. Probabilmente nessuno mi vieta di prendere un brevetto scritto in Inglese, tradurlo in Ostrogoto, e pubblicarlo sul mio blog. Quello che hanno fatto gli sviluppatori del codec LAME è altrettanto semplice, solo che invece dell'Ostrogoto, è stato scelto un linguaggio di programmazione e la "traduzione" pubblicata sul loro sito. Geniale vero? Per gli increduli, la stessa fonte recita:
The LAME developers state that since their code is only released in source code form, it should only be considered as a description of an MP3 encoder, and thus does not infringe any patent by itself when released as source code only.
Una ulteriore nota: i brevetti - in quanto pubblici - non impediscono assolutamente la libera circolazione della conoscenza come qualche crociato vuole far credere. Chiunque può scegliere un brevetto e implementarselo per uso personale (o compilarsi il codec a piacimento). Quello che non si può fare con i brevetti - e qualcuno mi corregga se sbaglio - è ridistribuire commercialmente prodotti che ne fanno uso nei paesi che riconoscono tali brevetti senza pagare la licenza all'intestatario del brevetto. Ops.
Ora gli sviluppatori di LAME hanno un senso dell'ironia formidabile (al mio paese si userebbe una espressione colorita che coinvolge due parti anatomiche ben distinte): hanno protetto la loro "traduzione" di qualcosa che non gli è mai appartenuto con la licenza LGPL. Per cui Sony, che del brevetto sugli MP3 avrà licenziato milioni e milioni di copie ma ha deciso di usare l'implementazione LAME, è stata chiamata in causa per adempiere agli obblighi della licenza LGPL:
In November, 2005 there were reports that the Extended Copy Protection software included on some SONY Compact Discs includes portions of the LAME library without complying with the terms of the LGPL.
Morale della favola: scherza con i santi brevetti, ma lascia stare i fanti le licenze. Aggiungo: nel frattempo occhio a coloro che si professano "maestri di etica".
-quack
P.S. scusate le eventuali ripetizioni; spero che questo sia il post tombale sulla questione "brevetto MP3" e sul perché penso la scelta di Canonical sia filosoficamente ma anche pragmaticamente sbagliata.
buona settimana, ne parliamo presto!
Technorati tags:
security,
privacy
Pagina Successiva »