Claudio Brotto

luglio 2007 - Posts

WAP - Windows Academic Program

Di recente ho avuto un paio di occasioni per chiacchierare a ruota abbastanza libera (pure troppo :-)) di Microsoft all'interno delle università.

Dire che Microsoft non è generalmente ben vista in ambito accademico è un po' come dire che non ci sono più le quattro mezze stagioni: un luogo comune grossolano e dal mio punto di vista poco concludente, al di là del fatto che poi ci sia un fondo (o più !) di verità.

Argomento complesso, comunque, anche perchè si presta proprio bene al fondamentalismo (che sta da *entrambe* le parti, come credo ogni fondamentalismo).

Penso che il fondamentalismo sia *sempre* sbagliato e che un modo per combatterlo sia l'informazione e la conoscenza, almeno per quanto possibile, dell'altro lato del mondo, ammesso e *non* concesso che questo mondo lo si voglia spaccare in due.

Ecco un'iniziativa che mira a diffondere questa conoscenza.

The Windows Academic Program supplies universities with concepts, code, and projects useful for integrating core Windows® kernel technologies into teaching and research. The program includes Windows OS Internals Curriculum Resource Kit, ProjectOZ, and Windows Research Kernel. These components illustrate real-world examples of the principals taught in class and provide source code and materials for academic purposes.

In altri termini un "pacchetto" con tanto di:

  • Materiale didattico (parlano anche di quiz !!).
  • Sorgenti di parte del kernel di Windows. Tanto per capirci, ci troviamo dentro tanta bella gestione dei processi, scheduler, virtual memory manager, object manager ... presente tutte quelle cose che uno si legge sul Solomon-Russinovich ?
  • Una sorta di simulatore che astrae il layer "fisico" (instruction set della CPU ...) ed è utilizzabile per fare tante belle prove sull'infrastruttura di un sistema operativo.

Non male, vero ?

Mi chiedo se non sia possibile reiscriversi all'università per seguire *solo* questo corso :-P

Fonti e Riferimenti:

[OT] Devo farlo :-)

Cit: "Il nome della response da SQL ... potremmo mettere ... "

<segue elenco di nomi assurdi, almeno una decina>

Cit: "... RISP RASP"

:-P

Channel 8 apre le danze

Channel 8 is THE place to be for STUDENTS who want to code, connect and create technology. Stay plugged into tech news and share in the experience with students around the world just like you who want to see their creations come to life. This is also a back door directly into Microsoft just like Channel 9 but from a student point of view.

Stavo dando un'occhiata al sito (http://channel8.msdn.com), c'è da dire che l'aspetto grafico è di sicuro originale e (questo è il mio gusto) per nulla male :-)

Aspettando i contenuti, si aggiunge comunque un altro mattoncino nel social network "accademico" secondo Microsoft :-)

Posted: lug 22 2007, 06.36 by devlizard | with no comments
Filed under:
The killer student

Forse uno dei corsi che ho seguito e ricordo con maggior chiarezza ancora oggi è il cosiddetto "train-the-trainer".

Per il conseguimento della certificazione MCT è, infatti, necessario dimostrare di possedere capacità didattiche. Cosa che è praticamente impossibile valutare in maniera corretta se si prescinde dalla comprovata esperienza sul campo. Il che porta al paradosso del "docente junior", figura professionale che ha nella definizione stessa un controsenso.

E quindi ... e quindi viene richiesto agli aspiranti MCT che non hanno già lavorato nel campo della formazione di frequentare un corso che dia, per lo meno, dei consigli e delle guideline. [Questo era 4 anni fa, non sono aggiornato su eventuali modifiche alla procedura, fate riferimento qui per dettagli generali].

Sinceramente ... pensavo fosse una completa *******.

Non lo è stato, anche se da lì a poter affermare di saper insegnare passa un mondo (anche due :-))

Non lo è stato perchè devo dire che quel centinaio di consigli, annotazioni, astruse e astratte considerazioni ogni tanto me le ritrovo nella pratica della mia professione.

Una cosa che mi colpì in modo particolare fu l'identificazione di alcuni stereotipi di alunni, tra cui:

  • il "Distratto"
  • il "Rompiballe"
  • il "Killer" :-O

Non ho sottomano le slide che l'insegnante ci aveva mostrato, ma credo di poter sintetizzare abbastanza bene.

Il distratto è ... distratto ! Probabilmente è lì per ragioni diverse dall'interesse per gli argomenti trattati, è stanco, insomma ... non ti segue. Tecniche per affrontare il distratto: cercare di rendere il corso divertente (anche se non stiamo parlando di cartoni animati) o, quanto meno, interattivo.

Il rompiballe ... non gliene va bene una. Fa caldo, fa freddo, si sta bene ma la sedia è scomoda, il pc è lento, il pc è troppo veloce (!), c'è troppa luce, troppo buio, quando si fa pausa?, il caffè è troppo lungo, il caffè è troppo caldo, il caffè è troppo freddo. Tecniche per affrontare il rompiballe: pazienza (tanta), coinvolgere il resto degli alunni chiedendo se per tutti valgono le stesse considerazioni che il rompiballe sta allegramente portando alla vostra attenzione, proporgli di andare a prendere il caffè al bar di sotto dove lo fanno veramente buono.

E infine il killer.

Secondo la definizione che me ne hanno dato, il killer è il terrore dei docenti.

Perchè è lì per demolire. L'argomento, il prodotto, il docente, a scelta e magari tutti insieme.

Perchè lo fa ? Tanti motivi che possono variare dalla ostilità preconcetta per uno degli aspetti di cui sopra, alla presunzione di saperne di più di tutto e tutti (cosa che, notate bene, non è neanche detto che non sia verà !!).

Come si affonta il killer ?

Con la competenza, prima di tutto.

Con la capacità di ammettere, se è il caso, di non saper rispondere ad una delle terribili "killer questions".

E soprattutto con una regola *vitale*, che mi ricorda WarGames, e che parafrasata dice:

"Un gioco che non puoi vincere non ha senso di essere giocato".

Occhio perchè non è banale: non si parla di "vincere" rispondendo a tutte le domande/critiche/attacchi.

La regola è *non contrattaccare*, o almeno farlo al di fuori del tempo didattico canonico (pause, pranzo) e lasciar passare.

Ingaggiare un duello con il killer è perdente in partenza, indipendentemente dall'esito della "battaglia". Perchè anche se lo sconfiggi in battaglia, lui rinasce come l'araba fenice (o come un animale ferito e doppiamente in*****o).

Tutte queste battaglie messe insieme fanno una "guerra" per la quale il resto dell'aula è la popolazione civile ! La quale, corollario di ogni guerra, è quella che comunque subisce le perdite maggiori.

In questo caso le perdite sono tangibili in temini di:

  • tempo (perso dal docente "punzecchiato" nell'annientamento del killer)
  • denaro (i corsi costano !)
  • attenzione (il resto degli alunni inizia a fare la battaglia navale)
  • fluidità didattica
  • qualità della docenza (difficile che un docente, dopo un ingaggio con il killer, mantenga la lucidità didattica precedente, magari perchè è un po' "alterato")

Esprimo il mio punto di vista (da docente).

  • I killer dovrebbero tutti andare a ...
  • Il docente deve mettersi bene in testa che, anche se un killer può puntare a minare la sua professionalità o la validità dell'argomento che tratta, sta fornendo un servizio ad un *insieme* di partecipanti, ed è a loro che deve rivolgere la propria attenzione.

In due parole, ecco il mio consiglio (nonchè note-to-self, nda):

  • buttare via l'orgolio
  • resistere alla tentazione di "kill the killer"
  • fare ciò per cui si è pagati e che (magari) si ama fare al di là del compenso
  • diffondere la conoscenza a chi è lì per imparare
  • un'endovena di valium concentrato può essere di aiuto allo scopo :-P

Eppoi, però, consentitemi ...

... Why do you waste my time ?

VB.NET e C# - Risposta ad un vecchio quiz e rilancio

Un paio di giorni fa Adrian Florea ha scritto un post (peraltro davvero interessante) che rimanda ad un quiz che avevo scritto parecchi mesi fa.

La cosa curiosa è che ho letto il post di Adrian e non mi ricordavo più il mio :-(

E quella ancora più curiosa (sostituite pure curiosa con "preoccupante") è che andando a rileggere il mio quiz non mi ricordavo la soluzione :-(((

Che poi mi è venuta in mente e scrivo ora, in *lievissimo* ritardo. Però è abbastanza interessante lo stesso.

Recall

Riassumendo la questione e riformulandola un minimo, il succo è:

La keyword C# foreach e la keyword VB.NET For Each fanno proprio la stessa identica cosa ?

In entrambi i casi si tratta di abbreviazioni sintattiche che consentono l'iterazione su oggetti IEnumerable, il tutto contornato da un bel try...finally con tanto di Dispose dell'oggetto IEnumerator utilizzato durante il ciclo.

Il che porta a dimenticare un piccolo (ma evidentemente non trascurabile) particolare.

Pensate alla sintassi (VB.NET):

For Each item As String In list
    System.Console.WriteLine(item)
Next

o all'analogo in C#:

foreach (string item in list)
{
    System.Console.WriteLine(item);
}

Il particolare è la conversione di tipo.

Soluzione

Dato list come oggetto di tipo IEnumerable, il costrutto foreach si traduce (anche) nell'invocazione di get_Current su tale istanza (accessor della property Current).

get_Current ritorna Object. E le istruzioni di cui sopra segnalano implicitamente al compilatore la necessità di conversione da Object a System.String.

Qui i due compilatori divergono. E si fa presto a vederlo (non posto tutto il codice ma solo le parti interessate).

Questo il codice IL generato da csc.exe (csc.exe /out:Quiz.exe /r:Componente.dll):

IL_0011: ldloc.2
IL_0012: callvirt instance object [mscorlib]System.Collections.IEnumerator::get_Current()
IL_0017: castclass [mscorlib]System.String
IL_001c: stloc.1

Questo invece il codice IL generato da vbc.exe (vbc /out:Quiz.exe /r:Componente.dll)

IL_000f: ldloc.2
IL_0010: callvirt instance object [mscorlib]System.Collections.IEnumerator::get_Current()
IL_0015: call string [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions::ToString(object)
IL_001a: stloc.1

Dopo l'invocazione di get_Current, il compilatore C# emette l'istruzione IL castclass (che effettua un cast, generando una InvalidCastException in caso di errore).

Al contrario, il compilatore VB.NET si affida alla classe Microsoft.VisualBasic.CompilerServices.Conversions.

Un po' di ILDASM ?

Ecco la parte interessante di Conversions::ToString(object):

// Se mi passano null, torno null.

IL_0000: ldarg.0
IL_0001: brtrue.s IL_0005
IL_0003: ldnull
IL_0004: ret

// Se mi passano una stringa, torno quella stringa.

IL_0005: ldarg.0
IL_0006: isinst [mscorlib]System.String
IL_000b: stloc.3
IL_000c: ldloc.3
IL_000d: brfalse.s IL_0011
IL_000f: ldloc.3
IL_0010: ret

// Se mi passano un IConvertible, lo converto :-)

IL_0011: ldarg.0
IL_0012: isinst [mscorlib]System.IConvertible
IL_0017: stloc.1
IL_0018: ldloc.1
IL_0019: brfalse IL_0132
IL_001e: ldloc.1
IL_001f: callvirt instance valuetype [mscorlib]System.TypeCode [mscorlib]System.IConvertible::GetTypeCode()

... [CUT: mega switch su typecode. Qui sotto un esempio con parametro Int32] ...

IL_00b3: ldloc.1
IL_00b4: ldnull
IL_00b5: callvirt instance int32 [mscorlib]System.IConvertible::ToInt32(class [mscorlib]System.IFormatProvider)
IL_00ba: call string Microsoft.VisualBasic.CompilerServices.Conversions::ToString(int32)
IL_00bf: ret

... [e se non va bene ?]

// Ci ho provato, più di tanto ... throw InvalidCastException :-(

IL_016d: newobj instance void [mscorlib]System.InvalidCastException::.ctor(string)
IL_0172: throw

Quindi, ufficialmente, la risposta al QUIZ è:

Il metodo GetList deve ritornare un' ArrayList contenente almeno un oggetto non string e di tipo IConvertible.

Perchè:

  1. Se l'oggetto è null, in entrambi i casi (C# e VB) viene richiamato Console.WriteLine(null)
  2. Se l'oggetto è String, in entrambi i casi viene richiamato Console.WriteLine(String)
  3. Se l'oggetto non è nè null, nè String, nè IConvertible, in entrambi i casi viene generata un'eccezione di tipo InvalidCastException (anche se in punti diversi !!!)

In altre parole, questo è uno snippet di codice che risponde al quiz in questione (scritto in C# ma qui è indifferente)

//
// csc.exe /out:Componente.dll /t:library
//
using System;
using System.Collections;

public class Libreria
{
  public static ArrayList GetList()
  {
    ArrayList al = new ArrayList();
    al.Add("Ciao");
    al.Add(42);
    return al;
  }
}

Considerazioni

Personalmente trovo l'operato del compilatore C# più intuitivo.

In realtà penso la stessa cosa più o meno nel 90% dei casi in cui vengono invocate le funzionalità esposte da Microsoft.VisualBasic.dll :-)

E' altrettanto vero che non ho un background VB, quindi non sono abituato ai comportamenti del linguaggio VB a proposito di conversioni di tipo e via dicendo.

Sapete quante volte ho preso delle facciate contro ******* perchè credevo che facesse un semplicissimo cast ?

Ah ... ci ho messo le stelline perchè il rilancio di cui nel titolo è il seguente:

Contro quale keyword ho tirato mille imprecazioni dopo aver capito cosa faceva internamente ? E quale keyword uso invece di solito ?

Oppure, seriamente:

Quale keyword VB.NET genera codice di conversione analogo a quello visto durante questo lungo post ? E quale invece genera codice analogo a quello che genera il compilatore C# ?

Posted: lug 10 2007, 10.24 by devlizard | with no comments
Filed under: ,
Se il compilatore è umorale ...

Leggevo stamattina questo post di Jim Griesmer.

Che mi ha colpito parecchio nella sua conclusione, al di là del contesto che ha scatenato il problema.

Surely if I build a component twice, consecutively, with no changes to source in-between, I certainly will end up with two identical copies of that component, right?

Senza barare e andare a leggere il resto del post, onestamente avrei detto di sì.

Cioè, a parità di *ogni* aspetto "ambientale" (stesse identiche impostazioni di compilazione, ottimizzazioni comprese, stesso identico codice sorgente, ecc...), mi sarei aspettato che per definizione l'output generato da *ogni* compilatore/linker/meccanismo_di_build fosse esattamente identico.

Detta in altri termini ancora, mi sarei aspettato che il comportamento di ogni "builder" fosse assolutamente deterministico.

Sembra di no :-O

In practice, you are not likely to see a difference in compiler/linker output from build to build.  So in theory, it is possible to make use of mismatched symbols.  However, compiler/linker determinism is not guaranteed, our debugger cannot depend on it.

Sto girando un po' per il web alla caccia di info a riguardo ... alla fine sono un po' curioso di sapere quali sono i parametri maggiormente candidati a causare modifiche all'output. E quali ambienti invece garantiscono quel determinismo che, sulla carta, non avrei mai messo in discussione :-(

Posted: lug 07 2007, 02.23 by devlizard | with no comments
Filed under:
Brindisi Virtuale ad un nuovo MVP

Che bello, mi sveglio e nella inbox invece della solita promozione di miracolosi farmaci che ti trovo ?

La mail di Nino, che a quanto sembra è diventato MVP !

Cin Cin (virtualmente si può fare anche se sono astemio :-)) a una persona che se lo merita senza dubbio alcuno !

Ma soprattutto Cin Cin ad un amico Matematicamente, Vergognosamente Pazzo :-)))

Posted: lug 02 2007, 07.02 by devlizard | with 2 comment(s)
Filed under: