Claudio Brotto

February 2005 - Posts

Virtual PC Tips

Ne trovate un sacco a questo link.

E un altro po' di buoni consigli qui.

Buona Lettura.

powered by IMHO 1.2

LinguaggioMania

Complice il solito malanno del venerdì sera (ci deve essere qualche legge dietro al fatto che ci si ammala sempre di venerdì - o all'inizio delle ferie), ieri mi sono freneticamente attaccato a Internet, seguendo un po' di link dalla home page di Wikipedia, con il proposito di imparare 100 linguaggi di programmazione in una sera.

Alla fine è stato tutto un clic di qua, segui quel link di là, e mi sono un po' perso nel mare della rete.

Ho letto diverse informazioni "storiche" che non conoscevo.

Per esempio, che il primo linguaggio di alto livello ad essere utilizzato al di là della didattica è stato il FORTRAN.

Tra l'altro, non so se è solo una caratteristica (un po' vetusta, per la verità) della facoltà di fisica di Genova, ma, almeno sino ad un paio di anni fa, il FORTRAN-77 veniva insegnato ed utilizzato nei corsi di base di Laboratorio.

Per far conti, che è poi quello che è richiesto per i programmi di laboratorio, è una buona scelta (FORTRAN sta per FORmula TRANslator, dicono che in campo matematico giochi in casa). Forse però ce la si cava anche col C, che dal punto di vista occupazione è sicuramente più ... curricolativo.

Il LISP e i suoi fratellini sono arrivati comunque di lì a poco, principalmente focalizzati all'utilizzo accademico.

Non avendo studiato la teoria dei linguaggi di programmazione (mio grande rammarico, dopo le letture di ieri), ed avendo quindi un tipo di formazione molto più pratico che filosofico-concettuale, non nego che è difficile slegarsi dalle abitudini.

Quando mancano le basi concettuali, si fa presto a credere che la caratteristica di UN linguaggio sia una caratteristica di TUTTI i linguaggi.

Non sto parlando di parentesi graffe o punti e virgola alla fine della riga, ma di approcci differenti, a livello molto più astratto, alla definizione dei problemi. Per esempio, ho trovato interessante questa dissertazione sulla differenza fra linguaggi funzionali (esempio: il LISP, appunto) e imperativi (esempio: il C).

Per me la differenza non esisteva fondamentalmente perchè conosco, più o meno in profondità, BASIC, C, VB, C#, due cosine due di Java e un vago ricordo di Pascal dalle superiori. E tutti ricadono nella seconda categoria.

Un'altra cosa che mi ha colpito è l'espressività e l'eleganza di alcuni linguaggi, almeno come la può percepire uno che "guarda" un listato senza conoscere nulla del linguaggio nel quale è scritto.

Due esempi su tutti: Eiffel e Haskell. Spero di avere tempo per approfondire entrambi.

Il mondo dei linguaggi di programmazione ha un certo fascino e una certa attrattiva, per me. Anche perchè dal confronto credo derivi una comprensione migliore dei concetti.

Quando senti parlare Anders Heijlsberg o Jim Miller (non mi ricordo, credo fosse qualche .NET Show o giù di lì) e senti dire che, al momento di definire C# e .NET in generale, hanno considerato le caratteristiche migliori di SmallTalk piuttosto che di Scheme, Simula, Pascal e Java, ti rendi conto che c'è un mondo dietro.

Ci vorrebbe solo quell'anno o due di ferie pagate per farci un giro dentro !

powered by IMHO 1.2

Posted: Feb 26 2005, 01:03 PM by devlizard
Filed under:
Logo

Storiella di Gioventù.

Fine '80 - inizio '90.

Mia madre era (ora è in pensione) insegnante di matematica alle Magistrali.

Si iniziava a parlare dell'insegnamento dell'informatica ai primi livelli scolastici (elementari, per intenderci).

Immediata conseguenza fu che i futuri maestri, nonchè allora studenti degli istituti magistrali, nonchè quindi allievi di mia madre avrebbero dovuto imparare ad ... insegnare l'informatica ai bambini.

E ancor prima, gli insegnanti dei futuri maestri avrebbero dovuto imparare ad ... insegnare l'informatica ai futuri maestri.

Mi ricordo che mia madre seguì diversi corsi di aggiornamento, e che in casa arrivò un curioso programma chiamato Logo.

Siamo all'epoca del DOS (forse le prime versioni di Windows, che non erano comunque molto diffuse). Io avrò avuto una decina di anni circa.

Il Logo veniva eseguito e presentava un'interfaccia grafica (epoca del DOS, lo rammento  ) con una grande lavagna che occupava la parte alta dello schermo ed un rettangolo, in basso, nel quale era possibile digitare le cose da fare.

I comandi muovevano una tartaruga, che inizialmente era posta al centro della lavagna.

Muovendosi, la tartaruga lasciava sulla lavagna il segno del suo passaggio: in pratica si disegnava sullo schermo dicendo alla tartaruga di muoversi avanti di 10, poi di ruotare di 90 gradi, poi di muoversi avanti di 20, e così via.

Lo sto descrivendo con i miei occhi di allora: forse oggi ci vedrei cose diverse, ma l'impressione originale era quella. Una tartaruga che disegnava sul video.

Ora, dopo una quindicina di anni, ho visto che il LOGO è stato incluso nella carrellata di linguaggi di cui ho parlato qui.

Ovviamente ho seguito un po' di link, e ho scoperto che il LOGO è un linguaggio interpretato, parente del LISP, che espone molte più caratteristiche che non quelle di disegnare muovendo un triangolo sullo schermo.

Tra l'altro, è addirittura stato scritto un interprete LOGO in C# ...

Sarà ...

Ma quel triangolo in mezzo allo schermo per me rimane sempre una tartaruga.

powered by IMHO 1.2

Posted: Feb 25 2005, 05:19 PM by devlizard
Filed under:
main() { printf("hello, world"); }

Un link interessante su Wikipedia.

Il programma più famoso del mondo, scritto in una miriade di linguaggi differenti.

Si passa da diversi linguaggi assembly alle shell, e in mezzo ci sta anche una semplice e concisa versione con le API di Windows

Fonte: Questo post di Rick Byers.

powered by IMHO 1.2

Posted: Feb 25 2005, 04:11 PM by devlizard | with 3 comment(s)
Filed under:
Round-Tripping: didattica, utilità e fantasia

Il round-tripping, nell'accezione .NET del termine, è una tecnica in base alla quale viene modificato il contenuto di un modulo .NET tramite:

  • disassembling con ILDASM
  • modifica manuale del codice IL
  • re-assembling con ILASM

Esempio didattico .

Abbiamo sviluppato il nostro immancabile Hello World in C# (Console Application).

class Hello 
{
  
public static void Main(String[] args)
  {
    System.Console.WriteLine("Hello, world !");
  }
}

Compiliamo ed otteniamo hello.exe, che, incredibilmente, una volta eseguito stampa a video:

Hello, World !

Disassembliamo con ildasm, generando in output il file hello.il:

ildasm hello.exe /out=hello.il

Modifichiamo il file il, cambiando la stringa visualizzata (ovviamente le modifiche possono essere ben più radicali, ma è giusto un esempio): all'interno dell'implementazione del metodo Main, cambiamo l'istruzione:

ldstr "Hello, World !"

in

ldstr "I've been hacked !"

Salviamo il file (hello2.il), riassembliamo con ilasm:

ilasm hello2.il /output=hello2.exe

e voila, il gioco è fatto e il nostro programma stampa a video:

I've been hacked !

Vista così, questa tecnica può sembrare più una perdita di tempo (forse si faceva prima a modificare i sorgenti C# ) o un esercizio senza utilità pratica.

E per il nostro esempio è assolutamente vero.

Ma ci sono occasioni in cui il round-tripping si rivela l'unica tecnica a disposizione, o almeno la più facilmente percorribile.

Vi porto un esempio di vita vissuta.

Per un progetto che stavo seguendo alcuni mesi fa, era stato sviluppato un componente COM che doveva "fare da ponte" fra una libreria di basso livello scritta in C++/MFC e l'applicazione (.NET) principale.

Nell'idl erano state definite ed esportate alcune strutture, in modo tale che queste venissero incluse nella type library e fossero, pertanto, fruibili da codice managed senza bisogno di ridefinizione (quando le strutture dati sono molte e molto corpose evitare la ridefinizione non è una brutta idea).

I problemi sorsero quando ci fu la necessità di passare istanze di queste strutture per copia da un appdomain ad un altro.

tlbimp, infatti (che per inciso viene richiamato da VS quando si aggiunge una reference ad un componente COM), aveva correttamente inserito la definizione managed delle strutture nell'assembly di interoperabilità, ma non le aveva marcate come serializzabili (perchè avrebbe dovuto, in fin dei conti ?).

La tecnica del roundtripping, in questa situazione, si è rivelata utile ed efficace: è bastato aggiungere lo pseudo-attributo serializable ai tipi relativi.

In pratica la definizione passava da:

.class public sequential ansi sealed beforefieldinit XXXX extends [mscorlib]System.ValueType

a:

.class public serializable sequential ansi sealed beforefieldinit XXXX extends [mscorlib]System.ValueType

Ovviamente, dopo le prime, tediosissime patch a mano, abbiamo sviluppato un tool che automatizzasse questa procedura, e tutto è filato liscio (almeno da quel punto di vista).

E veniamo, finalmente, al terzo punto menzionato nel titolo di questo post: la fantasia .

Qui c'è un link ad un uso ... strano ed interessante del round-tripping.

Mike Stall, l'autore del post (e del tool di cui parla), ha utilizzato il round-tripping per iniettare codice IL in un assembly generato da C# (o VB.NET, eccetera).

Le limitazioni, come lo stesso autore evidenzia, sono diverse e rendono questo strumento molto più didattico che pratico e ... vendibile.

Però l'idea, ed i workaround per risolvere alcune situazioni, secondo me non sono niente male davvero !

powered by IMHO 1.2

Posted: Feb 22 2005, 04:16 PM by devlizard
Filed under:
.NET Developer Quiz

In questo post, Scott Hanselman propone una nutrita lista di domande per valutare lo skill di uno sviluppatore .NET.

Ci sono domande relativamente nozionistiche insieme a problemi più ... filosofici

Come ho scritto nel mio commento al post, credo che debbano avere maggior peso nella valutazione di un potenziale candidato all'assunzione risposte valide e complete a domande come "Che differenza c'è tra OOP e SOA", piuttosto che la conoscenza dei parametri di sn.exe.

Chiaro che generalmente, a meno di non avere una fortuna fuori dal comune, se sai cosa fa "gacutil -l", sai anche cos'è la GAC, a cosa serve, quando va e quando non va usata e via dicendo.

Chiaro anche che è difficile in pochi minuti (beh, per quel che so ci sono anche colloqui che durano una giornata) valutare le conoscenze di un candidato, e che quindi le domande precise e puntuali spesso siano il metodo più efficace.

Lo stesso discorso si applica alle certificazioni MS.

Lì addirittura le domande sono a risposta multipla (quasi sempre), e viene di conseguenza che lo stile è molto nozionistico.

Però, se da un lato probabilmente una persona che sa rispondere a tutte le domande di un esame di certificazione è uno sviluppatore piuttosto esperto, dall'altro non è detto che uno che non sa rispondere non sia un valido programmatore.

Alla carenza di nozioni specifiche si può sopperire con facilità (l'MSDN library in un modo o nell'altro ce l'abbiamo tutti), mentre a lacune filosofiche più profonde è difficile mettere riparo.

E' un discorso, comunque, che meriterebbe ben altro che due righe di post.

p.s.: No, non sto facendo una critica al modello degli esami di certificazione MS perchè mi hanno appena segato

... anche se temo che il prossimo (70-300) non sarà una passeggiata !

powered by IMHO 1.2

Posted: Feb 22 2005, 11:21 AM by devlizard | with 2 comment(s)
Filed under:
Mini-Pacman

Ho letto questo post di Eric Gunnerson.

Nearsighted significa miope (almeno così mi dice il Berlitz).

E in effetti, guardate un po' qui ...

powered by IMHO 1.2

Ancora su contract-first

Visto che si sono mosse le massime autorità del settore, mi sembra giusto aggiungere il mio personale parere, in qualità di ... minima autorità del settore

Parto da questa affermazione:

<quote>

Remember that WSDL/XSD/Policy is the contract, period. (Tim Ewald)

</quote>

Una frase molto lapidaria, per lo meno se viene estrapolata dal contesto, come sto facendo io ora.

Il contratto, insomma, deve essere definito in termini universali (nel senso di interoperabili, condivisibili da piattaforme differenti). Altrimenti perde la nozione stessa di contratto e diventa, appunto, una interpretazione.

Questa è la visione di chi definisce lo schema per i contratti e ne fa, di fatto, uno standard.

Niente da dire.

Poi c'è chi, in base a quello standard, si trova a dover definire un contratto. A progettare, insomma, l'interfaccia esposta da un servizio (interfaccia in senso generico, indipendentemente da ciò che questo significa a livello di linguaggio di programmazione / runtime).

In che modo ?

Scrivendo il contratto nei termini previsti dal modello per i contratti: WSDL/XSD.

In fin dei conti, quando un notaio prepara un contratto (ok, non è lo stesso concetto di contratto, ma da un certo punto di vista si tratta pur sempre di un documento che mette d'accordo due parti), segue i canoni previsti dalla legge ed utilizza il linguaggio giuridico, non certo lo slang di tutti i giorni.

Il risultato è che per mettersi d'accordo sul passaggio di proprietà di un'automobile vengono preparati un bel po' di fogli dal significato spesso oscuro.

Definire un contratto scrivendosi a mano il file wsdl è tedioso.

Non tutti ne sono capaci (per lo meno a farlo from scratch con notepad), e sicuramente la probabilità di errore non è trascurabile.

Ecco dove sta il problema, secondo me.

Occorre uno strumento che permetta di definire il contratto senza impelagarsi nei meandri di WSDL.

Un designer ben fatto, ad esempio, oppure ...

... il linguaggio che si utilizza nell'implementazione del servizio.

In questo senso, "definire il contratto in C#" non significa utilizzare C# come lingua franca e universale, ma semplicemente come strumento in grado di produrre quella stessa lingua franca e universale.

WSDL rimane lo standard per formalizzare un contratto, in pratica è la forma del contratto.

C# (o Java che sia) è solo un mezzo per esprimerla.

E' ovvio, e anche qui non ci piove, che un conto è semplificare, un conto è nascondere:

<quote>

I think that writing some code in your tool and having it generate the logical part of your contract is a bad idea if you don't know and care about exactly how it works (Tim Ewald)

</quote>

<quote>

quelli che conoscono WSDL e XML e li sanno scrivere (ma soprattutto leggere) .... in media scrivono codice migliore di quelli che ignorano il funzionamento interno di ciò che usano (Paolo Pialorsi)

</quote>

Un'ultima considerazione. Eccessivamente forzosa, però ha il suo perchè, secondo me.

Io e un mio amico ci dobbiamo scambiare un listato. Il formato di scambio è l'assembly x86.

Possiamo metterci a scrivere assembly (ammesso di esserne capaci) e scambiarci quello. Ci siamo attenuti rigorosamente allo schema.

In alternativa possiamo scrivere in C.

Un listato C non è un formato di scambio valido, non fosse altro perchè non è detto che entrambi conosciamo il C.

Però se siamo d'accordo sul compilatore da utilizzare, possiamo assumere che lo stesso codice C, compilato su macchine differenti ma con ambiente equivalente, produca lo stesso codice macchina. Se manca uno di questi requisiti, crolla tutto il castello, però ...

... se i requisiti ci sono tutti, il C può essere allora considerato un formato di scambio valido ?

powered by IMHO 1.2

Posted: Feb 18 2005, 06:54 PM by devlizard
Filed under:
Cose Nuove e Degne di Nota

Innanzitutto mi scuso per l'evidente plagio a Sam Gentile e alla sua serie di New and Notable, ma non mi veniva in mente un titolo migliore o maggiormente esplicativo.

Cose degne di nota, si diceva.

  • Beh, sicuramente un proliferare di notizie, articoli e post relativi a Indigo, dovuti al fatto che evidentemente alcune caratteristiche possono ora essere esposte al grande pubblico senza violare segreti industriali.
  • Una disputa davvero interessante sul significato e sul valore di un approccio "contract-first" nei confronti dell'architettura orientata ai servizi. Questo post di Clemens Vasters scatena una serie di commenti e risposte, spesso in antitesi con lui: Tim EwaldAaron SkonnardDon Box, Christian Weyer. Anche Paolo Pialorsi esprime la sua opinione in questo post.
  • Una serie di post di Larry Osterman sulla programmazione concorrente. Qui l'ultimo, ad ora, ma Larry promette di farne seguire altri con cadenza giornaliera.
  • L'annuncio del prossimo (quanto prossimo ?) rilascio di Internet Explorer 7: sembra che le novità siano legate a questioni di sicurezza piuttosto che a funzionalità come tabbed browsing ecc, ma sono solo supposizioni.
  • Un'altra disputa sulla "insicurezza" del CLR: James Gosling sostiene che il supporto a C++ nel CLR sia un enorme buco di sicurezza. Interessante questa risposta di Ian Griffith, che mostra come in effetti il comportamento di JVM e CLR a riguardo sia piuttosto simile.
  • Una serie di presentazioni su MSDN con linee guida per lo sviluppo di librerie in .NET.
  • L'apertura di un blog in italiano da parte di Dino Esposito.

Su alcuni di questi punti mi riservo un prossimo post, nel frattempo ... spero che non ci siano link a capocchia

powered by IMHO 1.2

Ma vaccino un corno !

Mi sto faticosamente riprendendo dall'annuale appuntamento con l'influenza.

Ora, lungi da me voler criticare i vaccini (che sono una delle maggiori "invenzioni" in campo medico e salvano migliaia di vite).

Però quest'anno il vaccino antinfluenzale era, per così dire, un po' bacato !

Sono due settimane che vivacchio, nè carne nè pesce, mentre la quasi totalità della mia famiglia è (o è stata) a letto con 39 di febbre.

Nel frattempo ho approfittato della situazione per leggere un po' di blog, anche qualche vecchio post che era rimasto parcheggiato in attesa di tempo libero.

C'è da dire che la "blogosphere" non sembra sia stata contagiata dal virus di turno, anzi, ci sono diversi argomenti decisamente interessanti di cui vorrei parlare.

Intanto, visto che tra le altre cose ho scaricato (e sto testando con questo post) l'ultima release di IMHO, ringrazio Andrea Boschin per il bel lavoro e ci metto una faccina che rappresenta il mio stato attuale, di umore e di salute:

EDIT: corretto link al blog di Andrea.

powered by IMHO 1.2

Slang informatico

Vi segnalo un post di Bruce Williams che racconta la nascita di una nuova espressione informatica.

La mia esperienza è piena di occorrenze simili, ma generalmente si tratta di storpiature dall'inglese.

La più gettonata al momento è strimmare: il server passa al client un'istanza serializzata di un qualcosa, per brevità, si dice "il server strimma al client ...".

A parte che i massimi esponenti dell'Accademia della crusca potrebbero avere qualcosa da ridire, la cosa interessante è lo spelling: in uno scambio di mail con un collega, abbiamo scritto streamare, strimare e strimmare nel giro di pochi minuti.

3 modi diversi per far rivoltare Dante nella tomba :-)

powered by IMHO

Alt-F4
Sono stato al telefono una mezz'oretta con un mio amico che mi chiedeva una "consulenza informatica".
Doveva collegare in rete due pc e non sapeva come impostare i parametri per "farli vedere l'un l'altro".
Mentre gli spiegavo come fare, ci siamo messi a chiacchierare sulla facilità di uso dei computer.
 
Il mio amico non si può dire un esperto informatico, ma utilizza il pc abbastanza di frequente, non fosse altro che per scrivere la tesi di laurea o per girovagare su internet.
Quindi ha una visuale piuttosto diversa dalla mia, che ci lavoro quotidianamente.
 
Ecco alcune domande alle quali mi sono trovato a dare risposta:
 
"Come mai per fare copia e incolla devo usare CTRL-C e CTRL-V, invece che CTRL-C e CTRL-P ?"
 
"Ma questi numeri [l'indirizzo IP, nda] possono essere qualunque o sono magici ?"
 
e, soprattutto, l'ultima domanda, che è poi quella che mi ha dato lo spunto per scrivere questo post:
 
"Ma tu come fai a sapere che con Alt-F4 chiudi ?"
 
Non so rispondere all'ultima domanda.
Forse ho visto qualcuno premere una combinazione "magica" e chiudere una finestra, gli ho chiesto come ha fatto è la cosa è rimasta nella mia memoria, fino a diventare routine.
Forse ho letto lo shortcut vicino ad una voce di menu e l'ho memorizzato.
Fatto sta che mi trovo a dire "Fai un po' Alt-F4" invece che "Chiudi la finestra", e non lo trovo neanche così strano.
 
Se parlo con una persona poco esperta di informatica, qual è l'impressione che questa può avere ?
 
Che i computer sono magari semplici all'apparenza, ma che in fondo c'è sotto qualche alchimia :-)
 
Desktop e Confusione
Scrivo dall'ufficio aspettando che il traffico si decongestioni un pochino (verso le 7 e mezza ci provo, però :-) )
 
Oggi ho effettuato un'installazione sulle macchine di un cliente stando comodamente seduto davanti al monitor sulla mia scrivania: VPN + Terminal Server, bella accoppiata davvero.
 
Però tutto ha un prezzo: sto chiudendo un po' di finestre prima di andare via, e vedo:
  • 3 connessioni Remote Desktop con altrettante macchine remote dal cliente (2 terminal server, una xp)
  • 2 connessioni Remote Desktop con altrettante macchine locali (in ufficio, e una è a 5 metri da me)
  • 7 explorer: cartelle locali, cartelle remote, eccetera.
  • Outlook
  • Visual Studio
  • Oracle DBA Studio (sigh)
  • TOAD
  • RSS Bandit (vabbè, quello era nella tray area, l'ho aperto giusto ora)
  • Avant Browser (per fortuna che è tabbed, se no ...)
Senza contare che all'interno di ciascuna sessione remota ho aperto diverse finestre (non lo so, diciamo una media di 4 per sessione).
 
Ora, se fate due conti, capite perchè ho un leggero senso di disorientamento ?
Virtual Keyboard
Con questo sì che possiamo stupire gli amici con effetti speciali ...
Beppe Grillo is online !
Grazie a questa segnalazione di Gabriele Gaggi, ho appena aggiunto un nuovo feed alla mia lista !
More Posts Next page »