Di .NET e di altre amenita'

settembre 2004 Blog Posts

1000000 di firme

Ce l'abbiamo fatta!!! Quest'oggi mi è giunta la notizia che i Compagni Radicali hanno raggiunto la ragguardevole cifra di 1 milione di firme raccolte sul referendum per l'abolizione totale della legge sulla fecondazione assistita.

Gli altri quesiti, quelli di abolizione parziale hanno raggiunto le 750000 firme, più che sufficienti per garantire che il tetto del mezzo milione sia superato.

Ora la battaglia si fa più dura. E' stato conquistato il diritto per tutti gli italiani di andare alle urne e decidere se questo è il modo corretto di affrontare il problema della fecondazione assistita oppure se il parlamento dovrà mettersi nuovamente al lavoro per garantirci una legge che lasci nell'armadio il moralismo cattolico e ci regali il rispetto dei diritti civili.

Già, perchè in ultima analisi si tratterà di questo. A prescindere dall'argomento del referendum (indubbiamente importantissimo) si dovrà soprattutto scegliere se il nostro stato di diritto debba fondarsi sui principi del laicismo oppure se possa essere influenzato pesantemente dal clero e dalla chiesa e comportarsi da stato confessionale.

La battaglia è ancora lunga, perchè bisognerà proteggere il referendum, e con esso il diritto di decidere degli Italiani (qualunque decisione essi vogliano prendere) innanzitutto dalla corte costituzionale, che già più volte in passato ha dimostrato di difendere gli interessi del palazzo invece della costituzione, e dal parlamento che già oggi si sta muovendo per cercare di apportare irrisorie modifiche alla legge al solo scopo di fare saltare il referendum.(La costituzione dice che se la legge cambia il referendum non si fa più)

Il referendum sarà scomodo, e si potrà arrivare anche a veder sciogliere le camere anticipatamente pur di evitare che, sull'onda di una possibile vittoria del sì, si possa costituire una forza politica riformatrice in grado di vincere le elezioni politiche e finalmente di rinnovare il nostro sfortunato paese.

Ma adesso è il momento della gioia. Grazie allo sforzo immane di un manipolo di persone, sono state raccolte quasi 5000000 di firme in totale. Grazie a loro si potrà modellare il nostro paese così come meglio crediamo che debba essere.

Noi.

Bart Preinstalled Environment

Dopo knoppix, adesso anche Windows gira su un CD...

http://www.nu2.nu/pebuilder/

UPDATE: già da un po' mi dicono... :-D

Rabbia!

Stamattina e non si sa da quanto, pare che il workspace di IMHO 1.0 non sia accessibile...

Dannatissimo GDN. Ora vado a fare visita a SourceForge. Vediamo se ne nasce un feeling...

Ruolo??? Rifiutato!

Mi sono appena registrato all'evento cui parteciperà Bill Gates a Novembre e ho notato che nel mio profilo appare la seguente dicitura:

Posizione: Software Engineer
Ruolo: Rifiutato
Reparto: Tecnologia/Sistemi informativi

Devo preoccuparmi?

Siamo tutti Radicali?

Da quando ho scritto il post "Una firma per la libertà", sento sempre più spesso gente che mi ferma e mi dice: "Speriamo bene per le firme" oppure "Ah, i Radicali hanno ragione!", o anche "Io li ho firmati, dai che ce la facciamo". Il tenore delle richieste, è immancabilmente questo e mi sento autorizzato a chiedermi: Ma siamo tutti Radicali?

In realtà questa mia domanda, che trova una giustificazione anche nelle migliaia di cittadini che hanno letteralmente preso d'assalto i tavoli dei compagni Radicali, mi frulla in testa da molto più tempo. Se vado ad analizzare la partecipazione della gente alle idee Radicali, mi rendo conto che con tutta probabilità l'Italia è Radicale e non se ne rende conto.

Divorzio e Aborto, ma anche Nucleare, Legge elettorale maggioritaria, e decine di altri argomenti hanno trovato nella Gente un supporto infinitamente superiore a quello che ci si poteva ragionevolmente aspettare dal 2% medio di preferenze che questa forza politica ha sempre trovato. Il fatto è che normalmente quando si parla dei Radicali si sente esprimerae un luogo comune: "Non ci sono più i Radicali di una volta". E' questo il messaggio che passa, autorizzando a credere che siano i Radicali ad essere cambiati piuttosto che gli ad essere dei banali trecartari. In effetti pare difficile credere, in un panorama politico desolante come quello italiano, che esita qualcuno che riesce a mantenere fissa la barra del timone e non si abbandoni a facili trasformismi in nome della poltrona che occupa e che non vuole lasciare.

Ma un'analisi attenta delle posizioni Radicali, che sono note a tutti, legalizzazione delle droghe, libertà di ricerca, stati uniti d'Europa, eutanasia, laicità dello stato, rivela che questo pragmatico modo di affrontare i problemi è tale e immutabile da sempre, fin dalla nascita del partito.

Perciò la domanda legittima è: Perchè gli altri sono cambiati?

Team distribuiti per applicazioni concentrate

Mi fuma il messenger. Non sopporto questa condizione di sviluppo, con le risorse distribuite su tutto il territorio nazionale per una applicazione che non ha nulla di distribuibile...

Da stamattina sono in una continua sessione di messenger per risolvere problemi che si snodano tra le migliaia di kilometri che separano il mio team?

Forza... qualcuno inventi il teletrasporto e gli sarò eternamente grato!

Query Notifications in ADO.NET 2.0

Uscito un interessante articolo su MSDN che parla di Query Notification

http://msdn.microsoft.com/data/default.aspx?pull=/library/en-us/dnvs05/html/querynotification.asp

Ci sono anche degli esempi di codice T-SQL e in C# sull'uso del SqlDependency.

IMHO 1.0 build 1732

Ho appena rilasciato la build 1732 di IMHO. E' stato fissato il bug che impediva la configurazione dei parametri di accesso al weblog e quindi in ultima analisi l'uso del software.

Inoltre ho aggiunto il supporto full per le categorie. Ora è possibile inviare post già associati alle giuste categorie, che vengono sincronizzate ad ogni upload.

http://workspaces.gotdotnet.com/imho

IMHO Future

Qualcuno si potrebbe chiedere quali sono le feature previste per IMHO. Ecco quindi il piano delle feature raggruppate per release:

ENTRO BETA1

- supporto totale alle categorie
- localizzazione in inglese
- implementazione di un Pattern Adapter per consentire l'integrazione con altri engine di blog
- gestione di tag HTML personalizzati in source control

ENTRO RELEASE 1.0

- emoticone
- shortcut messages
- keyword substitution
- totale integrazione dell'editor con quello di .TEXT
- uso di DPAPI per la per la protezione delle password

RELEASE 1.1

- supporto ai blog multipli
- mirroring del blog

FUTURE

- internet explorer shell extension
- webservice che estenda le capacità di .TEXT per consentire la gestione totalmente offline
- integrazione della gestione delle immagini

Come impostare .TEXT per funzionare con IMHO 1.0

Il client IMHO che ho rilasciato stanotte richiede che venga attivato il supporto ai WebServices di .TEXT.

Perciò dovete andare in amministrazione di .TEXT, entrare nelle configurazioni, scegliere Options > Configure e attivare il checkbox "Allow Web Service Access".

L'url da immettere nelle impostazioni per collegare IMHO al servizio varia in base a chi fornisce il blog engine. Per UgiDotNet dovete immettere il seguente:

http://blogs.ugidotnet.org/[il tuo blog]/services/simpleblogservice.asmx

 

IMHO 1.0 - Update

Bene, sono lieto di comunicarvi che ho appena fatto una figura da pivello. Questa notte, subito prima di fare l'upload della release ho rimosso il record con le impostazioni di IMHO relative il mio account .TEXT che ho usato per i test. Peccato che il software l'abbia presa a male... perciò il download presente attualmente NON FUNZIONA.

Se volete provarlo lo stesso, dovete inserire un record nella tabella Settings che si trova nel file local.mdb nella cartella che contiene l'eseguibile.

insert into Settings ( Username, ServiceUrl ) values ( '', '' )

Ovviamente stanotte faccio la patch. Perdonatemi... ma l'ora tarda non aiuta in questi casi.

IMHO 1.0 Instant Blogger Technology Preview

Alla fine ce l'ho fatta!!! Dopo un bel po' di tempo che ci lavoro, togliendo prezioso tempo ad altre attività serali, come studio e riposo, finalmente ho pubblicato un progetto che credo possa interessare tutti i "malati di blog" che ci sono in questa comunità e spero su tutta la rete.

Si tratta di un tool che permette di postare offline sul vostro blog e di pubblicare tutti i post in un solo momento quando più lo ritente opportuno. Il progetto è scaricabile in form di Technology Preview da questo workspace di GotDotNet

http://workspaces.gotdotnet.com/imho
(update: il progetto è stato spostato su sourceforge: http://sourceforge.net/projects/imho10)

Attualmente il progetto è annastanza stabile, ma non vi garantisco nulla, perchè i test che ho fatto non sono dei più approfonditi. Conto al più presto, di mettere in linea una beta1 completa di tutte le feature previste, e anche di codice sorgente, che attualmente preferisco non divulgare data la forte attività di svluppo e debugging che mi aspetta.

Ecco l'elenco delle feature:

1) Post asincrono
2) Edit WYSIWYG
3) Edit sorgente con shortcut per l'immissione dei tag più comuni
4) Anteprima integrata
5) Whidbey Look&Feel (grazie a
Tim Dawson per le sue librerie di controlli WinForms free)
6) Dockable environment
7) Tray Bar Icon con menù di contesto
8) Gestione completa dei post non pubblicati (creazione, aggiornamento e cancellazione)

Attendo con ansia le vostre segnalazioni e consigli

GBrowser

Qualcuno ha voluto verificare cosa ci fosse di vero nelle voci di un browser di Google. Ecco cosa si ottiene se fate una query whois per gbrowser.com, ma lo stesso è anche per .net e .org

WHOIS information for gbrowser.com:

Registrant:
Google Inc. (DOM-1278108)
1600 Amphitheatre Parkway
Mountain View CA 94043
US

..omissis...

Created on..............: 2004-Apr-26.
Expires on..............: 2006-Apr-26.
Record last updated on..: 2004-Apr-26 16:46:39.

Domain servers in listed order:

NS1.ALLDOMAINS.COM 64.124.14.32
NS2.ALLDOMAINS.COM 209.25.143.102

Il bello è che i domini sono registrati dal 26 Aprile scorso...

.NET Book Club

Per tutti quelli che non sanno come scegliere un libro su .NET ecco un sito espressamente dedicato all'editoria sul framework

http://www.dotnetbookclub.org/

Human Interactive Proof

Ottimo articolo con codice sull'argomento.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/hip_aspnet.asp

da leggere, spero di trovarne il tempo!

Compilatore distratto?

Provate anche voi:

public int Property
{
   get { return Property;  }
   set { Property = value; }
}

Come ovvio il runtime va in loop, ma la domanda è: perchè il compilatore non ci da almeno un Warning?

fonte: http://blogs.msdn.com/sebby1234/archive/2004/09/23/233608.aspx

Eric Gunnerson su Java/c# Generics

In questo post Eric Gunnerson parla del'implentazione "Type Erasure" dei generics in Java.

http://blogs.msdn.com/ericgu/archive/2004/09/23/233438.aspx

Importante notare che Gunnerson dice in termini più approfonditi più o meno la stessa cosa che io avevo rilevato qui e qui

"This means that Java generics doesn't give you the performance benefit that .NET generics do - not only do you not have the ability to create generics on value types (not that surprising given that Java has previously not had boxing), but you still have typecasts in your"

4 account GMAIL per voi.

Chi li vuole?

Vi ricordo le regole:

1) postate un commento senza mail

2) andate su Contacts e mandatemi l'indirizzo email.

3) Fa fede il commento per aggiudicarsi l'account.

Ore: 13:01 - ASTA CHIUSA, ACCOUNT FINITI!

Dannato barone rosso...

Visto che oggi è giorno di fumetti, vi ricordo il mio preferito...

"Non mi avrai mai, dannato barone rosso..."

sarà che mi identifico molto?

Open in same window

Ora che ho installato la SP2 di XP, ironicamente mi rendo conto molto di più della quantità spropositata di siti che aprono i link in popup, dato che sono obbligato a premere CTRL per autorizzarle. La cosa sta cominciando ad urtarmi il sistema nervoso.

Sarebbe opportuno che nella prossima versione i browsers abbiano una voce nel menu di contesto "Open in same window", a fianco della "Open in other window" già presente. Ora vado a postarla sul blog di IE.

Trovare l'ApplicationPool dal PID

Può capitare di aver bisogno di capire a quale dei processi w3wp.exe che vediamo nel task manager è associata un ApplicationPool. A partire da IIS 6.0 è possibile organizzare le WebApp in ApplicationPool ottenendone la suddivisione in diversi processi.

In questo post si descrive come utilizzare l'utility iisapp.vbs da riga di comando per queto scopo

http://weblogs.asp.net/owscott/archive/2004/09/21/232628.aspx

ASP.NET 2.0 - Rinominati i folder

Questo post informa che i folder "di sistema" di ASP.NET 2.0 cambieranno nome acquistando un prefisso "Application_"

http://www.asp.net/Forums/ShowPost.aspx?tabindex=1&PostID=691250

Perciò Code diventa Application_Code, etc.... Tutto ciò per evitare che si possano avere omonimi nei folder creati dall'utente.

Io preferivo i nomi corti, non mi è mai venuto in mente di chiamare "bin" un mio folder...

Bocciato Resharper

Ho appena disinstallato Resharper. Purtroppo l'ennesimo tentativo di usarlo è fallito, perchè ancora una volta si è rivelato uno strumento che appesantisce enormemente l'ambiente di sviluppo. Tenete presente che il mio PC è un Pentium III 1.1 GHz con 512 MB RAM perciò dovrebbe essere piuttosto veloce.

E' un peccato perchè le funzionalità di refactoring che da Resharper sono molto interessanti ed in parte anticipano quelle che troveremo in Visual Studio 2005. Ma un'IDE lenta è peggio che un'IDE povera (se Visual Studio 2003 si può considerare povero).

Non resta che attendere...

Referendum - Ultimo giorno

Visto che come leggo dal post di Lorenzo c'è ancora qualcuno che si attarda, vi informo che oggi è l'ultimo giorno disponibile per firmare il referendum per abolire la legge sulla fecondazione assistita. Da domani i militanti radicali saranno impegnati a verificare e certificare le decine di migliaia di firme e solo in poche grandi città sarà possibile ancora apporre la firma.

Forza, correte tutti!!!

Che prezzi!!!

Questa mattina, ho visitato il sito http://www.mvpestore.com, presso il quale avevo intenzione di comprare una polo, per premiarmi dell'esame che ho recentemente passato. Ho sfogliato, e alla fine ho trovato quella che preferivo. 19.99$ Un prezzo adeguato per una polo, perciò passo alla cassa e arrivo alla fine del checkout dove un riepilogo delle spese di spedizione mi informa che il costo che mi dovrebbe essere adebitato è pari a 45$ (~80000 Lire)!!!

80000 lire per una polo mi sembra un po' eccessivo, e la certezza di pagare più di spese di spedizione che di beni acquistati mi sembra folle. Perciò ho chiuso il browser e detto addio alla maglietta. Ed ora vi chiedo... ma non c'è qualche altro posto dove acquistarle che costi un po' meno (ad esempio in italia).

ASP.NET e Struts

E' uscito un articolo su MSDN che compara l'architettura di Struts con quella di ASP.NET. Non l'ho ancora letto, ma mi pare fatto bene. Interessante anche il paragrafo dedicato alla migrazione di sistemi struts-based verso ASP.NET

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ASPNet-ASPNet-J2EE-Struts.asp

Sul conformismo

Spesso, troppo spesso, mi trovo nella condizione di ragionare su cosa spinge la gente al conformismo.

Innanzitutto, per provare a rispondere bisogna definire il conformismo. Mi riferisco a quelle persone, la stragrande maggioranza, che hanno l'innata tendenza a rifiutare quello che non conoscono, e nel farlo creano un ghetto nel quale vanno a finire cose che invece meriterebbero di essere prese in considerazione. Succede che costoro si diano anche delle giustificazioni plausibili, oppure che considerino plausibili delle giustificazioni che non hanno alcun fondamento.

Faccio un esempio. La stragrande maggioranza delle vetture in circolazione è grigia. Dal grigio perlato al canna di fucile, ma invariabilmente grigia. E se chiedete ad un possessore di macchina grigia perchè l'ha scelta di quel colore, allargando le braccia e guardando verso l'alto vi dirà: "Perchè ha più mercato". Questa è la risposta più frequente, ma ci sono anche quelli che, avvertendo il nonsenso di tale posizione, si giustificano dicendo: "Così non si sporca mai", dimenticando che invece la macchina si sporca esattamente come le altre con l'unica differenza che su di essa lo sporco si mimetizza.

La cosa preoccupante di tutto ciò è che è molto raro che la risposta abbia a che fare con il gusto personale. Ditemi "Perchè mi piace" e mi farete contento, ma trovare una giustificazione nella commerciabilità della vettura o nella "comodità" del non vedere lo sporco, mi pare negare la propria personalità per conformarsi ad un comune sentire che fa stare bene fuori ma male dentro.

Ma tornando sulle due posizioni, a proposito del grigio, e tralasciando la fazione meramente utilitarista, vorrei concentrarmi un attimo sull'altra, perchè apre la strada a un paradosso. Certamente la vettura vende di più perchè è più facile trovare qualcuno che ritenendola più vendibile la compri, ma allora bisogna accettare il fatto che la vettura che piace di meno è anche quella che vende di più, perchè è sempre acquistata nella speranza che piaccia a qualcun altro. Ritengo questa l'apoteosi del conformismo. Ci sarà mai stato qualcuno a cui questo colore sia piaciuto? E soprattutto, come è riuscito costui ad imporci l'uso di vetture grigie? Un tale totalitarista andrebbe processato per direttissima. Nemmeno Fidel Castro è mai riuscito ad ottenere un consenso così elevato, su una posizione talmente impopolare.

Purtroppo, il conformismo pervade oggi la nostra società, non solo nelle vetture, ma in qualsiasi cosa ci circondi. Il telefonino triband anche se odiamo gli USA e non ci andremo mai, il villaggio turistico anche se andiamo in ferie per uscire dalla routine, la scarpa o meglio ancora lo stivaletto con la punta acuminata giusto perchè il dolore ai piedi alla sera non basta mai. La peggiore specie però, lasciatemelo dire, è quella di coloro che aderiscono ad un conformismo atteggiandosi ad anticonformisti. Il conformismo degli anticonformisti fa fare cose indicibili. Ad esempio quelli che dicono: "non bisogna dividere il paese". Una affermazione di questo genere ha la caratteristica di conferire un'aura da "salvatore della patria" a chi la pronuncia, e perciò ha un che di anticonformista. Ma se ci pensate bene, per quale motivo non bisognerebbe dividerlo? Non è l'anima stessa della democrazia la possibilità di avere posizioni diverse e di battersi per difenderle? Dire così è ne più ne meno che un conformismo, applicato per far credere di non esserlo. E con l'aggravante di non pensare al reale significato di quello che si dice.

Occorre ora spendere due parole sulle vittime del conformismo. Già, perchè, come ogni piaga dell'umanità, anche questa ha le sue vittime. Mi spiego: sapete di che colore è la mia auto? Grigia. Avevate qualche dubbio a questo proposito? E la mia spiegazione, purtroppo non ricade in nessuna delle tre proposte poco fa. Non è una questione di mercato, perchè il modello di vettura che ho scelto di per se ha già poco mercato. Non è nemmeno una questione di mimetismo, ne tantomeno di gusto. La mia macchina è grigia per colpa del conformismo degli altri, che ha fatto in modo che, quando ho scelto il modello che mi piaceva, mi sia trovato di fronte a quattro possibilità: blu "sono molto elegante ma non parcheggiarmi al sole", rosso "velluto da bara", verde "culo di bottiglia" e grigio. Voi cosa avreste scelto? Ecco cosa intendo per vittime, a me sarebbe anche piaciuta di un bel rosso vivace, o magari bianca, ma dato che la maggior parte della gente vuole il colore che piace agli altri, l'ho dovuto comprare anch'io.

Veniamo, per concludere, al perchè. Mi sono fatto un'idea, che ritengo non troppo distante dalla realtà. Il conformismo ha due proprietà: E' a basso consumo e da sicurezza. Sulla sicurezza non ho dubbi. Quando mi devo rapportare con il prossimo, essere conformista garantisce di aver maggiori possibilità di incontrare la simpatia dell'altro. Per questo due conformisti che si incontrano tenderanno ironicamente ad esaltare qualcosa in cui non credono realmente. Ma la nota dolente è in quello che ho definito basso consumo. Essere conformisti permette di pensare poco, perchè da un lato, ha già pensato a tutto qualcun altro, e dall'altro non serve nemmeno impegnarsi più di tanto a difendere le proprie convinzioni, perchè sono universalmente accettate.

Internet Information Server 7.0

In questo post si parla delle feature di IIS7.0 e si da anche una possibile previsione per l'uscita.

http://www.pluralsight.com/blogs/fritz/archive/2004/09/14/2262.aspx

Skin per .TEXT

Ho scoperto che esiste una splendida skin per .TEXT disponibile al seguente indirizzo

http://mixtaper.com/blogs/gosatango/articles/221.aspx

Andrea, se trovi 5 minuti, riesci ad installarla?

Oracle 9i e 10g incompatibile con .NET

Nel link sottostante viene descritto un comportamento che abbiamo riscontrato anche qui in azienda.

Pare che un processo di Oracle, tale nmupm.exe occupi il 100% delle risorse del computer quando nello stesso è installato anche il Framework .NET

http://forums.oracle.com/forums/thread.jsp?forum=46&thread=179892&message=480046#480046

Mi pare che la soluzione di disinstallare il Framework .NET, proposta nel forum non sia percorribile (non nel mio caso ad esempio). D'altra parte non mi sognerei mai di consigliare la disinstallazione di Oracle...

Qualcuno ne ha una migliore?

Un sito dedicato alle regular expressions

Da un post del weblog Microsoft ho scoperto che esiste un bellissimo sito dedicato alle RegEx

http://www.regexlib.com/

Da una semplice casellina di ricerca potete accedere a un libreria molto fornita di expression già pronte all'uso.

Da vedere.

Threading con Singleton Pattern

Mi sono spesso trovato di fronte al conflitto tra la programmazione Object Oriented e la necessità di usare le caratteristiche multithreading del sistema operativo. Alla fine si tratta di scrivere una procedura, sotto forma di metodo, e pur esistendo delle classi che lo fanno, in se la cosa non si presta bene ad essere racchiusa in un'ottica object oriented. Qui sotto vi propongo una classe che usa il pattern Singleton per incapsulare un thread e tutto ciò che serve per controllarlo.

Io l'ho realizzata per racchiudere i vari thread che lavorano all'interno di un Windows Service che ho creato, e l'ho trovata molto comoda.

using System;
using System.Threading; 

public class WorkingThread
 {
    private static WorkingThread m_Instance;
    private AutoResetEvent m_ExitEvent;
    private Thread m_Thread;
    private bool m_Running;

    private WorkingThread()
    {
        m_ExitEvent = new AutoResetEvent( false );
        m_Running = false;
    }

    public static WorkingThread Instance
    {
        get
        {
            if ( m_Instance == null )
                m_Instance = new WorkingThread();

            return m_Instance;
        }
    }

    public bool IsRunning
    {
        get { return m_Running; }
    }

    public void Start()
    {
        if ( !IsRunning )
        {
            m_ExitEvent.Reset();

            ThreadStart startInfo = new ThreadStart( Thread_Proc );
            m_Thread = new Thread( startInfo );
            m_Thread.Start();

            m_Running = true;
        }
        else
            throw new InvalidOperationException( "Thread already running" );
    }

    public void Stop()
    {
        if ( IsRunning )
        {
            m_ExitEvent.Set();
            m_Running = false;
        }
       
else
            throw new
InvalidOperationException( "Thread already stopped" );
    }

    protected void Thread_Proc()
    {
        WaitHandle [] handles = new WaitHandle [] { m_ExitEvent };

        while( WaitHandle.WaitAny( handles, 1000, false ) == WaitHandle.WaitTimeout )
        {
       
     // do something
            Thread.Sleep( 1000 );
        }
    }
}

L'uso è banale. La classe ha una proprietà Instance che rappresenta il thread che deve essere lanciato e ha i metodi Start() e Stop() per avviarlo e fermarlo.

public void Main()
{
    WorkerThread.Instance.Start();
    //
    WorkerThread.Instance.Stop();
}

Ancora una volta l'applicazione dei design pattern dimostra la sua potenza.

N.B. Approfondite i commenti a questo post, perchè c'è molto da imparare.

La discriminazione è sempre in agguato

Ultimo giorno di corso, per fortuna. Ed oggi, un simpatico evento ha allietato l'inizio della mia giornata.

Ambientazione: Interno giorno. Un'aula anonima nei sotterranei di un grande ente statale, nel quale non si dice "Buon giorno", ma "Buon Java"

Al termine di una trance di lezione c'è da fare un esercizio. E' necessario scrivere un breve pezzetto di HTML, diciamo una ventina di righe, ed io bello come il sole inizio; vado sul desktop e dritto come un fuso, apro Visual Studio .NET, creo il file e comincio a scrivere. Tempo 20 secondi netti, il file è pronto senonchè passa l'insegnante e si accorge di VS.

Nemmeno fossimo in uno spettacolo di rivista in men che non si dica mi ritrovo al centro dell'ilarità generale... Yeah, guarda questo, "Microsoft Dipendente", Visual Studio... Questi i termini nei quali sono stato apostrofato. Intanto il mio bel file è pronto e tutti gli altri arrancano a scrivere tag Html e Xml all'interno del non censurabile notepad.

Ammesso e non concesso che usare Visual Studio per venti righe di HTML sia eccessivo, mi chiedo quanta parte dell'ilarità generale sia dovuta all'invidia e quanta altra alla discriminazione.

A voi la risposta...

Firmate gente...

Purtroppo non c'è molto da ridere

C#2.0 Evoluzione della specie

Mi è stato appena confermato che sul numero di Novembre di Computer Programming (#140) uscirà un articolo a mia firma che porta lo stesso titolo di questo post. L'articolo che fa parte dello speciale linguaggi, fornisce una panoramica abbastanza approfondita delle nuove feature del compilatore C# nel Framework 2.0. Spero sia un buon punto di partenza per iniziare a prendere confidenza con il linguaggio, con il più il vantaggio di essere scritto in italiano.

Non mancherò di postare un avviso il giorno stesso in cui uscirà la rivista, giusto per rinfrescarvi la memoria.

Buona lettura. 

Click qui... click la...

Penultimo giorno di corso.

Ho appena terminato l'ennesimo inutile "esercizio", per la serie clicca questo, scrivi quello, clicca Ok et voilà tutto funziona... ma cosa è rimasto? Assolutamente nulla. Sono certo che uscito da queste quattro mura, mi ritroverò nuovamente nella necessità di studiarmi da solo tutto il prodotto, con in più un tarlo che rode: "ma se la funzionava, cosa faccio di sbagliato adesso"?

Certi "corsi" bisognerebbe vietarli per legge. E adesso chi lo spiega al mio capo, che dopo 6 giorni di questa solfa, l'unico vantaggio è l'avere la certezza che può funzionare, se sai come fare, ma... saperlo fare è un'altra cosa!!!

Allarghiamo l'asta... ancora GMail

Ho 6 inviti gmail, per i primi 6 commenti su questo blog... (il mio intendo)

Peccato... finiti tutti. Sarà per un'altra volta.

MSDN Library

Da oggi, se avete bisogno di accedere alla documentazione del framework, potete semplicemente usare questo link

http://msdn2.microsoft.com/library/<namespace>.aspx

Sostituendo <namespace> con System ad esempio si accede alla documentazione del namespace System.

Why C#?

Come promesso, in un mio precedente post, sono finalmente a spiegare i motivi per cui personalmente ho eletto C# a mio linguaggio di riferimento. Badate, questo non significa che io mi rifiuti di sviluppare in altri linguaggi, ma semplicemente che potendo scegliere, a ragion veduta abbraccio C#.

Il primo motivo è di carattere puramente affettivo. Le mie prime esperienze di programmazione seria le ho fatte in Ansi "C", e poi in C++ e C# ha il pregio di ricordarmelo. Certo, non è la stessa cosa in fatto di sintesi ma talvolta mi piace scrivere la chiamata ad un metodo, e il test del risultato sulla stessa riga come era abitudine indimenticata del buon vecchio C.

Il secondo motivo è di carattere più politico. Non sopporto l'arroganza, e tantomeno i moralisti. Perciò Java non fa per me. Già tempo fa ho avuto l'occasione di scrivere sul mio rapporto con certi programmatori Java, e trovo che sia ampiamente corretto quello che ha detto Lorenzo in risposta ad un mio post: E' troppo facile per il coniglio considerarsi vincitore quando gareggia con la tartaruga, ma pensare di poter considerare questa facile vittoria motivo di orgoglio e nobiltà è davvero troppo. Ho la pretesa di voler scrivere buon codice e ritengo di poterlo fare almeno tanto bene in C# quanto in Java. Se non di più. Inoltre considero C# anticonformista. E questo per me è addirittura una bandiera da portare. Anticonformista, nel senso che non si conforma alle morali dettate dai benpensanti. In che senso? Per quale motivo devo essere obbligato a fare try e catch di tutto quello che si muove? Questo è un conformismo. Voglio sentirmi libero di decidere io come, dove e quando trappare. Punto.

Terzo. In questi giorni ho scritto un articolo, che se tutto va bene uscirà a novembre, che mi ha dato l'occasione di approfondire alcuni dettagli implementativi dei compilatori C#2.0 e Java 1.5 (o 5.0 che dir si voglia). Il risultato di questo paragone mi ha fatto comprendere meglio perchè C# è meglio di Java, e non mi riferisco a feature del framework, ma solo esclusivamente al compilatore. Avrete già letto, quello che accadrà ai generics in ambito Java, e se ho ben chiaro cosa ha mosso i progettisti di C#, non ho altrettanto chiaro le finalità di quelli Java.

Quarto ed ultimo. Il mito della portabilità. Mi è sempre andato stretto, il dovermi confrontare con questa caratteristica che confesso mi lascia spesso interdetto. Ma più e più volte mi sono chiesto: ma vale veramente la pena costringere il mio cliente a spendere il 10-20% in più sull'hardware per poter far girare una applicazione talmente generica da poter funzionare ugualmente su Windows che su Linux o Mac? La risposta a questa domanda non la so. Ma certamente se metto assieme il risparmio in termini di risorse macchina, e la maggiore produttività del linguaggio, la bilancia per me pende di certo su C#.

Questi sono i miei perchè.

Buonanotte.

.TEXT Custom CSS Skins

Ho qualcosa da aggiungere rispetto al post di Lorenzo Barbieri sui Custom CSS Selectors. Se notate la tendina denominata "Display Skin" contiene una serie di Skin con il nome composto. Se tentate di aggiungere nuovi stili o di sovrascrivere quelli preesistenti su queste skin, non ottenete alcun risultato apprezzabile. Questo perchè .TEXT usa due css; se prendiamo la skin del mio blog marvin3-red, i css sono:

/skins/marvin3/style.css
e
/skins/marvin3/red.css

gli stili inseriti in Custom CSS Selectors vengono caricati al posto del secondo css solo quando selezionate una skin semplice (e non tutte)

Perciò, se come me vi siete innamorati di uno "stile composto", ma volete apportare delle modifiche dovete procedere così:

1) selezionate lo skin che preferite
2) scaricate lo skin secondario che trovate nell'html
3) impostate il relativo skin base
4) copiate il contenuto del file secondario nei Custom CSS Selectors

A questo punto potete apportare le modifiche che volete mantenendo come base la vostra skin prediletta...

fiuuuu...

Tigre o Micetto?

Continuando a leggere l'articolo di cui ho parlato nel mio ultimo post, ho scoperto una cosa inquietante: Il compilato generato da Java 1.5 "Tiger", sarà perfettamente eseguibile su una virtual machine precedente a questo compilatore.

Questo si traduce nel seguente ragionamento rispetto i Generics: Nessuna modifica è stata introdotta nel bytecode di Java, quindi i generics sono una mera traduzione del codice Java 1.5 in Java 1.4 oggetto della compilazione finale. Questo significa che per effettuare una traduzione vengono introdotti un'infinità di cast e dei metodi bridge per consentire le conversioni. (leggete l'articolo, è tutto nero su bianco)

Ora, se mettiamo assieme le problematiche di boxing/unboxing di cui sopra e le attività di cast a go-go, ne otteniamo che le performance di un codice che usa i generics saranno notevolmente peggiorate.

Conclusione: I generics in Java sono una pura operazione di marketing.

Chissà perchè?

Generics in C# e in Java

Mentre facevo una piccola ricerca di materiale per un mio prossimo articolo, mi sono imbattuto nel seguente paragrafo che spiega molto bene le differenze di implementazione dei Generics in Java e C#. Esso è tratto da Java Generics - Introduction - Angelika Langer

Translation of Generics

A compiler that must translate a parameterized type or method (in any language) has in principle two choices:

  • Code specialization . The compiler generates a new representation for every instantiation of a parameterized type or method. For instance, the compiler would generate code for a list of integers and additional, different code for a list of strings.
  • Code sharing . The compiler generates code for only one representation of a parameterized type or method and maps all the concrete instantiations of the generic type or method to the one unique representation, performing type checks and type conversions where needed.

Code specialization is the approach that C++ takes for its templates. The C++ compiler generates executable code for every instantiation of a template. The downside of code specialization of generic types is its potential for code bloat.  A list of integers and a list of strings would be represented in the executable code as two implementations of two different types.

This is particularly wasteful in cases where the elements in a collection are references (or pointers), because all references (or pointers) are of the same size and internally have the same representation. There is no need for generation of mostly identical code for a list of references to integers and a list of references to strings.  Both lists could internally be represented by a list of references to any type of object. The compiler just has to add a couple of casts whenever these references are passed in and out of the generic type or method. Since in Java most types are reference types, it deems natural that Java chooses code sharing as its technique for translation of generic types and methods.  [C#, by the way, uses both translation techniques for its generic types: code specialization for the value types and code sharing for the reference types.]

One downside of code sharing is that it creates problems when primitive types are used  as parameters of generic types or methods. Values of primitive type are of different size and require that different code is generated for a list of int and a list of double for instance. It?s not feasible to map both lists onto a single list implementation. There are several solutions to this problem:

  • No primitive types . Primitive types are prohibited as type arguments of parameterized types or methods, that is, the compiler rejects instantiations such as a List .
  • Boxing . Primitive type values are boxed automatically so that internally references to the boxed primitive value were used. (Boxing is the process of wrapping a primitive value into its corresponding reference type, and unboxing is the reverse (see / BOX /.) Naturally, boxing has an negative effect on performance due to the extra box and unbox operations.

Java Generics uses the first approach and restricts instantiation of generics to reference types. Hence a LinkedList is illegal in Java. [In C++ and C# primitive types are allowed as type arguments because these languages use code specialization (in C++ for all instantiations and in C# at least for instantiations on primitive types).]

A me pare un altro punto a favore di C# (vedi boxing/unboxing), ma giudicate voi.

Googlebomb

Ho scoperto una cosa curiosa: provate ad andare su Google, digitate "MS 70-315" e premete "Mi sento fortunato".

Indovinate un po' dove vi spara.

Why C#, Why Java, Why both survey

Vi propongo un piccolo sondaggio. Usate i commenti e ditemi come la pensate su questo spinoso dilemma. Sono interessato a chiarire una volta per tutte questa faccenda. Perchè scegliere un linguaggio piuttosto che un altro? Oppure perchè scegliere entrambi... nessun pregiudizio, nessun preconcetto, vi prego... tant'è che la mia opinione ve la darò solo fra un po'.

Documentum Prima giornata

Quest'oggi ho affrontato la prima giornata di corso su "Documentum". Per chi non lo conoscesse, "Documentum" è il software di Content Management che attualmente ha il maggior credito nel mercato dei CMS. Si tratta di una piattaforma nata prima dell'avvento del web e giunta a tutt'oggi alla versione 5.2. "Documentum" è basato su Oracle 9.2 e Verity per l'indicizzazione full-text dei contenuti. Il software quindi si basa su due repository distinti per metadata e documenti, il primo è Oracle mentre il secondo è il filesystem. 

Documentum nell'affacciarsi al mondo web si è avvicinata alle tecnologie Java che sposavano sicuramente meglio l'approccio fortemente object-oriented che ha il content server stesso. Questa politica, è comprensibile però solo pensando al mondo informatico di alcuni anni fa nel quale dominavano un mondo object oriented come Java e uno COM oriented come Visual Basic 6.0.

Confesso che sono rimasto molto deluso dall'apprendere che attualmente il supporto che Documentum da a .NET è limitato ad "una serie di classi wrapper di oggetti COM che utilizzano a loro volta una libreria Java denominata DFC". Una follia in termini prestazionali.

Da alcune ricerche sul sito della Documentum pare di capire che l'azienda sia intenzionata a dare supporto a .NET. Sul sito si legge:

"With a significant portion of our customers favoring the Microsoft .NET environment, Documentum is committed to providing you with a rich set of tools, interfaces, and services."

Purtroppo questo non è un riferimento a futuri sviluppi, ma esclusivamente alla soluzione attuale. Se poi qualcuno mi viene a dire che .NET è una piattaforma poco performante, non rispondo delle mie azioni.

Miglioramenti alla sicurezza di .NET

La Service Pack 1 di .NET 1.1 introduce molti miglioramenti relativi la sicurezza. Ecco un post che ne sottolinea uno molto importante.

http://blogs.msdn.com/gzunino/archive/2004/09/05/225881.aspx

LiveMessage Alerts!

Per tutti voi che immagino siate impazienti di leggere i miei post, da oggi il mio blog offre un nuovo servizio (suggerito da Eric Gunnerson)

E adesso non vi precipitate tutti a sottoscrivere quello di Eric...


 

GMail Notifier

Per quelli che come me non si sono lasciati scappare l'account di GMail che ha regalato Lorenzo, ecco un tool che può essere molto utile.

http://toolbar.google.com/gmail-helper/

Lo confesso, il link me lo ha passato Nietzsche, ma lui non lo ha postato, perciò ci penso io...

PInvoke Addin per VS.NET

Molto probabilmente molti di voi già lo conoscono, ma io lo posto lo stesso, perchè senza questo tool, il mio post #100 avrebbe sicuramente tardato un bel po'

http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=75122f62-5459-4364-b9ba-7b5e6a4754fe

Ruler

Jeff Key, l'autore di SnipperCompiler, ci regala un altro tool completo di codice sorgente.

http://weblogs.asp.net/jkey/archive/2004/09/01/224433.aspx

Ho fatto 100!!!

Mi sembra ieri che mi sono affacciato al "blogging", con un timido chi sono consapevole che l'onere che mi stavo assumendo era comunque sottovalutato, ed oggi, a distanza di alcuni mesi, 4 per l'esattezza, mi ritrovo a festeggiare il 100esimo post. Lo so, spesso e volentieri vi ho tediato con i miei sfoghi radicali, ma guardando ora nella console dello spendido tool che ci ha regalato l'ugi, mi rendo conto che comunque la maggioranza dei miei post sono dedicati a .NET.

Perciò, per festeggiare il numero 100, ho deciso di trovare qualcosa di succulento, che spero vi faccia piacere. Per tutta la giornata ho rinuciato a postare, per riservare questo numero a qualcosa che fosse un po' più che banale. E infine, spero di esserci riuscito, e vi ho preparato una classe che fa qualcosa di speciale, almeno a giudicare la fatica che ho dovuto fare a trovare la soluzione nella rete.

Dovete sapere che sto lavorando ad un software gestionale nel settore della sanità, che verrà utilizzato per mezzo di Terminal Server. Questo gestionale, oltre a profilare l'utente, necessita anche di riconoscere il terminale che è connesso, per adattare ad esso le proprie funzionalità. Il problema è che se provate a fare un po' di googling per cercare come si fa a conoscere anche solo l'indirizzo ip del client, presto vi renderete conto che se la soluzione esiste, di certo non sono in molti a conoscerla.

La classe che qui ho linkato ottiene questo risultato, per mezzo delle API esposte da wts32api.dll. Ho tentato in vari modi di ottenere quello che stavo cercando, (WMI è uno di questi) perfino qualche pazzoide suggeriva di usare netstat per conoscere l'ip della macchina collegata alla porta 3389, dimenticando che comunque non si sarebbe riusciti a sapere esattamente come fare corrispondere gli ip trovati alle varie sessioni... ed ecco il metodo che compie la magia:

private object GetSessionData( WtsInfoClass infoClass, Type type )
{
   // puntatore al buffer
   IntPtr ppBuffer = IntPtr.Zero;
   // numero di byte restituiti
   uint
pBytesReturned = 0;
   // eseguo la query
   if
( WTSQuerySessionInformation( IntPtr.Zero,
      unchecked( (uint
)WTS_CURRENT_SESSION ),
      infoClass,
      out
ppBuffer,
      out
pBytesReturned ) != 0 )
   {
      // converto il valore al tipo richiesto
      if ( type == typeof( string
) )
         return
Marshal.PtrToStringAuto( ppBuffer );
      else
         return
Marshal.PtrToStructure( ppBuffer, type );
   }
   // null se non trovo nulla
   return null
;
}

Si tratta di un metodo generico che richiede in input il dato che si deridera cercare. Tra quelli disponibili segnalo WTSClientName, WTSSessionId e WTSClientAddress. Questi tre vengono usati nella mia classe TerminalServerClient per ottenere rispettivamente il nome del client, l'id della sessione e l'indirizzo ip (tra i tre è questo il più difficile da trovare).

Se vi interessa, la classe completa la trovate qui. Si tratta di un singleton, perciò per usarla dovete fare così:

[STAThread]
static void Main(string
[] args)
{
   Console.WriteLine( TerminalServerClient.Current.SessionId );
   Console.WriteLine( TerminalServerClient.Current.Name );
   Console.WriteLine( TerminalServerClient.Current.IPAddress );
}

Infine una curiosità. se quello di cui avete bisogno è il nome della macchina, e tutto il resto non vi importa, allora basta una sola riga di codice per ottenerlo:

Console.WriteLine( Environment.GetEnvironmentVariable( "CLIENTNAME" ) );

Spero apprezziate il regalo di compleblog...

Today Popular News

Un articolo che stamane spopola tra i blogger microsoft...

http://www.forbes.com/2004/08/31/cz_dl_0831msft.html

x+=x++;

Ecco un interessante post (suggerito anche da Eric Gunnerson) che aiuta anche a comprendere come il runtime valuta le espressioni

http://blogs.msdn.com/lucabol/archive/2004/08/31/223580.aspx

Il consiglio finale è: NON SCRIVETE QUESTO CODICE.