[Umbraco] umbraco.DataLayer.SqlHelperException not marked as Serializable


Visto che, ultimamente, la maggior parte dei miei Weekly (Daily? Hourly?) Issue sono dovuti principalmente a questo CMS, ho deciso di creare una sezione apposta :)

Iniziamo con uno degli errori più comuni che mi sono capitati in questi ultimi giorni: non si sa per quale motivo, l’applicativo in produzione ha iniziato a crashare prima ancora di avviarsi, tirandosi dietro tutto il W3WP.exe. L’errore, abbastnza criptico, era:

Type 'umbraco.DataLayer.SqlHelperException' in Assembly 'umbraco.DataLayer, Version=0.3.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

Dopo parecchi giri, discussioni via MSN con alcune persone del core team, e ricerche dovunque, si è scoperto che questo problema è dovuto ad una stringa di connessione sbagliata.
Lo so, è abbastanza ridicolo, e non ho ancora controllato i meccanismi di base per cui una stringa di connessione possa far crashare tutto l’applicativo invece di notificare l’errore. Ma vi assicuro che è assolutamente quello il problema: controllate bene il server, la password, qualsiasi problema di spelling o di mancanze (nel mio caso, lo script nant si era “mangiato” la keyword “Data Source”….).

author: Alessandro Ghizzardi | posted @ martedì 9 febbraio 2010 17.25 | Feedback (0)

[Weekly Issue] Pre/Post build Events, la sintassi


Mi capita spessissimo di lavorare con i Build Events sulle solution, soprattutto usando Umbraco (seguiranno infatti una serie di post su questo CMS. Che è il motivo principale per cui sono sparito in questi mesi :)).

Il problema principale che ho avuto è trovare una vera reference della sintassi. Le macro ci sono quasi tutte, ma spesso non si sa bene che cosa si può fare e che cosa no. Girando un pò, sul sito msdn si spiega che la sintassi dei Pre/Post build event in realtà è la medesima dei “vecchi” comandi MS-DOS. Quindi, potete agilmente trovare la reference sul sito technet. Probabilmente molti lo sapevano già, ma a me ha salvato un pò di ricerche inutili :)

author: Alessandro Ghizzardi | posted @ martedì 9 febbraio 2010 12.07 | Feedback (0)

[Weekly Issue] Leggere dati binari con WebRequest


Capita, ogni tanto, di avere a che fare con la lettura di dati da server remoti. In questi casi, HttpWebRequest ci viene in contro, fornendoci tutti gli strumenti necessari.

Finché si tratta di pagine web, ci sono pochi problemi. Abbiamo qualche piccolo pensieri in più, invece, quando si tratta di dati binari: spesso e volentieri, il risultato appare incompleto. Per esempio, le immagini vengono restituite con un bel po' di byte persi qua e là. Questo perché, se è vero che nel leggere stringhe basta utilizzare il consueto ReadToEnd, per leggere dati binari conviene sempre utilizzare il meccanismo del buffer, ossia leggere un pezzo per volta.

   1:   
   2:  byte[] output;
   3:   
   4:  WebRequest request = WebRequest.Create(url);
   5:  using(WebResponse response = request.GetResponse())
   6:  {
   7:     using(Stream rs= response.GetResponseStream())
   8:     {
   9:        using(MemoryStream ms= new MemoryStream())
  10:        {
  11:           int count = 0;
  12:           byte[] buffer = new byte[4096];
  13:           do
  14:           {
  15:              count = rs.Read(buffer, 0, buffer.Length);
  16:              ms.Write(buffer, 0, count);
  17:   
  18:           } while(count != 0);
  19:   
  20:           output= ms.ToArray();
  21:        }
  22:     }
  23:  }
 

In questo modo siamo sicuri di riuscire a leggere tutto il contenuto binario, senza perderci dati per strada. L’ideale è, chiaramente, fare un metodo helper che si occupi di tutto!

author: Alessandro Ghizzardi | posted @ lunedì 5 ottobre 2009 9.24 | Feedback (1)

Back in black


No, non vuol dire che mi sono venute manie strane riguardo al metal in genere…

Semplicemente, sto cercando di prendere maschera e boccaglio e di riemergere dall’apnea communitaria che mi ha contraddistinto in questi mesi… chi mi conosce sa che sono “periodico” da questo punto di vista. Tutto sta a vedere quanto gli impegni lavorativi mi permetteranno di stare fuori dall’acqua! Se non altro, non ho libri in progetto per questo periodo, quindi speriamo bene!

A presto con nuovi issue :)

author: Alessandro Ghizzardi | posted @ domenica 4 ottobre 2009 16.26 | Feedback (0)

Esempi libro ASP.NET 3.5 - Guida allo sviluppo


Chiunque avesse acquistato il mio ultimo libro, probabilmente avrà qualche problema a trovare gli esempi in rete. A lungo andare, questi saranno presenti sul sito dell'editore, nella scheda del libro. Nel frattempo, potete scaricarli direttamente a questo link.

author: Alessandro Ghizzardi | posted @ martedì 12 maggio 2009 11.17 | Feedback (0)

[Weekly Issue] Verificare il supporto per Hyper-V prima dell’installazione


Hyper-V è probabilmente il modo migliore per mettere in piedi un’architettura virtualizzata con relativamente poco sforzo, ed una grande efficenza.

Potrebbe però rivelarsi comodo avere la sicurezza che il nostro hardware supporti la virtualizzazione hardware, senza dover andare a controllare nel bios della macchina, soprattutto se questa è già installata e funzionante e si vuole “aggiornarla”.

Fortunatamente, sia Intel che AMD mettono a disposizione due comode utility per controllare le caratteristiche salienti del processore, tra cui anche la possibilità di avere la virtualizzazione hardware.

Se avete un processore Intel potete scaricare il Processor Identification Utility qui, altrimenti potete scaricare qui l’AMD System Compatibility Check.

author: Alessandro Ghizzardi | posted @ giovedì 16 aprile 2009 12.01 | Feedback (1)

[OT] Roma & WPF


Approfitto dell’arrivo in aereoporto in scandaloso anticipo, per lasciare un segno sul Blog che, malgrado i miei precedenti post, continua a rimanere vuoto. Purtroppo il periodo lavorativo continua ad essere denso di impegni, e quei pochi giorni che potrei avere liberi vengono (sigh) riempiti da trasferte come questa, dove sposterò le mie stanche membra a Roma per una tre giorni di WPF. Lo schedule si preannuncia denso, ma se non altro avrò l’occasione di stare a Roma per più di un giorno, contrariamente a quanto mi succede di solito. Chissà mai che riesca, una volta tanto, a vederla di sera, e poter effettivamente decidere se è meglio Roma, o Milano :)

author: Alessandro Ghizzardi | posted @ lunedì 23 marzo 2009 6.49 | Feedback (1)

[OT] Cosa mi sono perso…


Questi ultimi mesi sono stati … “complicati” per me. E’ da Gennaio che non posto nulla, ed è da allora (chi mi conosce lo sa) che mi sono fatto negare in ogni modo possibile. Ho avuto tanti “community black out”, ma questo devo dire che è stato davvero il peggiore. Ovviamente, motivi lavorativi, la mia dannata attitudine a dire sempre “si”, anche quando non mi potrei permettere di farlo. Questo giro, mi hanno fatto perdere parecchie cose a cui tenevo molto:

- Birre e cene con gli amici. Sono due mesi che praticametne faccio vita monastica, in ufficio giorno e notte

- L’MVP Global Summit, un evento indimenticabile, che mi ha lasciato tanti bei ricordi dall’anno scorso, così come tanta amarezza quest’anno per averlo perso, insieme a tutte le cene community organizzate prima di questo

- Sciare. Anche quest’anno, con tutta la neve che è scesa, mi sono perso le piste. Non sono, davvero, riuscito a trovare un week end libero per distrarmi su due piccoli bastoncini di legno glassati di sciolina. Ed il mio proposito dell’anno scorso, cioè di prendermi sempre almeno un week end l’anno per farlo, è andato a donne di facili costumi.

- Sonno. Ne ho perso tanto, ma davvero tanto, ed ho bisogno di recuperare. Già con oggi ho fatto un enorme passo avanti!

- Blog e Community: entrambi mi hanno visto come “grande assente” quasi ingiustificato.

 

Che cosa ho guadagnato invece in questi mesi?

- Un sacco di soddisfazioni, lavorative ovviamente, e la conferma della mia capacità di non perdere la testa in situazioni di crisi

- Un nuovo libro, su ASP.NET3.5: una mia scommessa editoriale sullo scrivere un libro “diverso” dal solito, non zeppo di ogni singolo elemento esposto dal Framework ma tanti, tanti consigli su cosa, del Framework, può essere veramente utile e su come usarlo al meglio. Insomma, 450 pagine della mia vita lavorativa e di community messe nero su bianco. Spero, sinceramente, di averla vinta!

Questo black out prolungato mi ha convinto, forse (spero), ad aumentare la mia soglia del “si”, perchè mi ha fatto davvero capire che il lavoro, quando ti piace, può intromettersi nella tua vita ad un livello inimmaginabile. Spero davvero che questo sia un punto d’inizio per una vita lavorativa più bilanciata… e per il ritorno dei miei “famosi” Issue :P

author: Alessandro Ghizzardi | posted @ domenica 15 marzo 2009 18.17 | Feedback (6)

[Weekly Issue] LinQ + Extension Methods = Evviva ASP.NET 3.5!


L'ultimo problemuccio che ho avuto era legato ad un array di interi.

Avevo la necessità di selezionare l'intero più alto tra quelli inseriti nell'array. Se qualche riga di ciclo for vi sembra troppa, allora probabilmente siete come me: per questo mi sono lanciato su una soluzione basata su Linq. Ebbro di gioia, ho scoperto presto che gli array di interi espongono un extension method "Max()" che fa esattamente quello che serve a me!

Quindi, se vi servisse, basta fare

   1: int maxInteger = intArray.Max();

e il gioco è fatto! Meglio di così.... :)

edit: mi fanno notare che gli extension methods e LinQ non appartengono ad ASP.NET 3.5. Per quanto questo sia verissimo (si sa che Extension e Linq sono stati introdotti col framework 3.0), in realtà è anche vero che appartengono ad ASP.NET 3.5, in quanto questa è la prima tecnologia, in ambito web, che consente di utilizzarli! Così evito fraintendimenti futuri ;)

author: Alessandro Ghizzardi | posted @ mercoledì 28 gennaio 2009 15.29 | Feedback (8)

[Weekly Issue] HTML Entities List


L'html è un linguaggio semplice, veloce... magari un pò troppo. Molte persone si dimenticano che il mondo non è fatto solo di italiano o inglese, e tendono a sfruttare le proprie lettere dimenticandosi che, per i caratteri accentati o speciali, è sempre meglio utilizzare le Entity.

Le entities sono codifiche speciali introdotte in HTML per rappresentare determinati caratteri indipendentemente dall'encoding, dalla tastiera e dal sistema operativo del client. Il rischio che si corre, non utilizzando queste codifiche, è di fare in modo che determinati utenti non vedano bene il sito, con quadratini o faccine al posto dei caratteri speciali.

Cero, qualcuno può sempre dire che se qualcuno entra nel mio ecommerce italiano dal giappone, ste cose se le va a cercare. Ma se un italiano che è in giappone vuole vederlo? O se una multinazionale impone ai propri client una codebase unica che per sfortuna non corrisponde alla nostra?

Insomma.. usatele... sempre e comunque. Non ve le ricordate tutte? Basta un bookmark su questa pagina: così non avrete più scuse :)

author: Alessandro Ghizzardi | posted @ lunedì 26 gennaio 2009 14.05 | Feedback (2)

[Weekly Issue] IPhone development e Application Verification Failed (0xE800003A o 0xE8000001)


La mia prima applicazione per IPhone consiste in un bottone, con una textbox ed una label, che sostituisce dei valori al cambiare della textbox.

Ovviamente, terribilmente semplice. Mi ha sconvolto, comunque,  la difficoltà e la conoscenza necessarie per portare a termine un'azione così semplice. L'intellisense di XCode non aiuta, anzi, porta fuori strada! La documentazione Apple è lacunosa in molti punti e da troppe cose per scontato (sembra che sia stata scritta da persone con livelli tecnici terribilmente differenti e senza una eccessiva supervisione... il documento prima ti spiegano come funzionano i commenti, quello dopo parte dal presupposto che tu sappia come gestire i delegate senza problemi). Alcuni webcast in giro sono molto utili ma... purtroppo... la maggior parte sono fatti coi piedi (e che nessuno si lamenti più dei Webcast MS o attirerà le mie ire!! :P)

Uno dei problemi maggiori che abbiamo avuto è relativo all'Application Verification Failed quando si cerca di pubblicare il proprio "lavoro" sull'iphone invece che usare il simulatore.

Questa cosa ci ha fatto impazzire (e l'ora del post lo conferma....). I principali problemi che ho riscontrato sono

1: In un applicativo creato da se, di solito manca il BundleId

2: In un applicativo di terze parti, i target sono compilati con dei valori non consistenti o cablati sulla macchina di origine che, ovviamente, non è la nostra.

Nel primo caso, date un occhio a questo fantastico post per avere una panoramica completa di come fare. Nel secondo caso, ricordatevi ogni volta che provate a partire da un progetto di terze parti come canovaccio, di utilizzare "Clean all targets" dal menu "Build" per evitare che ci siano interferenze (grazie a Francesco che ha scoperto l'inghippo in questo post)

author: Alessandro Ghizzardi | posted @ domenica 25 gennaio 2009 5.35 | Feedback (2)

[Weekly Issue] Aggiungere utenti a Team System Workgroup edition... senza dominio!


Tempo fa avevo raccontato alcune peripezie per installare un TFS Workgroup edition da smandruppare con i test.

Dopo qualche mese di utilizzo, devo dire che sono rimasto molto soddisfatto del funzionamento: dopo le ultime esperienze con SVN e TeamCity, posso dire che sicuramente TeamSystem è un bel passo avanti, sia per la facilità nella configurazione della Continuous Integration, i tool di merging già integrati, e via dicendo. Purtroppo, il costo è ancora irraggiungibile per una struttura come la mia, e le difficoltà di installazione sono comunque notevoli anche nella versione 2008 che è decisamente migliorata rispetto alla 2005. In sostanza, credo che rimarrò con SVN+TeamCity per la condivisione dei progetti con più utenti (anche su web via HTTP, usando Visual SVN è quasi un gioco da ragazzi) e usero TeamSystem per i progetti interni dove il limite di 5 persone non pesa più di tanto.

Una cosa che ho notato, è che la modalità di amministrazione integrata in Visual Studio è assolutamente inutile se non si è dentro ad un dominio... perchè se devo aggiungere un utente, devo aggiungerlo come utente della macchina su cui risiede TeamSystem... purtroppo, a meno di non installare un visual studio su tale macchina, non ho trovato un modo per connettermi al repository utenti remoto, se non è in dominio, ed aggiungerlo.

Quindi, bisogna rimboccarsi le maniche e piantare giù due bei comandi da prompt, per aggiungere un utente e renderlo operativo. Lo strumento da utilizzare è "tfssecurity.exe" e si trova sotto "%program files%\Microsoft Visual Studio 2008 Team Foundation Server\Tools".

Dopo essersi assicurati di aver fatto login sulla macchina come amministratore di TFS (e NON come amministratore della macchina... altrimenti vi risponderà picche) bisogna assicurarsi di aggiungere l'utente sotto il gruppo dei Licensed Users:

tfssecurity  /server:petrus /g+ "[server]\Team Foundation Licensed Users" n:"PETRUS\Nome Cognome"

Ovviamente, il mio server TFS si chiama petrus, e l'utente Nome Cognome è per forza aggiunto agli utenti locali della macchina, non avendo un dominio di appoggio.

Fatto questo, posso aggiungerlo ad ogni progetto con il grado di permission che voglio:

tfssecurity  /server:petrus /g+ "[TestProjectRoot]\Project Administrators" n:"PETRUS\Nome Cognome"

In questo caso ho aggiunto l'utente "Nome Cognome" al progetto "TestProjectRoot" come amministratore. A questo punto, lo vedo tranquillamente anche dal TeamExplorer locale e posso decidere di cambiare o modificare le permission senza toccare la riga di comando!

author: Alessandro Ghizzardi | posted @ giovedì 22 gennaio 2009 17.24 | Feedback (0)

[Weekly Issue] Remoting e configurazione


Ricominciamo un pò con i weekly issue ... :)

Ultimamente sto lavorando molto con remoting, di cui apprezzo la potenza e la flessibilità in applicazioni distribuite .NET rispetto ai web services. L'unica spina nel fianco è sempre stata la configurazione che, sebbene con 3.5 presenti dei messaggi di errore un tantino più amichevoli di quando ci lavoravo con 1.1, mantiene una sorta di aspetto oscuro tipo "magia nera".

Uno dei bisogni che avevo in una delle ultime applicazioni che ho fatto, era mantenere nello stesso applicativo winform una configurazione "client" o "server a seconda dell'utente scelto. Gli approcci che si trovano in giro sono tendenzialmente due:

1: "annegare" la configurazione remoting nel file di configurazione principale. Questo è comodo se si hanno due applicazioni distinte, ma scomodo in caso di una sola applicazione che "cambia faccia" a seconda di chi la usa (comporta cambiare il file di configurazione a mano o con direttive di post compilazione per differenziare i rilasci

2: Effettuare la configurazione di remoting in maniera programmatica. Molto più comodo, ma comporta comunque annegare un sacco di chiavi nel file di configurazione per evita che se cambia l'indirizzo dell'host bisogna ricompilare il progetto.

Una soluzione comoda, non molto "pubblicizzata", è creare invece due file .config, server.config e client.config con dentro solo la configurazione di remoting, configurare questi file come "copy if newer" in modo che siano copiati nella bin insieme all'eseguibile e caricare l'uno o l'altro a seconda della tipologia che mi serve con una semplice istruzione:

string configurationFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Client.config");
FileInfo configurationFile = new FileInfo(configurationFilePath); 
RemotingConfiguration.Configure(configurationFile.Name, false);

In questo modo ottengo l'effetto di poter comunque configurare programmaticamente remoting, senza perdere la comodità di usare i file di configurazione xml!

author: Alessandro Ghizzardi | posted @ martedì 20 gennaio 2009 15.31 | Feedback (2)

Dove sono finito - Take II


Credo di non aver mai scritto tanti post del tipo "dove sono finito" come in questi ultimi mesi :)

Il mio blog langue, la mia presenza sui NG pure... le mie risposte alle email non lavorative beh... anche :)

Quindi, cosa ho fatto in questo periodo? Beh... facciamo una lista....

- Ho decuplicato i miei clienti, e questo ha portato ad una mole di lavoro da completare per me e per la mia società difficilmente integrabile con le canoniche otto ore di sonno. Quindi ho preso la decisione di evitare di sprecare tutte quelle ore, dormirne solo quattro, e lavorare per le restanti venti. Questo oltre ad aver quasi azzerato la mia vita sociale, ha anche azzerato quella telematica :P

- Sto scrivendo il mio secondo libro, stavolta su ASP.NET, preso da una visione più "pratica" di quelli classici. Il primo, che parla di sviluppo dei Sidebar Gadget, sta andando bene ed è appena sbarcato all'estero... il che è curioso visto che è scritto interamente in italiano... probabilmente c'è una tale penuria di libri sui gadget che tutto fa brodo :)

- Sono passato al lato oscuro... che non significa che ho iniziato ad annusare Java, ma che mi sto sollazzando con applicativi IPhone, applicativi Facebook, e tutte quelle cose trendy che mi portano lontano dai miei soliti applicativi finanziari... finalmente....

Già il solo fatto che sto scrivendo qui è un buon segno, vuol dire che ho almeno una mattina libera ogni tanto per buttare qualche pensiero qui sopra... speriamo di riuscire a tornare a farlo piu spesso! :)

author: Alessandro Ghizzardi | posted @ lunedì 19 gennaio 2009 9.38 | Feedback (3)

[Weekly Issue] TFS e Shaerpoint Services: finalmente è finita...


E' finita la mia odissea con TFS. Da stanotte, o meglio da poco fa, sono (s)fortunato possessore di uno splendido TFS Workgroup Edition da distruggere per i test, con tanto di MyForsWorkspace creato ... spero che nel caso debba fare l'upgrade a Standard sia solo una questione di licenza e non debba toccare null'altro :P

Stanotte, preso dallo sconforto e probabilmente dal sonno, ho superato l'ultimo scoglio riusciendo ad installare i maledettissimi Sharepoint Services. Questo perchè, leggendo l'installazione, mi sono illuso che questi venissero installati in automatico dall'installazione di TFS. O almeno, così era scritto. Invece, leggendo le postille, si legge che se uso Windows Server 2008, non posso utilizzare la funzionalità di installazione automatica degli Sharepoint Services (questo l'ho scoperto dopo aver perso 10 minuti a cercare l'opzione in un form che aveva, in realtà, solo due pulsanti e una checkbox :P) . Quindi, esci di nuovo, ed installa gli Sharepoint Services. Ricordandomi di _annotare la porta_ dell'administration website che _non_ è quella di default che ti propone poi TFS (ma hanno cambiato porta da 2003 server a 2008 server? O sono fumato io?).

La chicca interessante è che, nell'installazione di Sharepoint Services, ti avvisa che l'utente deve avere i diritti di amministratore abilitati, quindi bisogna o disabilitare la UAC o far partire un prompt di comandi con previlegi elevati. Ricordandomi delle mie peripezie di poco prima, mi è venuto in mente... che probabilmente sono ubriaco io :P

author: Alessandro Ghizzardi | posted @ mercoledì 12 novembre 2008 9.52 | Feedback (0)

[Weekly Issue] Windows 2008 / TFS 2008 Workgroup installation


Sto mettendo in piedi, su una delle virtual machine configurate questo week end, un mini server TFS per provare a vedere se può fare al caso nostro.

Ho puntato sulla Workgroup Edition, che è limitata a 5 utenze ma per ora va piu che bene e così posso rendermi conto quanti benefici effettivamente comporti.

A parte i passi per completare l'installazione di TFS che non commenterò se no Lorenzo mi uccide (ok che avete detto che 2008 è molto meglio, ma 2005 allora cos'era? Strisciare gli attributi sul vetro tritato?? Ci sono tante di quelle particolartà e passi preliminari da fare che non si può davvero parlare di "installazione ma più che altro di Walktrough... era dai tempi di VB6 con COM che non penavo tanto per installare un prodotto!), TFS Workgroup Edition si basa su un gruppo di utenti, Team Foundation Licensed User, limitato appunto a cinque. Questi saranno quelli che avranno il permesso di utilizzare TFS. Peccato che l'utente con cui si installa TFS verrà di forza inserito in questo gruppo, e quindi deve essere uno dei cinque che lo useranno.

Bene, cioè, male, perchè il setup di TFS va lanciato per forza come amministratore... Ri-bene, visto che non voglio un "Administrator" (o come chiamo io l'amministratore locale... che rinomino sempre, cosa che consiglio di fare anche a voi :) ) nel repository TFS,  allora basta creare un utente con nome e cognome e dargli i permessi di Amministratore!

Bene, cioè, male, perchè TFS per funzionare ha bisogno di SQL 2005 (con 2008 bisogna modificare il pacchetto di installazione per inserire l'SP1....) con Integrated Security... ottimo, direi, peccato che il mio neo utente amministratore bello e pronto NON riesce a loggarsi dentro dentro SQL Server... mah, eppure l'ho aggiunto a BUILTIN\Administrator e levato da BUILTIN\Users... riprovo con l'"Administrator" origginale e... si logga... sconforto...

Gira che ti rigira noto che tra l'amministratore creato da Windows e quello creato da me ed aggiunto al gruppo BUILTIN\Administrators cambia solo che il mio ha la UAC abilitata... alchè mi viene un'idea: disabilitiamo la UAC per il mio neo-utente.... magicamente, l'utente riesce a loggarsi... sig... nel walk trough (un .chm di mille mila pagine) si parla un sacco sia degli utenti necessari a TFS, sia di SQL Server, sia dell'interazione tra le due cose, ma non ho davvero trovato questa "piccola" precisazione.... forse perchè pensano che ci sia solo 2003 server? O sono io che non uso abbastanza l'integrated security? Possibile, anzi sicuro, non mi loggo MAI come administrator in integrated security su un SQL server.. fatto sta che ho perso un'altra ora per nulla, ed anche oggi mangerò sushi davanti ai terminal services... :)

author: Alessandro Ghizzardi | posted @ martedì 11 novembre 2008 21.46 | Feedback (1)

[Weekly Issue] Hyper-V Core e controllo remoto


Sto reinstallando i server della mia azienda, e ne ho approfittato per consolidare tutto usando Hyper-V. Oddio, tutto no, per ora TFS e Web server... ma è già un inizio!

Ho avuto qualche piccolo problema di installazione, dovuto principalmente ad errori di gioventù... ma meglio riportarli, così sai mai che possa servire a qualcuno!

1: Hyper-V Core è proprio core... viene installata l'interfaccia a comandi che poi ti permette di fare la maggior parte delle operazioni ma NON di gestire le virtual machine. Per quello, bisogna utilizzare il componente remoto.

2: Il componente remoto di amministrazione (Hyper-V Manager) funziona solo su Vista (e ovviamente su un altro 2008) ed è scaricabile da qui :
http://blogs.msdn.com/virtual_pc_guy/archive/2008/03/25/hyper-v-management-tools-available-for-vista-sp1.aspx

3: La gestione dell'amministrazione remota è, a mio avviso, un pò troppo incentrata su Active Directory. Senza Active Directory, praticamente ogni cosa diventa un problema. Per permettere all'Hyper-V Manager di funzionare correttamente, bisogna fare una serie di passi sia sul client sia sul server che secondo me sono, oltre che poco intuitivi, assolutamente fuori luogo. Nella fattispecie bisogna, rigorosamente da riga di comando perchè sul core la UI non c'è, creare degli utenti (e non l'ho visto scritto da nessuna parte) cambiare i permessi, cambiare due regole sul firewall, abilitarli per l'uso di DCOM ... insomma, non potevano creare un'utenza built-in da usare per il controllo remoto, visto che con la core è necessario?? Ho trovato questa cosa decisamente frustrante...

4: I passi da percorrere per riuscire a non impazzire li trovate qui:
http://blogs.technet.com/jhoward/archive/2008/03/28/part-1-hyper-v-remote-management-you-do-not-have-the-requested-permission-to-complete-this-task-contact-the-administrator-of-the-authorization-policy-for-the-computer-computername.aspx (in cinque parti... giusto per farvi capire quanto sia agevole la procedura...)

In soldoni... devo ammettere che alla fine ho desistito ed ho installato 2008 full con Hyper-V... molto più semplice da gestire anche se perdo un centinaio di mega di ram sull'host...

Anche qui, comunque, una sorpresa: la versione shippata NON prevede Hyper-V, o meglio prevede la versione in pre-relase. Bisogna ricordarsi di scaricare l'aggiornamento che, sorpresa sorpresa, non è segnato come aggiornamento importante ma è un "raccomended"... mah....

author: Alessandro Ghizzardi | posted @ lunedì 10 novembre 2008 14.24 | Feedback (5)

[Weekly Issue] Javascript e replace()


Sto lavorando tantissimo con Javascript in questo periodo. Molti diranno purtroppo, io invece trovo che non sia affatto quel linguaggio terribile che molti dicono. In certi casi, devo dire, è però un pò ostico, o quantomeno va controcorrente rispetto all'utilizzo "comune" di certe cose.

Per esempio, il caro metodo replace() esposto dall'oggetto stringa, accetta in ingresso una stringa di cui fare il replace e la stringa con cui cambiarla.

str = str.replace('input','output');

Il problema sta nel fatto che il metodo replace trova solo la prima occorrenza della stringa, e li si ferma... se si vogliono cambiare tutte le occorrenze di una particolare stringa, bisogna utilizzare le regular expression e, quindi, la keyword "/g" in questo modo

str = str.replace(/input/g, 'output');

Attenzione, nel caso ci sia la necessità di cambiare dei caratteri speciali, ci sono un pò più di problemi, che si risovono ricordandosi l'escape.
Per esempio, per cambiare tutte le occorrenze di '+' in una data stringa, si usa

str = str.replace(/\+/g, 'output');

author: Alessandro Ghizzardi | posted @ lunedì 27 ottobre 2008 12.27 | Feedback (3)

[OT] Autostrade per L'Italia??


Da pochi giorni il blog di UGIdotNET è tornato online! So che non è bello ricominciare la serie di post con un OT, ma sono uscito or ora fuori da una super incaXXatura e avevo bisogno di scriverlo al mondo!

Allora, sono andato oggi a rinnovare l'assicurazione per la macchina: già quindi non ero particolarmente ben predisposto di mio. Esco dall'ufficio (Milano Mecenate) verso le tre e mezza e percorro la tangenziale in auto in direzione Bologna per arrivare dalle parti di Rozzano. Il mio occhio attento (ahaha... hem.. :P) nota che l'altra corsia, a tornare, è inesorabilmente e completamente BLOCCATA da San Donato a scendere verso Forlanini e Gobba. Prendo nota mentale, e mi riprometto al ritorno di uscire a San Donato: facendo le stradine interne sono in ufficio in 10 minuti e mi evito mezz'ora e passa di coda.

Faccio quello che devo fare in assicurazione, piango un pò, discuto su futuri premi, assicurazioni professionali, etc, insomma dopo quasi un'ora sono fuori. Mi riimmetto in tangenziale, pronto ad uscire a San Donato. Caso vuole che un 200 metri prima dell'uscita per San Donato ci sia uno dei famigerati pannelli informativi variabili. Fantastico tra me e me sul contenuto del pannello (cosa troverò scritto? "Chiama il numero verde"? o "Se sei fuori, passa il volante"? Come se tutti guidassero ubriachi alle 4 di pomeriggio, mentre pochi metri più avanti c'è una coda di almeno 5km...) e quando infine me lo trovo di fronte, rimango sconcertato dal notare un messaggio breve e preciso, con tanto di simbolino di macchine in coda. Il messaggio era "Attenzione, coda per traffico da Forlanini a Imbocco A4".

Io sono fondamentalmente un uomo semplice, mite, ed ingenuo. Rimango un buon 5 secondi, cioè il tempo di arrivare all'uscita, a pensare se fidarmi o meno. Poi decido che, effettivamente, se c'è stato un incidente in un'ora la coda può anche essersi riassorbita un pò, e io che devo uscire a Mecenate me ne frego altamente della coda visto che Forlanini è due uscite dopo. Così risparmio anche 7 dei 10 minuti necessari.

Decido quindi di fidarmi di quello che sembra essere l'unico vero caso di informazione valida e tempestiva, e continuo sulla tangenziale lasciandomi alle spalle l'uscita di San Donato. Mia madre, però, mi diceva sempre e mi ripete tutt'ora che sono un caXXone, e infatti alla prima curva cieca, neanche 200 metri dopo il pannello, mi ritrovo imbottigliato in quella che può essere definita solo come "Coda Colossale".

Tralascio le mie peripezie per aprirmi un varco fino all'uscita di Piazza Lodi, 1km dopo, nonchè le bestemmie spese nel passare attraverso la città alle cinque di pomeriggio... Morale, invece di metterci 3 minuti o 10, ce ne ho messi quasi 45.

E io mi dico... ma [censura]..... è peggio avere uno strumento e NON usarlo, o avere uno strumento ed usarlo nella maniera più inutile possibile, ossia aggiornandolo a chissà quando? Quel pannello aveva informazioni vecchie almeno di un paio d'ore, visto che quando sono passato io un'ora prima la coda era già passata da Forlanini a San Donato.. e porca miseria, dall'uscita di Forlanini a quella di San Donato ci sono piu di 5km!! Avrei davvero preferito un bel "Ricorda di allacciarti le cinture"... mi sarei fatto una bella risata e, memore della coda già vista al ritorno, me ne sarei uscito prima!

Che alle porte del 2009 succedano ancora di queste cose mi lascia davvero, tristemente, senza parole...

author: Alessandro Ghizzardi | posted @ giovedì 23 ottobre 2008 18.38 | Feedback (1)

[Weekly Issue] Rimuovere i commenti da SubText


Tornato dalle vacanze, mi sono trovato una spiacevole sorpresa. Non so come, non so quando, non so nemmeno perchè, ma mi sono trovato qualcosa come 4000 ping/trackback di spam. 

Ancora non so se la risposta sia disabilitare totalmente ping/trackback o abilitare la moderazione (cosa che tra parentesi nemmeno so se funziona per i trackback), ma la cosa piu urgente da fare ora come ora è eliminare queste quintalate di feedback non desiderati.

Una rapida scorsa all'interfaccia amministrativa di SubText mi fa capire che volendoli cancellare uno per uno (a pagina, 10 alla volta) con tanto di mille mila messaggi di conferma, sarei diventato vecchio in fretta. Do anche una guardata alle metablog api, ma noto che non ci sono metodi che mi permettono di cancellare i feedback. Ho anche cercato in giro post o accrocchi che ne parlassero, ma non ne ho trovato (possibile che sia stato l'unico ad avere questo problema?? :P) Se ci sono, me li sono persi, nel caso fatemelo sapere per favore :)

Comunque, ho messo in atto la Soluzione Estrema, cioè ho buttato via un paio d'ore a costruire una windows form che servisse allo scopo.
Probabilmente è la soluzione più stupida del mondo, e non discuto che ce ne siano miliardi di altre, ma guardando come funziona il motore e cercando in giro non ho trovato spunti migliori. Se qualcuno ce li ha, me lo faccia sapere che posso pensare di tenerlo come referenza futura:)

La mia ricetta è stata:

- Un componente web browser
- Una regexp che controlli l'html
- Una discreta conoscenza degli oggetti mshtml.* (che, l'ho probabilmente già detto e lo ripeto, sono scritti col c**o)

Non sapendo ovviamente nulla di nessuno dei tre punti, quello che è venuto fuori è una ciofeca (:P) ma piu o meno fa il suo lavoro.

Blog cleaner in action

Praticamente, funziona così:

- Si digita l'indirizzo della pagina che si vuole ripulire e si schissa "GO" (l'ho fatto per pagina perchè ho notato che il 99% dei feedback erano concentrati su una decina di post, probabilmente quelli meglio indicizzati in google)
- Ci si ricorda di fare login nella pagina amministrativa, altrimenti non viene fuori il link per rimuovere il commento
- Una volta fatto login, si rischiaccia "go" e si refresha la pagina per evitare la cache (tasto destro/refresh, altrimenti molte volte il webbrowser non si refresha bene)
- Una volta che si vedono tutti i millemila commenti con il remove comment, si schissa il pulsantone "Check feedbacks to purge". Apparirà la finestra che si vede in immagine, con la lista di tutti i commentii.
- Schiacciando "cancel" si torna indietro. Schiacciano "purge unchecked feedback", si cancellano TUTTI i feedback TRANNE quelli selezionati. Quindi attenzione di ricordarsi di selezionare i feedback che si vuole mantenere.

A questo punto il programma torna indietro e, con un pò di magia nera ed un sacco di porcate, si prende gli oggetti link che ha precedentemente salvato e simula tutti i "click" (è purtroppo l'unico modo che ho trovato). L'accrocchio è lento come la morte, perchè purtroppo non sono riuscito ad intercettare l'evento di loading alle fine del click (UpdatePanel e oggetto WebBrowser a quanto pare non quagliano molto), quindi ho fatto la solenne porcata di aspettare 3 secondi per ogni click. Ne consegue che ci metterà sempre 3 secondi a feedback, che in caso di 4000 link come me possono voler dire parecchie ore, ma almeno lo fa in background mentre io sto facendo altro :) Oltretutto ogni volta devo riparsare il documento pre ripopolare la collezione di link, perchè l'update panel cambia rimuovendo il link cancellato, ma l'oggetto webbrowser non se ne accorge (e non lancia nessun evento.. grrrrr) e quindi non posso utilizzare i link vecchi tenuti in memoria.

Il codice fa sicuramente schifo ed è quanto di piu lontano di quello che può essere scritto bene, ma serviva solo per questo particolare problema, ed ora sono felice possessore di un blog piu pulito. Se volete utilizzarlo perchè avete il mio stesso problema, ed utilizzate SubText, vi allego il codice. Tenete comunque conto di questi punti importantissimi:

1: è assolutamente pensato per lavorare sul MIO blog con la MIA skin. Visto l'utilizzo intenso di interazione con il DOM della pagina, non è ASSOLUTAMENTE assicurato che funzioni anche sul vostro. anzi, è quasi sicuro che si pianti :)
In particolare, io gioco con il parent del link "remove comment" per popolare la lista dei feedback in maniera corretta. Sulla mia skin precedente, il div giusto era SOTTO il link removecomment, quindi prendevo l'ultimo children del parent, mentre nella skin attuale (che già che c'ero ho cambiato, la vecchia aveva stufato!) il div corretto è il secondo, mentre il remove comment è l'ultimo!
2: è assolutamente fornito "AS-IS", e non mi prendo nessuna responsabilità nel caso vogliate usarlo/testarlo/whatever.
3: Che nessun mi venga a dire che questo-o-quello si poteva fare meglio/diversamente/whatever che me ne frega :D L'unica cosa che mi interessa è se c'era qualche modo più diretto per interagire con il blog e cancellare tutto senza dover per forza simulare tutti i click (e se c'è un modo per far capire all'oggetto WebBrowser che il caricamento di un UpdatePanel è finito!)
4: Chiaramente ci sono molti (tanti) problemi, il più noioso che ho trovato è che l'updatepanel "scazza" dopo qualche minuto di attività, probabilmente per una perdita di credenziali, ma non sempre. Quindi, ogni tanto lancerà fuori un errore di tipo Sys.Web.Timeout exception o qualcosa di simile. Si chiude, si riapre, e si ricomincia :P
5: Ricordatevi sempre di selezionare i feedback che si vogliono mantenere! E' pensato per un post riempito di trackback inutili, quindi l'azione di default che fa è rimuoverli tutti a meno che non li si selezioni!

Trovate il codice qui (stavolta lo allego altrimenti, com'era successo per la stored di pulizia dei campi da Sql Injection, me la chiedete in trentamila e poi finisce che a qualcuno non arriva).

Edi: come mi ha giustamente fatto notare simone, è subtext, non .text :D

author: Alessandro Ghizzardi | posted @ martedì 26 agosto 2008 12.26 | Feedback (2)