Songbird 1.7.3, LastFM, problemi di autenticazione: questione di casing

Era qualche settimana ormai che dal mio player preferito Songbird (IMHO una delle applicazioni meglio riuscite e anche più famose sviluppate su piattaforma Mozilla XUL) non riuscivo più ad utilizzare il mio account LastFM tramite il plugin appositamente progettato (ver. 1.0.3.1700).

A prima vista la causa era sicuramente da imputare al meccanismo di autenticazione, infatti il plugin non riusciva in alcun modo a farsi rilasciare il token di sessione per poter attivare i classici servizi di streaming e scrobbling.

Causa lavoro non avevo avuto il tempo di investigare sull’anomalia “parcheggiando” temporaneamente Songbird e tornando ad utilizzare il player standalone ufficiale di LastFM.

Oggi ho ripreso la questione ed analizzando in maniera più approfondita mi sono reso conto che il problema era dovuto banalmente ad una URL errata hardcoded nel codice Javascript del plugin.

Tecnicamente la questione è la seguente:

  1. LastFM ha da poco introdotto una API completamente basata su servizi di tipo REST, compresa la gestione dell’autenticazione;
  2. l’estensione LastFM per Songbird altro non è che un componente software scritto completamente in Javascript che tramite l’infrastruttura messa a disposizione dal core di Mozilla riesce facilmente ad interagire con interfacce di tipo REST. Tutto il codice Javascript in oggetto è contenuto nel seguente file: [user folder]\AppData\Roaming\Songbird2\Profiles\fhkljfmg.default\extensions\audioscrobbler@songbirdnest.com\components\sbLastFm.js;
  3. LastFM ha ultimamente introdotto, per problemi di security, una sorta di meccanismo di autorizzazione per le applicazioni esterne che interagiranno con i servizi REST. Il trusting è completamente gestibile dall’utente che alla prima richiesta di un software “sconosciuto” viene rediretto verso una pagina che permette di concedere o negare l’autorizzazione al software richiedente.

Tutto il meccanismo fin qui descritto è implementato dalla funzione:

   1: // authenticate against the new Last.fm "rest" web service APIs

   2: sbLastFm.prototype.apiAuth = function sbLastFm_apiAuth(onSuccess, onFailure) {

   3:   // clear our old session

   4:   this.sk = null;

   5:   Application.prefs.setValue("extensions.lastfm.session_key", "");

   6:  

   7:   // clear any web cookies we may have already

   8:   dump("web cookies cleared\n");

   9:   var cookieMgr = Cc["@mozilla.org/cookiemanager;1"]

  10:         .getService(Ci.nsICookieManager);

  11:   cookieMgr.remove(".last.fm", "Session", "/", false);

  12:   cookieMgr.remove(".last.fm", "s_cc", "/", false);

  13:   cookieMgr.remove(".last.fm", "s_sq", "/", false);

  14:   cookieMgr.remove(".last.fm", "wwwlang", "/", false);

  15:   cookieMgr.remove(".last.fm", "__qcb", "/", false);

  16:   cookieMgr.remove(".last.fm", "TREA", "/", false);

  17:   cookieMgr.remove(".last.fm", "s_nr", "/", false);

  18:   cookieMgr.remove(".last.fm", "__qca", "/", false);

  19:   cookieMgr.remove(".last.fm", "s_lastvisit", "/", false);

  20:   cookieMgr.remove(".last.fm", "LastUser", "/", false);

  21:   cookieMgr.remove(".last.fm", "AnonTrack", "/", false);

  22:   cookieMgr.remove(".last.fm", "fastq", "/", false);

  23:  

  24:   // get a lastfm desktop session

  25:   var self = this;

  26:     this.webLogin(function success() {

  27:         dump("webLogin SUCCESS\n");

  28:  

  29:     self.login_phase = AUTH_PHASE_TOKEN_REQUEST;

  30:     self._token_xhr = self.apiCall('auth.getToken', { },

  31:       function response(success, xml, xmlText) {

  32:         if (!success) {

  33:           dump("auth.getToken: FAILED TO AUTHENTICATE: " + xmlText + "\n\n");

  34:           return;

  35:         }

  36:  

  37:         var authtoken = xml.getElementsByTagName('token');

  38:         if (authtoken.length != 1) {

  39:           dump("auth.getToken: FAILED TO FIND TOKEN: " + xmlText + "\n\n");

  40:           return;

  41:         }

  42:         authtoken = authtoken[0].textContent;

  43:         dump("auth.getToken SUCCESS: " + authtoken + "\n");

  44:  

  45:         var window = Cc['@mozilla.org/appshell/window-mediator;1']

  46:                        .getService(Ci.nsIWindowMediator)

  47:                        .getMostRecentWindow('Songbird:Main');

  48:         if (!window) {

  49:           self.listeners.each(function(listener) {

  50:             listener.onLoginFailed();

  51:           });

  52:           return;

  53:         }

  54:         var gBrowser = window.gBrowser;

  55:  

  56:         function removeAuthListeners() {

  57:           gBrowser.removeEventListener("DOMContentLoaded",

  58:                                        self._authListener, false);

  59:           gBrowser.removeEventListener("unload", removeAuthListeners, false);

  60:           authTab.removeEventListener("TabClose",

  61:                                       self._authTabCloseListener, false);

  62:         }

  63:  

  64:         // Create a listener for last.fm's authorization grant page.

  65:         self._authListener = function (e) {

  66:  

  67:           // Ensure we are on the right tab.

  68:           if (gBrowser.getBrowserForDocument(e.target) !=

  69:               gBrowser.getBrowserForTab(authTab)) {

  70:             return;

  71:           }

  72:   

  73:           // We're listening for the LastFM "Permissions Granted" page. It will

  74:           // have pathname "/api/grantAccess" on the last.fm domain or a

  75:           // localized version such as lastfm.fr

  76:           var loc = e.target.location;

  77:           if (!/last\.?fm/.test(loc.host)) {

  78:             // If we get here, it implies that the user navigated away from

  79:             // LastFM without authorizing.

  80:             removeAuthListeners();

  81:             self.listeners.each(function(listener) {

  82:               listener.onLoginFailed();

  83:             });

  84:             return;

  85:           }

  86:  

  87:           if (loc.pathname != "/api/grantaccess") {

  88:             // Ignore LastFM pages that aren't the "Permissions Granted" page.

  89:             return;

  90:           } 

  91:  

  92:           // We should be on the grantAccess page now, so remove the listeners

  93:           // and try to grab a session key.

  94:           removeAuthListeners();

  95:  

  96:           self.login_phase = AUTH_PHASE_SESSION_REQUEST;

  97:           self._session_xhr = self.apiCall('auth.getSession', {

  98:               token: authtoken

  99:             },

 100:             function response(success, xml, xmlText) {

 101:               if (!success) {

 102:                 dump("auth.getSession: FAILED TO AUTHENTICATE: " +

 103:                   xmlText + "\n\n");

 104:                 return;

 105:               }

 106:               var keys = xml.getElementsByTagName("key");

 107:               if (keys.length != 1) {

 108:                 dump("auth.getSession: FAILED TO AUTH. TOKEN: " +

 109:                   xmlText + "\n\n");

 110:                 return;

 111:               }

 112:               self.sk = keys[0].textContent;

 113:               dump("auth.getSession: AUTHENTICATED\n");

 114:               dump("session key: " + self.sk + "\n");

 115:               Application.prefs.setValue('extensions.lastfm.session_key',

 116:                 self.sk);

 117:               var subscribers = xml.getElementsByTagName("subscriber");

 118:               if (subscribers.length == 1)

 119:                 self._subscriber = (subscribers[0].textContent == "1");

 120:               if (Application.prefs.getValue(

 121:                     "extensions.lastfm.subscriber_override", false))

 122:                 self._subscriber = true;

 123:               dump("subscriber: " + self._subscriber + "\n");

 124:               self.listeners.each(function(l) {

 125:                 l.onAuthorisationSuccess();

 126:               });

 127:  

 128:               if (typeof(onSuccess) == "function")

 129:                 onSuccess();

 130:           });

 131:         } 

 132:  

 133:         // Load the user authorization page.

 134:         var authURL = "http://" + self.geoBaseDomain + "/api/auth?api_key=" +

 135:                       API_KEY + "&token=" + authtoken;

 136:  

 137:         gBrowser.addEventListener("DOMContentLoaded", self._authListener, false);

 138:         // Make sure we don't leak the listeners if the user takes no action.

 139:         gBrowser.addEventListener("unload", removeAuthListeners, false); 

 140:  

 141:         var authTab = gBrowser.loadOneTab(authURL, null, null, null, false);

 142:       

 143:         // The user could close the auth page tab without granting permission.

 144:         self._authTabCloseListener = function(e) {

 145:           removeAuthListeners();

 146:           self.listeners.each(function(listener) {

 147:             listener.onLoginFailed();

 148:           });

 149:         }

 150:         

 151:         authTab.addEventListener("TabClose", self._authTabCloseListener, false);

 152:  

 153:     }, function failure() {   // auth.getToken failure

 154:       dump("webLogin FAILED\n");

 155:       self.listeners.each(function(listener) {

 156:         listener.onLoginFailed();

 157:       });

 158:     }); // auth.getToken api call

 159:   }, function() {

 160:     dump("weblogin FAILURE\n");

 161:     self.listeners.each(function(listener) {

 162:       listener.onLoginFailed();

 163:     });

 164:   }); // weblogin

 165: }

ed in particolare il punto 3 viene gestito tramite la funzione di callback ad evento settata alla riga 65.

Dalla riga 87 alla 90, nella funzione di callback sopra citata, viene fatto un controllo al fine di ignorare tutte le pagine-URL diverse da quella che LastFM usa per permettere all’utente di settare la grant per la propria “external application”:

   1: if (loc.pathname != "/api/grantAccess") {

   2:             // Ignore LastFM pages that aren't the "Permissions Granted" page.

   3:             return;

   4:} 

Siccome avevo notato che la funzione di callback usciva sempre in quel punto ho provato via browser la URL testata su loc.pathname per controllare se restituisse correttamente un status HTTP 200: ebbene ho scoperto che il motore di routing-rewriting usato da LastFM essendo case sensitive alla URL http://www.lastfm.it/api/grantAccess mi restituiva un bel HTTP 404 (pagina non trovata) mentre puntando ad http://www.lastfm.it/api/grantaccess ritornava correttamente la pagina di trusting applicativo.

Alla luce della scoperta mi è bastato sostituire “api/grantAccess” con “api/grantaccess” (riga 1399 del file sbLastFm.js) che il mio Songbird ha ripreso a “dialogare allegramente” con lo strepitoso servizio di LastFM.

Successivamente, facendo qualche ricerca su Google, ho scoperto che il problema era già stato fixato sul trunk del plugin per la versione 1.8.0 di Songbird (attualmente in beta 3 e quindi non ancora disponibile dalla pagina di download principale http://www.getsongbird.com)

… insomma questione di casing

Technorati Tags: ,,

, , , ,

1 Commento

Opera 10.50 si aggiorna

In quel di Oslo hanno appena reso disponibile tramite repository per l’aggiornamento automatico la versione 10.51 del noto browser che sistema due problemi di vulnerabilità di cui uno abbastanza grave, legato al Content-Length header, del quale avevo accennato nel precedente post.

La nuova versione introduce alcune migliorie sistemando alcuni bugs, segnalati dai feedback degli utenti, relativi alla UI, engine di esecuzione Javascript e funzionalità di rete.

Che dire : l’acid test v3 100/100 e il SunSpider Test, la velocità di esecuzione grazie a Presto, Carakan e Vega, funzionalità come i widgets OOB, il supporto nativo ad HTML5, fanno di questo browser un degno competitor dei WebKit based (i fratelli chrome e safari).

Per quanto riguarda il browser di BigM, non rimane che aspettare IE9 visto che con la V8 non c’è partita.

Acid3 Test :

Acid Test 3image

Il SunSpider Test (velocità di esecuzione del codice Javascript).

FROM = MS Internet Explorer 8.0.7600

TO = Opera 10.51

SunSpider Test

… un altro pianeta

Nessun commento

Opera "Content-Length" Processing Buffer Overflow Vulnerability – Advisories

A quanto pare la nuova versione del browser norvegese (10.50, ma in generale 10.X) sarebbe affetta da una vulnerabilità, scoperta da Marcin Ressel, che permetterebbe ad un sito “untrusted” di eseguire del codice malevolo grazie ad un exploit causato dalla non corretta gestione della response HTTP a particolari request assemblate ad hoc e contenenti header “Content-Length” a 64bit.

Opera Software, in queste ultime ore, ha cercato di mitigare il problema (http://www.theregister.co.uk/2010/03/05/opera_vulnerability/) rispondendo che da una analisi effettuata risulterebbe difficilissimo o praticamente impossibile eseguire del codice jittato dinamicamente in memoria grazie alla funzionalità DEP dei sistemi operativi Windows.

Il problema però è che DEP non è abilitato di default su WinXP e Vista; inoltre molti utenti decidono di disabilitarlo perchè in alcuni scenari l’overhead di DEP non è certo trascurabile.

Il mio consiglio è comunque di tenere sempre abilitati UAC e DEP, sfruttando dove è necessario la possibilità di escludere un singolo o un gruppo di eseguibili dal monitoraggio.

Opera "Content-Length" Processing Buffer Overflow Vulnerability – Advisories – Community

, , , , , , ,

Nessun commento

Microsoft acquisisce Teamprise da SourceGear

Apprendo questa notizia bomba dal blog di Brian Harry.

Era ormai qualche anno che il team di Microsoft lavorava con gli sviluppatori di SourceGear per rendere il prodotto Teamprise sempre “più simile” al TeamExplorer di Visual Studio; finalmente integrando tutto in un’unica soluzione la suite di BigM coprirà buona parte di tutte le necessità di ALM in ambienti di sviluppi tecnologicamente eterogenei

Teamprise sarà integrato nella product-line di Visual Studio 2010 ed includerà:

  • Teamprise plugin for Eclipse: bugtracking, source control management, gestione build, reporting etc. direttamente da Eclipse e in tutti gli altri IDE basati su quest ultimo (JBoss, BEA Workshop, Rational Application Developer .. per gli amici RAD, Adobe Flex Bulder, APTANA Studio etc.);
  • Teamprise Explorer: tutte le funzionalità incluse nel plug-in per Eclipse potranno essere utilizzate anche tramite questo software stand-alone, perfetto quindi per i componenti del team non strettamente legati allo sviluppo (graphic designer, quality assurance testers e project managers);
  • Teamprise Command-Line Client: un’interfaccia non grafica, cross-platform per interfacciarsi al Team Foundation Server, perfetta per lo scripting e per gli scenari di build.

Il “trittico” potrà essere acquistato separatamente (si parla di ~700$USD) e sarà disponinbile per tutti i subscriber MSDN e tutti quelli che acquisteranno Visual Studio 2010 Ultimate.

Per approfondimenti :

, , , ,

Nessun commento

Microsoft BizSpark un “aiuto” per le startups

Torno a bloggare dopo un lungo periodo di stand-by dovuto a vari impegni (avrei “in canna” tanti  posts interessanti, ma nonostante passi ore e ore per lavoro difronte ad un PC il tempo per aprire WLW e buttare giù il post è veramente poco).

Veniamo alla news che ritengo veramente una “chicca”.

Apprendo, leggendo il blog di Soma (S. Soma Somasgear – Responsabile di tutto il settore sviluppo di MS), del programma Microsfot BizSpark destinato alle startup companies di tutto il mondo.

Si tratta, praticamente, di un programma di parterniship che permette alle aziende “accettate” di usufruire per i primi 3 anni di attività di tutto il “parco” software Microsoft, del supporto e della visibilità pubblicitaria offerta da BizSpark stesso, senza alcun costo di up-front, semplicemente una fee di uscita di 100$ USD.

L’elenco del materiale a cui è possibile accedere gratis è veramente “succulento” :

  • Tutto il software standard di una subscription VSTS – MSDN Premium;
  • Expression Studio;
  • VSTS Team Foundation Server Standard Edition;

I requisiti che le aziende dovrebbe rispettare sono i seguenti :

  • Core business basato principalmente sullo sviluppo di prodotti software pacchettizzati o SaS;
  • La proprietà dell’azienda deve essere privata;
  • Costituita da meno di 3 anni;
  • Revenue annuale generato < di $1 Milione USD ( in realtà questo valore differisce per gruppi di nazioni, ad. es. il revenue per  Egitto, Turchia, Vietnam è fissato a $250K USD)

Inoltre, se i proditti, progettati e sviluppati durante il periodo di partecipazione al programma, saranno venduti come servizi (SaS) in modalità ASP, BizSpark permette di usufruire, sempre gratuitamente, dell’infrastruttura software necessaria all’ambiente di produzione :

  • Windows Server (tutte le edizioni, anche Enterprise);
  • SQL Server;
  • Sharepoint Portal Server;
  • System Center;
  • BizTalk Server;
  • Dynamics CRM;
  • Windows Azure Service Platform;

Interessante, come accennavo prima, anche la questione della visibilità. Tramite BizSpark DB le startups hanno l’opportunità di mostrare il proprio expertise e il proprio portfolio a potenziali investitori, partners e clienti anche grazie all’aiuto delle “recensioni” che BigM farà sul sito MicrosoftStartupZone.com.

Un esempio di startup che ha avuto accesso a BizSpark, riportata anche da Soma, è “After-Mouse.com”, azienda francese nata per lo sviluppo di soluzioni WPF \ Silverlight  che fanno uso della piattaforma Microsoft Surface.

E’ possibile reperire maggiori infos direttamente sul website ufficiale di BizSpark (http://www.microsoftstartupzone.com/BizSpark).

1 Commento

Piccoli developers crescono … con Microsoft SmallBasic

I miei primi passi da dev li ho fatti utilizzando il mitico Turbo Pascal di Borland (che strano dopo tutti questi anni mi ritrovo ancora a lavorare con strumenti progettati da Anders Hejlsberg, sarà un caso?? ;) . Successivamente mi buttai rapidamente a capofitto su C/C++ scrivendo videogiochi (piccoli shotemup 2D) utilizzando la lib Allegro (ancora in pieno sviluppo) su compilatori come Cygwin (uno dei porting di gcc su windows) e Watcom C++ (bei tempi quelli dell’extender a 32 bit DOS4GW ;) )

Al giorno d’oggi avvicinare i bambini allo sviluppo software è diventata una pratica molto semplice grazie alla miriade di linguaggi e di strumenti dedicati. Ultimo ritrovato è Microsoft SmallBasic, un progetto dei DevLabs di BigM che fornisce un linguaggio semplice, basato su BASIC, con a supporto un IDE userfriendly dove non mancano funzionalità apprezzate anche dai “grandi” come l’Intellisense e l’instant context sensitive help, il tutto ovviamente con pieno supporto al .NET Framework.

Il linguaggio, completamente imperativo, conta appena 15 keywords, abbastanza per approcciare ai concetti base di qualsiasi linguaggio (statement condizionali, loops, etc.).

image

Il semplice ambiente di sviluppo è composto essenzialmente dalla Toolbar (2) , l’Editor (1) e la Surface Area (3) mentre l’Intellisense sfrutta anche esso l’interfaccia basata su ribbon.

image

Maggiori info sono disponibili nel documento di “getting starting guide” scaricabile dal sito ufficiale dedicato al progetto.

Nessun commento

Utilizzare Visual Studio 2005 con Team Foundation Server 2008

Al momento dell’implementazione di un’infrastruttura di gestione dello sviluppo software basata su Team Foundation Server 2008 ci si scontra sempre con la questione di gestire il cosiddetto “backlog” che in questo caso altro non sono che progetti realizzati con Visual Studio 2005. Ovviamente siccome non è sempre possibile convertire le solutions VS2005 in formato VS2008 a causa di varie problematiche, soprattuto di tipo organizzativo, nasce la necessità di utilizzare l’IDE in versione 2005 con la nuova versione del server. Microsoft si è sforzata di rendere il più possibile compatibile Team Explorer 2005 con il nuovo TFS, a patto comunque di installare qualche patch. La procedura è molto semplice :

1) installare Team Explorer 2005 per aggiungere le funzionalità client (aprire progetti su TFS, crearne di nuovi, etc);

NB : creando un nuovo progetto su TFS da Team Explorer 2005 si ottiene come risultato l’errore “TF30170 : The plugin Microsoft.ProjectCreationWizard.Portal failed during task SharePointPortal from group Portal”. Questa anomalia è dovuta al fatto che Team Exploref 2005 non è compatibile con Windows Sharepoint Services v3.0 proprio perchè TFS 2005 usava la versione 2.0 (maggiori info sul blog di uno dei program manger di VS Brian Harry). Tuttavia Microsoft, come indicato nel post di Brian, tempo fa ha rilasciato una patch per la risoluzione di questa anomalia;

2) applicare la patch KB932544 (download) per risolvere la problematica descritta sopra;

3) reinstallare VS 2005 SP1. L’installazione della patch 932544 riporta l’assembly Microsoft.VisualStudio.teamfoundation.teamexplorer.dll ad una versione precedente alla 8.0.50727.762 necessaria invece per l’interazione con WSS 3.0. Di conseguenza andrà riapplicato SP1 per allinearsi con l’ultima release di Microsoft;

Nessun commento

Mouse wheel e Visual Basic 6

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

Nessun commento

Windows Live standalone installer

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.

Nessun commento

Visual Studio 2008 – Resharper 4.0 : Failed to load supplementary package

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).

Nessun commento