Anobii, la mia libreria virtuale

Finalmente ho modo di mettere un pò in ordine la mia libreria, non fisicamente ma almeno virtualmente. Ho infatti creato su Anobii, un social network incentrato totalmente sui libri, la mia libreria virtuale dove piano piano organizzerò per argomento i numerosissimi libri in mio possesso, tecnici e non, onde consentire anche ai più curiosi di darci una sbirciatina per curiosare cosa conservo gelosamente sui miei scaffali.

Qui è accessibile il mio scaffale virtuale, per il momento ancora molto limitato.

Installare Windows 7 da USB

Utile tool per installare Windows 7 da drive USB.
In sostanza viene copiata l'immagine ISO della installazione di Win7 su un supporto USB rendendo lo stesso bootable, in modo da poter far partire il PC e lanciare l'installazione anche su macchine senza sistema operativo.

Java meglio di .NET ?

Il titolo di questo post è volutamente ironico, ed affronta un argomento all'ordine del giorno in ogni ambiente di lavoro e/o community in cui si ha a che fare con le tecnologia legate al mondo del software.
In questi ambienti capita spesso infatti di sentire o di partecipare a discussioni circa il fatto che quella o quell'altra tecnologia prevale a parità di contesto di utilizzo, es. Java è meglio di .NET,  Oracle è meglio di Sql Server, o viceversa.
Questi dibattiti, per quello che è la mia esperienza sul campo, sono spesso e volentieri condizionati dalla unilaterale conoscenza di una particolare tecnologia, e raramente colui che l'appoggia ha una consolidata esperienza su entrambe le piattaforme.
Ho assistito molto spesso a discorsi tipo:

"questo pezzo di codice se fosse scritto in Java non avrebbe quel bug...",

oppure

"se questa query fosse in PL-SQL le prestazioni sarebbero sen'altro migliori".

In questo interessantissimo post di Scott Guthrie in merito all'ultimo dibattito tecnologico in essere tra gli sviluppatori web (meglio ASP .NET Web Forms o ASP .NET MVC ?), è sintetizzato il mio pensiero sull'argomento:


"Great developers using bad tools/frameworks can make great apps. Bad developers using great tools/frameworks can make bad apps. Be very careful about making broad assumptions (good or bad) about the quality of the app you are building based on the tools/frameworks used".


Sono le persone che partecipano allo sviluppo a rendere vincente o perdente un software, a prescindere dalla particolare tecnologia applicata, ed è un grave errore pensare che solo perchè si è scelto di utilizzare l'ultima moda tecnologica un progetto software debba per forza essere vincente.

Entity Framework – Come impostare una relazione

Con Entity Framework è possibile referenziare tra loro entità in modo molto semplice.

Supponendo di avere l’entità Customer e l’entità Category, che rappresentano rispettivamente un cliente e la sua categoria di appartenenza, nel data model l’oggetto Customer conterrà una proprietà chiamata Category di tipo Category.

In fase di creazione di un nuovo oggetto Customer è necessario associare la Category di appartenenza scelta dall’utente, molto probabilmente mediante una dropdown list contenente la lista delle categorie (DataTextField), e l’Id delle stesse (DataValueField).

Istintivamente, verrebbe di fare una cosa di questo tipo:

   1: CustomerEntity customerEntity = new CustomerEntity();
   2: customer.Category = new Category() {Id=1, Description="New Category"};
   3: customerEntity.AddToCustomer(customer);
   4: customerEntity.SaveChanges();

che però non funziona in quanto solleva una eccezione del tipo “An entity object cannot be referenced by multiple instances of IEntityChangeTracker”.

Per poter funzionare la reference ha bisogno esclusivamente dell’Id della Categoria di appartenenza del Cliente, e non dell’intero oggetto Category, anche perchè per ricrearlo interamente potrebbe essere necessario accedere al database di memorizzazione.

Occorre semplicemente creare un oggetto EntityKey ed associarlo all’oggetto Customer corrispondente, in questo modo:

   1: int idCategory  = 1; // in un caso reale è letto da un controllo della pagina web
   2: CustomerEntity customerEntity = new CustomerEntity();
   3: IEnumerable<KeyValuePair<string, object>> entityKeyValues =
   4:     new KeyValuePair<string, object>[] {
   5:     new KeyValuePair<string, object>("Id", idCategory) };
   6: EntityKey key = new EntityKey("Entities.Category", entityKeyValues);
   7: customer.CategoryReference.EntityKey = key;
   8: customerEntity.AddToCustomer(customer);
   9: customerEntity.SaveChanges();

ASP .NET 4.0 #3 Ciò che non è cambiato

ASP .NET 4.0 è ormai alle porte, con la versione beta è possibile scoprire le novità rispetto alla versione precedente, e non sono certamente poche, ma a livello di controlli lato server ce ne sono alcuni praticamente immutati rispetto alle precedenti versioni. Mi riferisco ad esempio al controllo Http File Upload, rimasto identico nelle varie versioni di ASP .NET che si sono succedute. Questo controllo soffre di qualche problema e non è certo il massimo in ottica web 2.0, ovvero su siti dove è richiesto una elevata user experience.

A meno di non utilizzare un controllo di terze parti probabilmente a pagamento, occorre fare i conti con il look del controllo rimasto identico nel tempo, con l’assenza di funzionalità oggi richieste quali ad esempio la barra di progressione dell’upload in corso, e soprattutto con un fastidioso comportamento “by design”, ovvero la perdita del contenuto (il nome completo di percorso del file scelto) ad ogni postback della pagina; quest’ultima caratteristica è resa necessaria da motivi di sicurezza.

Se la pagina dispone di altri controlli che generano un postback, es. una dropdownlist, l’unico escamotage è quello di rendere il controllo File Upload l’ultimo controllo che genera postback in ordine di visualizzazione, in modo da invogliare l’utente ad interagire per ultimo con esso. In caso contrario, un postback della pagina provocherà la perdita del suo contenuto, cioè del nome del file scelto, ed ovviamente obbligherà l’utente a scegliere nuovamente il file da inviare.

L’evento page load è eseguito 2 volte

Convertire un progetto ASP .NET dalla versione 1.1 ad una versione successiva del .NET Framework nasconde un inconveniente a cui occorre porre rimedio manualmente.

L’inconveniente è dovuto alla introduzione delle partial class a partire dalla versione 2.0 del .NET Framework, in contrapposizione al codice generato dal designer nella versione 1.1.

Questo fa si che importando il codice sorgente nella nuova versione utilizzata ci si ritrovi, ad esempio, con un event handler come questo nel metodo InitializeComponent

   1: private void InitializeComponent() 
   2: { 
   3:     this.Load += new System.EventHandler(this.Page_Load); 
   4: }

Questo innocente codice derivante dalla conversione fa in modo che l’evento Page Load sia generato 2 volte, una volta dall’handler presente nella partial class ed una volta da quello presente nel metodo InitalizeComponent.

Per eliminare questo fastidioso inconveniente è sufficiente rimuovere l’handler presente nel metodo InitializeComponent

Link utili della settimana #4

  1. 1. IE Tester 0.4.2 Ottimo tool gratuito per testare funzionalità di layout nelle varie versioni di Internet Explorer. Peccato che manchi un supporto per altri browser.
  2. 2. Come installare Windows 7 da drive USB

</xplayn.org>

Questo blog cambia nome, veste grafica e motore di blogging. Causa perdurata inattività, ho deciso di chiudere il sito xplayn.org, da me aperto insieme all'amico Francesco Quaratino.

Il nuovo nome, coding4art.com è ovviamente un omaggio alla programmazione software vista come un'arte o più precisamente un'attività ingegneristica e non artigianale. Si parla tanto di metodologie applicate alla produzione software, Agile, waterfall o MSF che sia, ma spesso e volentieri questa viene vista come un'attività artigianale, espletata senza o quasi nessuna metodologia, da programmatori senza esperienza specifica nella particolare tecnologia scelta, senza nessuna cura per il codice sorgente, senza nessuna best practice o guidelines applicata o peggio ancora con varie best practice mischiate tra loro, senza nessuna pianificazione riguardante argomenti come sicurezza, performance, scalabilità, manutenibilità ma con un unico obiettivo in testa, ovvero creare nel più breve tempo possibile una applicazione in cui i requisiti utente siano soddisfatti, ovvero che funzioni, e basta, con le conseguenze che questo approccio comporta.

I miei articoli presenti su xplayn.org li ho inseriti nella apposita sezione articoli su questo blog, dove conto di scriverne altri, tempo permettendo ovviamente.

Come nuovo motore di blogging ho scelto SubText, ben fatto e molto veloce, parecchio più veloce di Community Server, a mio avviso, con una fantastica funzionalità già inclusa, ovvero la possibilità di importare un intero blog (commenti compresi) precedentemente esportato, il tutto mediante lo standard BlogML.

L'RSS feed è comunque invariato, poichè utilizzo il feed esterno fornito da FeedBurner e quindi il blog è accessibile negli RSS Aggregator senza nessuna modifica.

Questo post vuol essere anche una promessa a me stesso di curare di più il mio blog, strumento in cui credo moltissimo, e di arricchirlo anche con più articoli tecnici.

Visual Studio 2010 Beta 2

Disponibile il download per tutti

Link utili della settimana #3

- Doloto, time optimizers for Ajax applications

- AutoMapper, framework per mappare automaticamente e quindi creare un oggetto semplice, es. un DTO, mediante un oggetto complesso come una entità di dominio

- WPF tutorial;

- Microsoft Ajax Library (Preview 6) e Microsoft Ajax Minifier ( Microsoft Ajax Javascript Library -> nuova e migliorata sintassi imperativa, miglior integrazione con JQuery, nuovo client script loader, Minifier Tool, per ridurre le dimensioni dei file javascript scaricati sul client mediante minification)

Link utili della settimana #2

 

  1. Descrizione di Unity, il framework di Inversion of Control e Dipendency Injection sviluppato dal team di P&P (qui è presente la versione 1.2 per Silverlight)
  2. 45 passi per diventare agili
  3. xVal, libreria per la validazione client side di applicazioni ASP .NET MVC
  4. Anti XSS Library ver. 3.1
  5. CodePad .NET 1.0 Beta 2, un editor leggero per provare spezzoni di codice
  6. Strongly typed session variables in ASP .NET MVC
  7. Visual Studio 2010 e .NET Framework 4.0 Training Kit - May preview

Link utili della settimana #1

- MVVM Toolkit Light

- Ajax Control Toolkit release 30930 (30 sett 2009);

-thinktecture.WSCF.blue (Contract first WCF Tool)

- The ModelView-ViewModel design pattern for WPF

- Code Run (questo è davvero incredibile, si evincono chiaramente le potenzialità del Cloud Computing).  Trattasi di un IDE Online, con cui è possibile sviluppare progetti .NET direttamente nel browser, potendo anche disporre di un ambiente di host on the cloud, su cui è possibile effettuare il deployment delle proprie applicazioni sviluppate on line.

- Bonnie .NET API per sviluppare applicazioni che usano la crittografia della informazioni o certificati X.509

ASP .Net e i thread secondari

Interessantissimo post di Stefano Pronti del nuovo blog MSDN di Supporto Tecnico agli Sviluppatori, che spiega le disastrose conseguenze di non richiamare il metodo Dispose su risorse unmanaged, utilizzate all'interno di una web application.

Per farla breve, le risorse unmanaged utilizzavano un thread secondario rispetto a quello che prende in carico la web request, ed in questo thread secondario veniva sollevata una eccezione non gestita durante la fase di finalizzazione del garbage collector, che, come è noto, viene eseguito in un thread diverso.

In questo caso il comportamento di ASP .NET a partire dalla versione 2.0 è quello di interrompere immediatamente il processo in esecuzione, con conseguenze facilmente immaginabili.

Ho già parlato qui di questo comportamento di ASP .NET e di come sia possibile utilizzare la modalità pre-versione 2.0 di gestione delle eccezioni non gestite sollevate all'interno di thread diversi.

Anche a me è capitato di dover "impazzire" con una applicazione in produzione, abbastanza vasta, che soffriva di frequenti ed improvvise cadute della sessione corrente, con enorme disagio degli utenti.

Nel caso specifico non è stato indispensabile attaccare un debugger per ottenere il dump della memoria al momento dell'eccezione, è bastato debuggare il codice, che non conoscevo neanche bene, e scoprire che venivano creati thread aggiuntivi (!?) il cui codice, in particolari circostanze, sollevava l'eccezione fatale che provocava il riavvio del worker process.

Link utili della settimana

  1. Descrizione di Unity, il framework di Inversion of Control e Dipendency Injection sviluppato dal team di P&P (qui è presente la versione 1.2 per Silverlight)
  2. 45 passi per diventare agili
  3. xVal, libreria per la validazione client side di applicazioni ASP .NET MVC
  4. Anti XSS Library ver. 3.1
  5. CodePad .NET 1.0 Beta 2, un editor leggero per provare spezzoni di codice
  6. Strongly typed session variables in ASP .NET MVC
  7. Visual Studio 2010 e .NET Framework 4.0 Training Kit - May preview

i4o (ovvero index for objects)

Per chi (come me) utilizza LINQ  questo progetto presente su Codeplex è senz'altro interessante.

Come è noto LINQ  effettua  le ricerche in modo sequenziale, cosa che su collezioni con parecchi items può dar luogo ad un degrado delle prestazioni.

Questo progetto si prefigge come obiettivo quello di dotare LINQ della ricerca indicizzata degli elementi, che, stando a quanto riportato nella descrizione del progetto, è in grado di rendere le query oltre mille volte più veloci rispetto alla ricerca sequenziale.

Il progetto è attualmente in Beta 3, e non ci sono rilasci pianificati.

Sarebbe interessante da provare (avendone il tempo ! smile_regular).

Se qualcuno lo ha già fatto sarei lieto di leggerele impressioni di utilizzo.

Invocazione di metodo remoto da Javascript

A partire da ASP .NET 3.5 è possibile da JavaScript richiamare un metodo esterno, implementato nella stessa pagina aspx che invoca il codice Javascript, oppure in un ASP .NET XML Web Services (per intenderci, quello in formato .asmx), oppure in un WCF Services (in formato .svc), tutto questo senza passare attraverso il normale ciclo di vita della pagina, ma invocando semplicemente un metodo pubblico di una classe, visto che la pagina aspx è una classe a tutti gli effetti.

Al metodo è possibile passare dei parametri e ricevere indietro un valore di ritorno, che sarà serializzato / deserializzato in modalità JSON.

Se si ha la necessità di eseguire codice lato server senza passare dall'intero ciclo di vita della pagine, invocare un metodo pubblico della pagina è sicuramente la soluzione più veloce da implementare, poichè non necessita di creare una applicazione a sè stante (il web service o il WCF Service), e quindi è anche più facile da installare e da manutenere, ma non è esente da limitazioni, la maggiore delle quali è l'impossibilità di richiamare il metodo pubblico da parte di pagine diverse rispetto a quella in cui lo stesso è dichiarato (in tal caso è necessario creare un servizio web, ASP .NET XML Web Service oppure WCF Service).

Di seguito i passi necessari per richiamare un metodo pubblico esposto dalla classe che genera la pagina aspx, da codice Javascript:

  • E' necessario creare un metodo pubblico e statico all'interno della classe che identifica la pagina aspx e decorarlo con l'attributo System.Web.Services.WebMethodAttribute;
[WebMethod]
public static string GetValueFromServer(string param1, string param2)
{
    return "TEST_RETURN_VALUE";
}

 

 

  • E' necessario assegnare True alla proprietà  EnablePageMethods dell'oggetto ScriptManager ospitato dalla pagina in questione (il valore di default è False), per abilitare l'invocazione di metodi di pagina;
  • <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />

             

            • I due passaggi precedenti fanno in modo che nella pagina aspx sia iniettato del codice di script (inline) che permette di richiamare il "Web Method". Questo codice di script comprende essenzialmente un oggetto chiamato "PageMethods", il cui nome è hardcoded e quindi non modificabile, avente metodi statici con lo stesso nome dei metodi statici di pagina, mediante cui è possibile richiamare questi ultimi passando gli opportuni parametri, e indicando una funzione di callback che sarà automaticamente richiamata al termine dell'invocazione del metodo remoto e che conterrà il valore di ritorno di quest'ultimo, piu un metodo di callback opzionale che sarà automaticamente richiamato in caso di errore del metodo remoto.  
            function Function1 {
                PageMethods.GetValueFromServer( param1, param2, onSuccessfullCall, onErrorCall);
            }

             

            • La funzione di callback richiamata in caso di errore è opzionale. Occorre tener presente che l'invocazione del metodo remoto è asincrona, quindi il controllo tornerà immediatamente al codice Javascript chiamante. Al termine della invocazione del metodo sarà invocata automaticamente la funzione di callback opportuna (chiamata conlusa con successo o con errore). Nel caso di chiamata conclusa con esito positivo, la funzione di callback conterrà anche il valore di ritorno del metodo remoto invocato.
            function onSuccessfullCall(results, userContext, methodName) {
                alert(results);
            }
             
            function onErrorCall(error, userContext, methodName) {
                if (error !== null)
                    alert(error.get_message());
            }

             

            • Il parametro results della funzione di callback richiamata in caso di invocazione riuscita conterrà il valore di ritorno del metodo remoto

</RSSBandit>

Stanco ormai di ricevere ogni 3x2 un messaggio di errore di RSSBandit che mi indica un errore fatale nel caricamento del file XML contenente i feeds sottoscritti, obbligandomi a caricare una copia di backup (che potrebbe essere non aggiornata) dello stesso file con l'antipatica conseguenza di ritrovarmi con tutti i feeds impostati sullo stato di "Unread" (cosa davvero antipatica se si hanno tanti feeds sottoscritti),  ho deciso di cambiare aggregator. Da oggi sto utilizzando FeedDemon 3 (RC4).

E' ancora in versione Beta (la versione 3), ma ne parlano molto bene nelle recensioni che ho letto sulla rete.

Inoltre, è possibile sincronizzare i feeds con Google Reader, feature utile se non si utilizza sempre lo stesso PC.

Speriamo di non avere gli stessi problemi avuti con RSSBandit smile_regular

C# 4.0 - Parametri opzionali

 

Leggo che tra le nuove feature di C# 4.0 c'è la possibilità di indicare come opzionali i parametri di un metodo o di un costruttore, in tal caso il parametro viene inizializzato con un valore di default fornito dal programmatore.

Una cosa di questo tipo:

public Person(string firstName, string lastName, string city = "")
{    
        //
}

 

che può essere istanziata in entrambi le modalità:

Person p = new Person("Maurizio", "Tammacco");
Person p1 = new Person("Maurizio", "Tammacco", "Bari");

 

Nel primo esempio, poichè il parametro "City" è opzionale, viene automaticamente assegnato il valore di default, ovvero stringa vuota in questo caso.

Sinceramente questa nuova funzionalità non mi entusiasma per niente, anzi la ritengo quasi inutile visto che comunque una funzionalità analoga è possibile ottenerla con le "Automatic properties", ovvero proprietà pubbliche inizializzabili nella stessa istruzione che crea l'istanza di un oggetto, anche se questa funzionalità riguarda comunque un membro definito come proprietà.

I parametri opzionali sono da sempre presenti in Visual Basic, sin dalla versione 6 e poi anche nelle varie versioni .NET. Questo comportava che, in caso di interoperabilità tra i due linguaggi, il codice C# che richiamava un metodo scritto in VB .NET con parametri opzionali era costretto a passargli comunque tutti i parametri, opzionali e non;  la stessa cosa accadeva nell'utilizzo della COM Interop da C#. Adesso non sarà più necessario passare i parametri opzionali, ma, ripeto, a mio avviso l'utilità di questa funzionalità è discutibile, e riguarda unicamente una più stretta compatibilità tra i due linguaggi più usati nel mondo .NET.

Come ottenere il nome del metodo chiamante dallo stack usando reflection

Cosi:

   1: using System.Diagnostics;
   2:     void Log(string eventMessage)
   3: { 
   4:    Console.WriteLine("Event logged by " + (new StackTrace()).GetFrame(1).GetMethod().Name); 
   5:    Console.WriteLine("Event: " + eventMessage);
   6: }
   7:  

 

Fonte: Tips & Tricks for ASP.NET, IIS, and Visual Web Developer

 

ASP .NET 4.0 #2 Servizi "provider based"

Proseguendo nell'analisi delle nuove feature di ASP .NET 4.0 è evidente che l'architettura a providers, di cui tempo fa ho parlato in un articolo apparso su DotNetSide, è sempre più usata in modo intensivo per rendere quanto più modulare e personalizzabile l'application framework a disposizione.

Con la nuova versione di ASP .NET infatti questa architettura noto che sarà introdotta nei servizi di Output Caching, Browser Capabilities e Auto Start Application, almeno dalla documentazione in mio possesso.

Output Caching

Uno dei grossi limiti dell' output caching delle precedenti versioni di ASP .NET è la limitatà flessibilità sul repository di memorizzazione dei dati in cache (output). Questi infatti potevano essere memorizzati solo nella memoria del server e da nessun altra parte. Come è facile intuire con la nuova versione è possibile scriversi un provider personalizzato per la memorizzazione dei dati e quindi utilizzare qualsivoglia repository a disposizione (es. disco locale, disco di rete, database, ecc)

Auto Start Application

Se si utilizza IIS 7.5 e Windows Server 2008 R2 insieme ad ASP .NET 4.0, è possibile far in modo che una applicazione si avvii in automatico ed esegua del codice di inizializzazione. Questo scenario si applica soprattutto a quelle applicazioni che necessitano di tempi lunghi per inizializzarsi, e quindi per evitare che questo overhead ricada totalmente sulla prima richiesta è possibile eseguire questo codice allo start-up automatico, ovvero senza che ci sia una richiesta di pagina esplicita. Questo codice può essere incapsulato in una classe provider, e quindi si possono avere n provider da utilizzare all'occorrenza in base alle specifiche esigenze.

Browser Capabilities

Questa funzionalità nelle precedenti versioni era fruibile solo mediante la modifica di files xml (.browser), a livello di macchina o di singola applicazione. Questi files xml non sono proprio il massimo per descrivere funzionalità come quelle del browser. Ora è possibile definire proprie funzionalità a livello di browser mediante l'uso di classi "provider based"

«February»
SunMonTueWedThuFriSat
31123456
78910111213
14151617181920
21222324252627
28123456
78910111213