Ora si cammina da soli!


Penso che questo sarà il post di addio della community di UGI.Net. (cioè, solo a mio blog su questa community!)

Perche? ...perchè ho voglia di avere un posto tutto mio, in cui scrivere quello che voglio di quello che mi piace.
non sono più attratto solo dal mondo .Net, mi sto interessando a Java per Android, chissà, forse anche Objective C per iOS.
Voglio un posto in cui poter scrivere delle dev-banalità, senza venire criticato o giudicato, un posto in cui appuntarmi le piccole scoperte di ogni giorno...

Per questo mi sono trasferito nel "mio posto": http://www.dev-spark.com

Quindi, arrivederci a tutti!

author: Luca Cavicchioli | posted @ Saturday, September 18, 2010 7:19 PM | Feedback (0)

The broken window theory


If a window in a building is broken and is left unrepaired, all the rest of the windows will soon be broken (…) one unrepaired broken window is a signal that no one cares, and so breaking more windows costs nothing (Wilson e Kelling, 1982).

 

Extract from The Pragmatic Programmer Copyright © 2000 Addison Wesley Longman, Inc.

 
While software development is immune from almost all physical laws, entropy hits us hard. Entropy is a term from physics that refers to the amount of "disorder" in a system. Unfortunately, the laws of thermodynamics guarantee that the entropy in the universe tends toward a maximum. When disorder increases in software, programmers call it "software rot."

There are many factors that can contribute to software rot. The most important one seems to be the psychology, or culture, at work on a project. Even if you are a team of one, your project's psychology can be a very delicate thing. Despite the best laid plans and the best people, a project can still experience ruin and decay during its lifetime. Yet there are other projects that, despite enormous difficulties and constant setbacks, successfully fight nature’s tendency toward disorder and manage to come out pretty well.

What makes the difference?

In inner cities, some buildings are beautiful and clean, while others are rotting hulks. Why? Researchers in the field of crime and urban decay discovered a fascinating trigger mechanism, one that very quickly turns a clean, intact, inhabited building into a smashed and abandoned derelict .

A broken window.

One broken window, left unrepaired for any substantial length of time, instills in the inhabitants of the building a sense of abandonment - a sense that the powers that be don’t care about the building. So another window gets broken. People start littering. Graffiti appears. Serious structural damage begins. In a relatively short space of time, the building becomes damaged beyond the owner’s desire to fix it, and the sense of abandonment becomes reality.

The "Broken Window Theory" has inspired police departments in New York and other major cities to crack down on the small stuff in order to keep out the big stuff. It works: keeping on top of broken windows, graffiti, and other small infractions has reduced the serious crime level.

Don’t Live with Broken Windows

Don’t leave "broken windows (bad designs, wrong decisions, or poor code) unrepaired. Fix each one as soon as it is discovered. If there is insufficient time to fix it properly, then board it up. Perhaps you can comment out the offending code, or display a "Not Implemented" message, or substitute dummy data instead. Take some action to prevent further damage and to show that you’re on top of the situation.

We’ve seen clean, functional systems deteriorate pretty quickly once windows start breaking. There are other factors that can contribute to software rot, and we’ll touch on some of them elsewhere, but neglect accelerates the rot faster than any other factor.

You may be thinking that no one has the time to go around cleaning up all the broken glass of a project. If you continue to think like that, then you’d better plan on getting a dumpster, or moving to another neighborhood. Don’t let entropy win.

Putting Out Fires

By contrast, there’s the story of an obscenely rich acquaintance of Andy’s. His house was immaculate, beautiful, loaded with priceless antiques, objets d’art, and so on. One day, a tapestry that was hanging a little too close to his living room fireplace caught on fire. The fire department rushed in to save the day - and his house. But before they dragged their big, dirty hoses into the house, they stopped - with the fire raging - to roll out a mat between the front door and the source of the fire.

They didn’t want to mess up the carpet.

A pretty extreme case, to be sure, but that’s the way it must be with software. One broken window - a badly designed piece of code, a poor management decision that the team must live with for the duration of the project - is all it takes to start the decline. If you find yourself working on a project with quite a few broken windows, it’s all too easy to slip into the mindset of "All the rest of this code is crap, I’ll just follow suit." It doesn’t matter if the project has been fine up to this point. In the original experiment leading to the "Broken Window Theory," an abandoned car sat for a week untouched. But once a single window was broken, the car was stripped and turned upside down within hours.

By the same token, if you find yourself on a team and a project where the code is pristinely beautiful - cleanly written, well designed, and elegant - you will likely take extra special care not to mess it up, just like the firefighters. Even if there’s a fire raging (deadline, release date, trade show demo, etc.), you don’t want to be the first one to make a mess.

Challenges

  • Help strengthen your team by surveying your computing "Neighborhood." Choose two or three "broken windows" and discuss with your colleagues what the problems are and what could be done to fix them.
  • Can you tell when a window first gets broken? What is your reaction? If it was the result of someone else’s decision, or a management edict, what can you do about it?

author: Luca Cavicchioli | posted @ Wednesday, September 2, 2009 1:30 AM | Feedback (0)

OrderBy con Linq su proprietà passata come parametro


Tip a futura memoria: 

public static List<MyClass> ReorderList(List<MyClass> listToOrder, string orderByPropertyName)
{
    var p = typeof(MyClass).GetProperty(orderByPropertyName);
    return listToOrder.OrderBy(c => p.GetValue(c, null)).ToList<MyClass>();
}

author: Luca Cavicchioli | posted @ Monday, August 24, 2009 5:27 PM | Feedback (0)

Post-ino "display:none" vs "visibility:hidden"


Dato che non me lo ricordo mai:

Nello style, differenza tra Style="display:none" e Style="visibility:hidden":

Con display:none un elemento non verrà renderizzato e quindi non occuperà spazio nella pagina. Con visibility:hidden un elemento non verrà mostrato, ma occuperà lo spazio di pagina proprio come se fosse visibile.

author: Luca Cavicchioli | posted @ Tuesday, May 19, 2009 10:18 PM | Feedback (0)

Generazione documenti PDF da template (PDF Forms) con iTextSharp


Ammetto la mia ignoranza... Non sapevo che esistessero i PDF Forms!

Intanto cosa sono e come si possono creare

Un Form PDF, come dice il nome, è un documento PDF contenente alcuni campi compilabili o selezionabili dall'utente, tipo TextBox, Combo, CheckBox...
Per creare un PDF Form, bisogna utilizzare la versione completa di Adobe Acrobat, oppure se si desidera risparmiare qualche soldo, basta utilizzare Open Office sfruttando le sue potenzialità di export PDF.
Per inserire campi persoanlizzabili all'interno del documento, si utilizzano gli strumenti presenti nella toolbox "Form Controls" visualizzabile tramite "View -> Toolbars -> Form Controls".
A questo punto basterà "disegnare" i controlli necessari direttamente nella pagina, e ovviamente dargli un nome sensato (che ci consenta di recuperarli in futuro)
Una volta creato il form, sarà necessario esportarlo in PDF tramite "File -> Export as PDF..." selezionando le opzioni "Create PDF Form" e "Export bookmarks" e... ecco fatto, il nostro PDF Form è pronto all'uso!.

Nota: Per utilizzare il PDF Form come template da dare in pasto al nostro futuro programma, utilizzare come controlli i TextBox, ed eventualmente, nelle proprietà del singolo controllo (doppio click su di esso) impostare il bordo come "Without frame" così il documento generato non visualizzerà i bordi delle caselle di testo.

Come si possono compilare da codice?

Bene, ora passiamo alla parte facile (effettivamente mi ci è voluto molto di più a capire come fare il form che a farlo compilare da iTextSharp)
Supponiamo di dover compilare un form che rappresenta una fattura:

Aggiungiamo il riferimento ad iTextSharp al nostro progetto e copia-incolliamo l'esempio seguente, il quale mostra in modo un po' grezzo, ma molto comprensibile come compilare i vari campi 

string pdfTemplate = @"c:\InvoiceForm.pdf";
string newFile = @"c:\Invoice_Compiled.pdf";
      
PdfReader pdfReader = new PdfReader(pdfTemplate);
      
// PdfStamper, usato per aggiungere contenuti al documento PDF. 
// In questo caso viene utilizzato per compilare campi del form, ma si può anche utilizzare per aggiungere 
// qualsiasi altro contenuto al PDF anche tramite posizione assoluta o con riferimenti tipo Top e Bottom.
// Può essere usato per scopi tipo watermarking.
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFile, FileMode.Create));
AcroFields pdfFormFields = pdfStamper.AcroFields;

// Per scorrere i vari campi presenti nel PDF - Non serve nell'esempio, è un reminder
foreach (DictionaryEntry de in pdfFormFields.Fields)
  Console.WriteLine(de.Key.ToString());

Console.ReadLine();

// Compilazione dei campi
pdfFormFields.SetField("txtRagioneSociale",  "Pinco Pallo s.r.l.");
pdfFormFields.SetField("txtIndirizzo", "via delle Fontane Secche, 1 - Gotham City");
pdfFormFields.SetField("txtPIVA", "0123456789");
pdfFormFields.SetField("txtDescrizione", "Acquisto 4 pneumatici Bat-Mobile");
pdfFormFields.SetField("txtImponibile", "4000");
pdfFormFields.SetField("txtIVA", "800");
pdfFormFields.SetField("txtTotale", "4800");
      
// Questa istruzione consente di rimuovere le potenzialità di editing del form, risultando
// in un PDF non più modificabile dall'utente, se si imposta a false, il PDF risultante sarà 
// compilato ma comunque editabile dall'utente
pdfStamper.FormFlattening = true;

// CHIUDERE IL PDFSTAMPER!!! Lasciarlo aperto comporterà la produzione di un PDF corrotto
pdfStamper.Close();

Process.Start(newFile);

author: Luca Cavicchioli | posted @ Monday, May 18, 2009 12:33 PM | Feedback (1)

Visual Studio 2005 e SQL Server 2008


Per collegarsi a SQL Server 2008 con gli strumenti di Visual Studio 2005 è necessario installare:

Microsoft Visual Studio 2005 Service Pack 1 Update for Microsoft SQL Server 2008 Support

author: Luca Cavicchioli | posted @ Thursday, March 12, 2009 12:06 PM | Feedback (0)

Sempre su VMWare e sistemi guest a 64bit


Nel caso, in fase di installazione di un sistema operativo a 64 bit (Windows Server 2008) come guest di VMWare GSX e/o ESXi, si presenti un errore come quello riportato di seguito:

File: \windows\system32\boot\winload.exe
Status: 0x000035a
Info: Attempting to load a 64-bit application, however this cpu is not compatible with 64-bit mode.

Controllare da bios del server che la Intel Virtualization Technology (VT) sia abilitata, ovviamente per processori Intel, su AMD non esite come opzione e il supporto per la virtualizzazione è abilitato di default su Opteron revision E o successivi.

L'errore potrebbe essere anche

Ubuntu 8
This kernel requires an x86-64 CPU, but only detected an i686 CPU.
SLES 10
Cool Software, but... This is a 32-bit Computer. You cannot use 64-bit software on it.
Windows 2003 Server
Attempting to load an x64 operating system, however this CPU is not compatible with x64 mode. Please install a 32-bin X86 operating system.

Inoltre, se la VT è abilitata da BIOS e il boot di macchine guest a 64bit con Paravirtualization (VMI) abilitata da errore (gli stessi mostrati prima) con la possibilità che sia indicato un errore del tipo "Long mode is required", indica che il sistema operativo guest non offre supporto a 64 bit per VMI, quindi occorre disabilitarlo:

Da Virtual Infrastructure Client:
- Scegliere la virtual machine incrimianta
- Edit Settings > Options > Advanced
- Deselezionare Paravirtualization.

author: Luca Cavicchioli | posted @ Tuesday, March 3, 2009 11:44 AM | Feedback (0)

Problema avvio servizi VMWare GSX Server su SLES 10 SP2


La scorsa settimana è arrivato in ditta un nuovo server, (HP Proliant DL185) acquistato con l'intento di virtualizzarci sopra un po' di macchine.
Io volevo installarci VMWare ESXi v3.5 e dimenticarmi poi della sua esistenza, ma... sorpresa! La macchina in questione (o almeno il controller raid in esso presente) non è nella compatibility-list di ESXi e infatti, tentando di installarlo, il risultato è un bell'errore del tipo "Non trovo i dischi".
Ok, piano B... Installo Novell SLES 10 SP2 EMT64 ridotto al minimo e un bel VMWare GSX Server v2.0, e qui iniziano i problemi.
Installo GSX, lancio lo script di configurazione vmware-config.pl setto tutto a dovere (forse) e tutto funziona...
Riavvio la macchina e non funziona più nulla... morale della storia, non vengono avviati i servizi di VMWare GSX Server, che (APPARENTEMENTE) sono 4:

vmware
vmware-core - non ho capito la differenza tra questi due comunque il core di vmware con l'HAL
vmware-autostart - il servizio che consente di avviare il automatico le virtual machines al riavvio dell'host
vmware-mgmt - Il servizio che consente la gesione remota tramite web-interface e/o Virtual Infrastructure Client

Verificando con YAST (o tramite "service --status-all") questi 4 servizi, infatti risultavano spenti e anche cercando di assegnargli, sempre tramite yast, il runlevel giusto (2,3 e 5) non cambiava nulla, ovvero le impostazioni non avevano alcun effetto e venivano ignorate.
Bene, allora via di maniere forti... verifichiamo che gli script di questi servizi siano presenti in /etc/init.d e che siano linkati nelle varie sottocartelle rc[X].d e qui la prima sorpresa. "vmware" è uno script reale, invece "vmware-core", "vmware-autostart" e "vmware-mgmt" sono link a "vmware" e nelle varire cartelle rc[X].d sono presenti tutti e quattro i link ai vari servizi, ma in realtà sono tutti link allo script "vmware".
Risparmio tutti gli step per capire cosa questo implicasse, ma il fatto che venisse richiamato varie volte lo stesso script (vmware) da più link diversi, faceva si che quando insserv provasse a fare lo start dei vari script di init, questo andasse in errore.

Soluzione 1:
Eliminare da /etc/init.d tutti i link allo script di vmware e copiare questo script rinominandolo nei vari vmware-core, vmware-autostart, vmware-mgmt in modo che diventino tutti script reali, ovviamente vanno ricreati anche i link corretti nelle varie cartelle rc[X].d a seconda dei runlevel da assegnare. Inoltre per far si che tutto funzioni, in ogni script bisogna editare il blocco commentato INIT INFO in modo da sostituire "vmware" con i rispettivi "vmware-core", "vmware-autostart"e "vmware-mgmt" (questo blocco, compreso tra BEGIN INIT INFO e END INIT INFO viene letto da insserv).

Soluzione 2:
Letta su internet, non capita e non testata... qualcosa che ha a che fare con l'attributo RUN_PARALLEL=Yes... dato che la soluzione 1 funziona, non ho approfondito!

author: Luca Cavicchioli | posted @ Sunday, March 1, 2009 10:58 PM | Feedback (0)

Creare un Web Service direttamente da SQL Server


Un po’ di tempo fa, non ricordo dove (forse proprio qui sui blogs di UGI) ho letto della possibilità di creare un web service direttamente da SQL Server 2005/2008, esponendo una stored procedure come endpoint, non ricordo l’autore dell'articolo, ma mi ero segnato uno dei link presenti nell’articolo originale (http://msdn.microsoft.com/it-it/library/cc185116.aspx) che spiegava come farlo.

 

In questi giorni ho avuto la necessità di creare “al volo” un paio di web service per dei test, quindi, quale miglior modo che provare a farli direttamente da SLQ Server?

 

Quindi andiamo per ordine…

 

1 - Creare le stored procedure che si vogliono esporre.

 

2 - Esporle:

 

CREATE ENDPOINT myTestSQLEndpoint
STATE = STARTED
AS HTTP
(
    PATH = '/test',
    AUTHENTICATION = (INTEGRATED), CLEAR_PORT = 8080,
    PORTS = (CLEAR),
    SITE = 'localhost'
   )
FOR SOAP
(
   WEBMETHOD 'Execute1' (name='sp_MyExposedStoredProcedure1', SCHEMA=STANDARD )
   WEBMETHOD 'Execute2' (name='sp_MyExposedStoredProcedure2', SCHEMA=STANDARD )
   WSDL = DEFAULT,
   SCHEMA = STANDARD,
   DATABASE = 'mydatabase',
   NAMESPACE = 'http://www.mynamespace.org/'
   );
GO

 

Riporto parte dell’articolo presente su msdn che spiega il significato delle varie istruzioni:

La prima parte dell’istruzione “.. AS HTTP …” definisce tutte le informazioni relative al protocollo di trasmissione, l’eventuale porta di comunicazione e la modalità di autenticazione.

PATH: l’URL virtuale dove risiederà il nostro web service.

PORTS: specifica l’utilizzo del protocollo HTTP su porta 80 di default, piuttosto che HTTPS (SSL, con porta 443 di default).

SITE: il nome del server dove il nostro WS sta girando.

La seconda parte “… FOR SOAP…” definisce i metodi che saranno resi disponibili all’esterno, la tipologia di WSDL, il database di utilizzo.

Da ricordare che le istruzioni sugli oggetti ENDPOINT possono essere compiute solo da:

  • Membri appartenenti al ruolo sysadmin
  • Proprietari degli ENDPOINT
  • Utenti ( gruppi) a cui è stato concesso il CONNECT sull’ENDPOINT

author: Luca Cavicchioli | posted @ Wednesday, January 21, 2009 12:50 PM | Feedback (3)

ASP.Net: Caricamento usercontrol in griglia


...altro post a futura memoria, per me stesso...

Problema: caricare uno UserControl, all'interno delle celle di una gridview.

Lo user-control dei dettagli espone solamente delle proprietà (che servono come filtro sui dati da visualizzare) e un metodo refresh (che in pratica fa l'accesso ai dati), ovviamente il tutto inserto in un template field della griglia.

A questo punto agganciando l'evento RowCreated della griglia per settare le proprietà ed eseguire il refresh dello usercontrol, viene rilanciata una NullReferenceException ogni qualvolta si tenta di esegure il metodo refresh dello usercontrol

Soluzione: Invece di eseguire queste operazioni all'evento RowCreated, eseguirle nell'evento RowDataBound, il motivo... beh, sul RowCreated della griglia viene solamente istanziato lo usercontrol contenuto nelle sue celle (e viene eseguito solamente l'OnInit), ma non il restante lifecycle del controllo (perchè??), quindi le proprietà e i metodi sono accessibili, ma non lo stato!

P.S. Gli eventi vanno agganciati nell'OnInit, non nell'OnLoad!!

author: Luca Cavicchioli | posted @ Monday, January 19, 2009 12:53 PM | Feedback (0)