August 21st, 2008
Nell’azienda dove lavoro attualmente, ogni tanto mi capita di dover manutenere codice legacy sviluppato in Visual Basic 6. Ovviamente erano anni che non aprivo un progetto VB6 e quindi avevo dimenticato di come fosse ostico utilizzare un IDE rilasciato nell’estate del 1998
(gli IDE moderni mi hanno viziato). Già farlo andare su Vista Business del mio laptop aziendale è stata una battaglia, ma poi una volta lanciato il caro vecchio VB6 mi ha subito ricordato che ai suoi tempi i mouse erano senza wheel facendomi riaffiorare veramente "brutti ricordi"
Fortunatamente con la KB 837910 Microsoft qualche anno fa realizzò un addin per attivare la funzionalità di scrolling rendendo quindi la lettura di codice vb6 (già deprimente di per sé) un attimino più agevole.
Il link per il download del pacchetto VB6MouseWheel.EXE
La KB ufficiale con le istruzioni per l’installazione
Legacy, Tech Gadgets, Windows | No Comments »
July 11th, 2008
Molti avranno notato che Microsoft rilasciando la suite di software Windows Live (Messenger, Mail, Live Writer etc.) ha anche deciso di non fornire più i setup per effettuare installazioni standalone. Attualmente l’unico file distribuito sul sito ufficiale di BigM è "Windows Live Installer.exe" che permette agli utenti di scegliere quali software della suite installare per poi effettuare internamente il download di un apposito pacchetto riconvertito poi in locale in un setup MSI compliant.
Capisco che la suite è composta da software che è nato per l’utilizzo online, ma probabilmente a Redmond non hanno ancora compreso che non tutti gli utenti, soprattutto quelli che vivono in paesi tecnologiamente "arretrati", non dispongono ancora di connessioni broadband e che quindi non a tutti va di stare li 30 minuti in dialup a scaricarsi 17 Mbyte di dati per ogni setup.
Fortunatamente il setup di Windows Live, una volta scaricato il pacchetto, salva i file MSI opportunamente convertiti da WLSetupSvc.exe nella cartella C:\Program Files\Common Files\WindowsLiveInstaller\MsiSources, senza cancellarli al termine della procedura, permettendo quindi di replicare facilmente l’installazione su macchine non fornite di connettività.
Il formato dei setup MSI è Install_{GUID}.msi. Basta andare nelle proprietà di ogni singolo MSI e leggere la parte di metadati (nello specifico il subject) per capire a quale software Windows Live si fa riferimento. Ad esempio il GUID 9176251A-4CC1-4DDB-B343-B487195EB397 fa riferimento a Live Writer, ottimo software da utilizzare per interfacciarsi al proprio blog engine e postare in maniera veloce senza passare per le varie web application. Ovviamente è possibile rinominare i file MSI senza dover imparare i GUID a memoria
Ho scritto questo post perchè ho notato che sul web, a causa di questa problematica, iniziano a proliferare dei setup da fonti che sicuramente possono essere considerate "untrusted" che banalmente potrebbero infilare in un file MSI qualsiasi cosa provocando gravi danni alle macchine di utenti ignari e alle prime armi. Considerando il target di un prodotto come Messenger diffusissimo tra i giovani, ribadisco il fatto che, secondo me, Microsoft dovrebbe ritornare sui suoi passi fornendo i link per il download dei singoli pacchetti dal proprio sito ufficiale.
Microsoft, Windows | No Comments »
June 5th, 2008
Qualche tempo fa avevo provato una delle night build del famoso AddIn Resharper in versione 4.0. Siccome si trattava di una release alpha il software rendeva l’ambiente di sviluppo di VS 2008 quasi inutilizzabile a causa di problemi di rilascio delle risorse in memoria che praticamente portavano, dopo qualche ora di lavoro, devenv.exe (il processo principale dell’ide VS2008) a saturare quasi completamente la memoria di sistema. A causa di questa anomalia e di altri problemi decisi quindi per una disinstallazione del package per poi aspettare l’uscita di una release più stabile di questo utile tool.
Qualche settimana fa Resharper 4.0 è stato rilasciato in versione RC (release candidate). Siccome questa versione risolve la maggior parte dei bugs che affliggevano le versioni precedenti ho deciso di provarla approfittando dei 30 giorni trial.
Il setup si presenta con una gui differente da quelle delle nigh build anche se le varie opzioni sono rimaste le stesse. Terminata la procedura di installazione, lanciando VS, è subito saltata fuori una message box con il seguente errore :
‘Failed to load the supplementary package ‘0c6e6407-13fc-4878-869a-c8b4016c57fe‘
Siccome l’archiettura di VS permette di gestire i vari AddIn in maniera completamente separata dal resto dell’applicazione il mancato caricamente del package con quel Guid non pregiudica l’avvio dell’IDE permettendo quindi di continuare a lavorare anche se le funzionalità di Resharper sono tutte disabilitate.
Cercando su google qualche work around al problema sono incappato in un thread sul forum di Jetbrains (produttore di Resharper) dove è indicata chiaramente una soluzione al problema. Praticamente è bastato ricorrere all’uso di una delle opzioni da riga di comando dell’eseguibile devenv.exe ( a questo link è possibile trovare tutte i command line switches per devenv utili al deployment e alla configurazione dei VSPackage ) :
da command prompt lanciato come amministratore:
Devenv.exe /ResetSkipPkgs
ha permesso di resettare tutti i flag di skip loading precedentemente impostati, permettendo, quindi, a VS2K8 di avviarsi senza problemi caricando Resharper in maniera corretta (probabilmente nell’usare la night build avevo segnalato a VS di non fare il loading del pacchetto che mi dava problemi, ma dopo aver provedduto alla disinstallazione della versione alpha, questo flag era rimasto ed ora la RC 4.0 non riusciva a partire proprio perchè VS saltava il caricamento di quello specifico package).
Concludendo : "grazie" a questa problematica con Resharper ho scoperto che devenv con i suoi vari command line switches è uno strumento molto versatile per il build & deploy di progetti sln senza nemmeno avviare la GUI dell’IDE (non conoscevo tutte le varie opzioni disponibili, provate con devenv /?, ci sono cose veramente interessanti).
Tools, Visual Studio | No Comments »
April 23rd, 2008
Ho appena aggiornato l’engine WordPress con cui gira questo blog all’ultima versione 2.5 (datata 29 marzo 2008). WordPress è uno dei prodotti sviluppati con PHP che ritengo più validi, basti pensare alle migliaia di pagine web lette e scritte ogni giorno grazie a questo engine. La versione 2.5 apporta una serie di migliorie sia per quanto riguarda l’usabilità sia sul piano della sicurezza. Ecco quelle che ritengo più sigificative :
- Interfaccia del pannello di amministrazione completamente ridisegnata
- Una dashboard basata sul concetto di widget
- Supporto alla funzionalità di Undo nell’editing dei commenti
- Completo refactoring di XML-RPC
- Introduzione della Shortcode API ovvero un set di istruzioni per inglobare delle macro che agiscano sul contenuto del post.
Insomma per chi utilizza questo software per mantenere il proprio blog l’update è vivamente consigliato
Off Topic | No Comments »
March 6th, 2008
Oggi, lavorando al domain model di un nuovo progetto, ho scoperto una curiosità relativa a Visual Studio 2008. Completato il lavoro sul class diagram, stavo per procedere alla creazione dei file XML per il mapping LINQ2SQL (a me non piace l’approccio del designer DBML, preferisco avere più controllo sulle mie entities) quando davanti al caro editor di Visual Studio entro nelle proprietà del file XML e cerco appunto lo schema XSD per validare i tag di mapping linq2sql e contestualmente farmi aiutare dal caro vecchio intellisense. Ebbene lo schema non è presente nella cartella di VS2008 ([]\Microsoft Visual Studio 9.0\Xml\Schemas)dedicata allo scopo. A questo punto ho pensato che fosse un problema della mia installazione di VS2008 per cui approdo su MSDN in cerca di chiarimenti.
Ecco quello che riporta la pagina della documentazione relativa a "External Mapping Reference (LINQ to SQL)" :
XML Schema Definition File
External mapping in LINQ to SQL must be valid against the following XML schema definition.
Distinguish this schema definition file from the schema definition file that is used to validate a DBML file. For more information, see Code Generation in LINQ to SQL).
Note:
Visual Studio users will also find this XSD file in the XML Schemas dialog box as "LinqToSqlMapping.xsd". To use this file correctly for validating an external mapping file, see How to: Validate DBML and External Mapping Files (LINQ to SQL).
La nota, come si legge, è molto chiara : il file è incluso nell’installazione di Visual Studio 2008 standard; il problema è soltanto del mio setup !!??.
Decido, quindi, di googlare ancora e mi ritrovo sul servizio Connect di Microsoft (https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=328848) dove scopro che l’issue con id 328848 tratta proprio il mio problema.
Ebbene il file XSD, effettivamente manca, e non solo a me. La cosa è stata già segnalata qualche settimana fa da Marco Russo di Dev Leap e io ovviamente mi sono associato quotando il suo feedback su Connect.
Ecco la risposta di Microsoft a Marco :
Hi,
Sorry for the inconvenience here – this is a bug. As a workaround, you can use the schema that is indicated on the External Mapping reference page as your schema reference. We will fix the problem in the future.
Thanks.
LINQ to SQL Team
Il workaround come indicato è quello di creare a manina lo schema (è possibile trovare il codice XSD sempre su External Mapping Reference (LINQ to SQL).
LINQ, Visual Studio | No Comments »
March 5th, 2008
Per chi non conoscesse il MIX : si tratta di una conferenza annuale, tenuta da Microsoft, relativa allo sviluppo Web e alla User Experience in generale. Questa volta siamo alla terza edizione e come negli anni precedenti BigM ha promesso che saranno fatti annunci relativi a nuove tecnologie e rilasci di nuovi strumenti.
Per chi, povero mortale, rimane qui in Italia e non può godersi l’agenda direttamente in quel di Las Vegas (io ne approfitterei per fare anche qualche sit & go di texas hold’em, magari al Bellagio:)), Microsoft ha messo a disposizione il sito http://visitmix.com/2008/default.aspx dove tra poche ore (mentre scrivo il post sono le 16.45 in Italia – le 07.35 AM a Las Vegas GMT-8, la keynote di apertura è prevista alle 9.30AM) sarà possibile guardarsi in streaming la keynote di Ray Ozzie, Scott Guthrie e Dean Hachamovitch, mentre domani sarà la volta di quella di Steve Ballmer.
Ovviamente, la parte tecnicamente appetibile non sono le Keynote, ma le Session in agenda (è possibile visualizzarne l’elenco da qui https://content.visitmix.com/public/sessions.aspx) che quest anno si preannunciano ricche di "spunti" e tracks interessanti.
Come nelle precedenti edizioni, sarà possibile guardarsi le registrazioni delle sessioni con relativo transcript, slides ed esempi di codice direttamente da http://sessions.visitmix.com/ , pubblicate in differita (24h).
Tempo permettendo cercherò di bloggare le novità e gli annunci più importanti di questa edizione del MIX.
Enjoy MIX 08!!
Microsoft | No Comments »
January 25th, 2008
Gregs Dolley, uno sviluppatore americano, concentrato soprattutto sulle problematiche di programmazione grafica via OpenGL e DirectX nel mondo managed, è riuscito nella straordinaria impresa di effettuare un porting di uno dei videogiochi più famosi al mondo, Quake3 Arena (code base originale di Id Software, scritta completamente in C), sul framework .NET \ DirectX, con soluzione di progetto compilabile con Visual Studio 2008.
Le fasi di questa impresa, che definirei titanica, sono state :
1) Rendere compilabile il progetto originale di Id Software su Visual Studio 2008 con MSVC++ (questo come spiega Greg, ovviamente non rappresenta un porting vero e proprio su .NET ma semplicemente "a C port to a different compiler"). Questo ha richiesto il fixing di 3000 errori di compilazione, proprio perchè la codebase originale è in C e non in C++;
2) Rendere compilabile la soluzione, in uscita dalla fase di cui sopra, abilitando l’opzione /clr su Visual Studio 2008 per produttore codice managed. Per questo ha dovuto fixare 28.000 errori di compilazione e più di 4000 warnings, patchare tutte le chiamate managed in chiamate native, finchè non è stato possibile aprire l’eseguibile e le dll di supporto in ILDASM (il disassemblatore .NET CLR);
Alla fine di questa "battaglia", la soluzione che Greg ha reso disponibile in download contiene sorgente 99% compilabile in codice managed (IL / CLR bytecode); rimangono tuttavia funzioni che sollevano eccezioni proprio perchè contengono codice assembly x86 inline;
Sul blog di Greg c’è il post che analizza in dettaglio tutte le varie fasi del porting (LINK)
Awesome, Greg!
.NET Framework | No Comments »
December 18th, 2007
Questa segnalazione magari può essere utile a qualcuno.
Utilizzando ClickOnce per il deploy di un applicazione su un server IIS6 / Windows Server 2003, bisogna considerare alcuni accorgimenti al fine di far funzionare per bene il meccanismo.
Se la pubblicazione avviene su un virtual folder protetto da Autenticazione integrata di Windows, bisogna ricordare all’utente finale di autenticarsi tramite la schermata proposta dal browser, salvando le credenziali utilizzate, altirmenti iis le richiederà per ogni singolo file facente parte della distribuzione (manifest, application, etc.). Questo workaround non è valido per l’autenticazione Basic.
Inoltre per chi utilizza il deploy da Visual Studio tramite FTP, bisogna :
- ricordarsi di specificare la url finale dell’indirizzo utilizzato per il deploy in modo preciso (infatti il manifest e la signature vengono creati a partire da questa informazione, proprio per evitare problemi di sicurezza legati alla sostituzione del pacchetto di setup con uno "non ufficiale";
- ricordarsi di configurare il virtual folder su iis in modo che gestisca i seguenti tipi MIME (senza, il client downloader di ClickOnce potrebbe incappare in una HttpException perchè IIS restituirà errore interno cod 500) :
| Estensione |
MIME Type |
| .application |
application/x-ms-application |
| .deploy |
application/octet-stream |
| .manifest |
application/x-ms-manifest |
Ricordo, inoltre, che chi utilizza le Front Page Extension per deployare sul server web può anche tralasciare i punti di cui sopra perchè Visual Studio provvederà a configurare automaticamente IIS ( c’è ancora qualcuno con frontpageext sul suo iis ????
)
Per affrondire gli aspetti di configurazione client \ server relativi a ClickOnce, c’è, ovviamente, MSDN :
http://msdn2.microsoft.com/en-us/library/ms228998.aspx
.NET Framework | No Comments »
December 6th, 2007
Come si sa, i motori di ricerca non digeriscono (leggasi indicizzano) per bene le pagine dinamiche con parametri passati su querystring; ecco il motivo per cui si fa uso di tecniche di URLRewriting, ovvero un URL che classicamente potrebbe essere :
http://mywebsite/showproduct.aspx?IdProduct = 10
potrebbe essere più "search engines friendly" e diventare :
http://mywebsite/showproduct/10.aspx
In questo modo il motore di ricerca indicizzerà correttamente la pagina web trattandola come se fosse una pagina statica.
La tecnica URLRewriting consiste praticamente nell’intercettare una Request Web e redirigere questa richiesta su una sorgente differente.
Ai tempi delle ASP l’unico modo per poter implementare questa tecnica era l’utilzzo di un filtro ISAPI che gestiva appunto la pipeline della request , supportato da IIS.
Con l’avvento di ASP.NET e in particolare della versione 2.0, implementare URL Rewriting è diventato molto semplice grazie soprattutto ai concetti di http handler e http module, "strumenti", che permettono di "mettersi in mezzo" alla normale flusso request-response gestito dal web server per modificarne opportunamente il behavior in base a specifiche regole.
Maggiori informazioni sulle varie tecniche di implementazione si possono trovare sul blog di Scott Gu in questo post http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx.
Tornando allo scopo del post, utilizzando per un progetto web ecommerce, una tecnica di url rewriting basata su RegEx rules e il metodo RewritePath della classe HttpContext in coppia con vari UpdatePanel, sono incappato in un problema dovuto al postback e al fatto che il PageRequestManager delle AJAX Extensions di Microsoft andava abbastanza in confusione tra url originali e virtuali riscritti dal modulo di Url Rewriting.
Praticamente supponendo che l’absolute path della URL sia :
/showproduct/10.aspx
trasformata in :
/showproduct.aspx?IdProduct = 10
inserendo nella pagina showproduct un UpdatePanel con all’interno qualsiasi controllo che gestisca l’evento click ed effettuando postback sulla stessa pagina, stranamente la form cercava di fare post sulla url /showproduct/showproduct.aspx, ignorando quindi completamente, le mie regole di rewriting.
Il titolo del post cita nello specifico l’update panel ajax, ma è da notare che l’anomalia si verifica anche con postback sincroni.
Il problema è dovuto all’errata url specificata in automatico nella proprietà action dell’oggetto form, quindi, il tutto è risolvibile risettando la suddetta proprietà con la url virtuale che successivamente il modulo di rewriting si occuperà di trasformare.
Per mettere in pratica questa soluzione è sufficiente :
1) creare una classe che si occupi di settare la proprietà a partire dal HtmlTextWriter della pagina :
public class RewriteFormHtmlTextWriter : HtmlTextWriter
{
private bool inForm;
private string _formAction;
public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
: base(writer)
{
}
public override void RenderBeginTag(string tagName)
{
if (tagName.ToString().IndexOf("form") >= 0)
{
base.RenderBeginTag(tagName);
}
}
public RewriteFormHtmlTextWriter(System.IO.TextWriter writer, string action)
: base(writer)
{
this._formAction = action;
}
public override void WriteAttribute(string name, string value, bool fEncode)
{
if (name == "action")
{
value = _formAction;
}
base.WriteAttribute(name, value, fEncode);
}
}
2) aggiungere alle pagine con url riscritta un override del metodo render che recuperando la variabile di contesto settata dal modulo http per il rewriting e richiami la classe per il setting della proprietà action
protected override void Render(HtmlTextWriter writer)
{
if (HttpContext.Current.Items["VirtualURL"] != null)
{
string sVirURL = HttpContext.Current.Items["VirtualURL"].ToString();
RewriteFormHtmlTextWriter oWriter = new RewriteFormHtmlTextWriter(writer, sVirURL);
base.Render(oWriter);
}
}
3) modificare il metodo begin request del HttpModule che si occupa del rewriting (riporto una parte del codice che utilizzo io, solo a scopo dimostrativo)
public void Rewrite_BeginRequest(object sender, EventArgs args)
{
string strPath = HttpContext.Current.Request.Url.AbsolutePath;
HttpContext.Current.Items["VirtualURL"] = strPath;
string strRewrite = RewriterEngine.MiaRegolaRewrite(strPath);
if (!String.IsNullOrEmpty(strRewrite))
{
HttpContext.Current.RewritePath("~" + strURL);
}
}
Questi tre passi sono sufficienti nel caso non si utilizzi un controllo all’interno di un UpdatePanel. In caso contrario si dovrà modificare la proprietà action della form con codice javascript lato client, facendo uso dell’ajax library di microsoft. Questo è necessario proprio perchè il metodo Render viene eseguito solo nel caso di postback completi sincroni, perchè non è necessario fare il rendering della pagina nel caso di partial update dovuto alla presenza di un UpdatePanel.
4) Ultimo passo è, quindi, l’inserimendo all’interno della pagina del seguente codice javascript che non fa altro che risettare le proprietà action ed initial action della form con la location corrente del browser che altro non è che la nostra url virtuale
Sys.Application.add_load(function()
{
var form = Sys.WebForms.PageRequestManager.getInstance()._form;
form._initialAction = form.action = window.location.href;
});
.NET Framework, ASP.NET | 2 Comments »
October 23rd, 2007
Utilizzando il suddetto browser con il webserver integrato in Visual Studio 2005 / 2008 è possibile notare la sostanziale lentezza nel caricamento delle pagine richiamate su localhost.
Il problema è dovuto alla risoluzione del nome host e dal sistema che firefox utilizza per gestire l’IPV6.
E’ possibile, quindi, riprodurre questo comportamento su macchine con Windows XP SP2 e stack IPV6 installato ed ovviamente su Windows Vista dove il supporto IPV6 è nativo.
Il problema è di facile risoluzione : basta disabilitare il supporto IPV6 relativamente a Firefox quando lo si utilizza per testing su localhost.
Dalla barra degli indirizzi digitare about:config per accedere alla lista parametri di configurazione del browser; individuare la chiave network.dns.disableIPv6 per cambiare il relativo valore a true.
Fonte : Fixing Firefox Slowness with localhost on Vista.
Tools, Windows | No Comments »