martedì, dicembre 30, 2008

Easy Vmx

Ecco un bel servizio per creare macchine virtuali vuote per Vmware:  http://www.easyvmx.com/

Se hai vmware player e vuoi installare una nuova macchina virtuale, ti serve la coppia Vmx (macchine virtuale) + Vmdk (disco virtuale). Ma con vmware player non è possibile creare nuove macchine virtuali. Con il servizio EasyVmx puoi crearti la macchina virtuale che ti serve. Ovviamente vuota! Il sistema operativo te lo devi installare tu.

lunedì, dicembre 22, 2008

Link: SQL Server 2005 Backups

Ecco un bell'articolo sulle varie possibilità di backup in sql 2005:

   http://www.simple-talk.com/content/article.aspx?article=322

Tra le altre cose è descritta molto bene l'opzione COPY_ONLY. Da leggere.

venerdì, novembre 21, 2008

System.Web.UI.WebControls.Parameter ..... DbType !

SFOGO!

Ma porca la put...a! E' mai possibile sapere le cose in modo semplice senza diventare matti con Reflector, pezzi di blog e ammenicoli vari?!?!?

Iniziamo: ambiente di sviluppo VS2005 su Vista. Un bel SqlDataSource su pagina asp.net e un po' di parametri di update ed insert. Niente di strano. Incomiciano le cose strane. Una proprità nuova... non la ricordavo... DbType sui parametri. Qualche problema con le date e poi funziona tutto. Ho un po' di fretta e non indago troppo (mannaggia a me!).

Dopo un po' di giorni, faccio un deploy su Win2003 server. E mi becco subito un bel errore:
Type 'System.Web.UI.WebControls.Parameter' does not have a public property named 'DbType'.

Ma come è possibile? Net 2.0 su Vista, Net 2.0 in Win2003... boh! Dopo un po' di prove mia affido a Reflector e sorpresa: la classe System.Web.UI.WebControls.Parameter su Vista è diversa dalla classe System.Web.UI.WebControls.Parameter su Win2003. C'è una proprietà in più: DbType. Ovviamente ci sono anche i vari costruttori per poterla gestire.
Cerca, cerca, cerca e su MSDN, alla pagina http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.parameter.dbtype.aspx al fondo mi casca l'occhio su una cosa strana:
Supported in: 3.5 SP1, 3.0 SP2, 2.0 SP2

Ma da quando c'è Net 2.0 Sp2? Mi sono perso qualcosa? Sembrerebbe di si... ma... cercando ancora su Google viene fuori che Net 2.0 Sp2 non esiste come pacchetto a se stante ma viene installato da... Net 3.5 SP1! Ma porca la put....!

Fine dello sfogo!

PS: ok, è anche colpa mia... nella fretta non ho indagato sul quel parametro DbType... avrei dovuto farlo. Mea culpa!

venerdì, ottobre 24, 2008

Pdf2AfpLib - alpha release

I've released on SourceForge the alpha version of Pdf2AfpLib.  http://sourceforge.net/projects/pdf2afplib/

Pdf2AfpLib is a library for converting Pdf files to Afp files. It's written in C# and uses Ghostscript for a part of the conversion process. At the moment it generates only black and white Afp files. No gray scale, no color.
Important: all the content is rasterized. In the resulting afp file, every page contains only one big image that completely covers the page.

The conversion runs through 2 steps:
  1. Pdf is converted to tiff G3 files using Ghostscript. One tiff for each page.
  2. Tiff are parsed and the image content is imported as an IOCA image in the output afp.




At the moment you can download the source code only from the Subversion repository on SourceForge.
Repository URL:  https://pdf2afplib.svn.sourceforge.net/svnroot/pdf2afplib/
If you want to browse it:  http://pdf2afplib.svn.sourceforge.net/viewvc/pdf2afplib/trunk/

domenica, ottobre 12, 2008

IEC16022Sharp 0.3.6.0

Iec16022Sharp 0.3.6.0 released.

Added HexPbm output support  (by Andrew Francis)

https://sourceforge.net/projects/iec16022sharp/

giovedì, agosto 21, 2008

Post di Rick Strahl su Asp.Net

Un bel post di Rick Strahl su Asp.Net e sulla politica di Microsoft. Molto lungo ma molto interessante. Da leggere.

http://west-wind.com/weblog/posts/453551.aspx

martedì, luglio 15, 2008

Normalizzazione di database

Questo post è dedicato a Guerrino.

Non voglio scrivere l'ennesimo post sulla denormalizzazione dei database. L'argomento è ampiamente trattato da esperti e guru. Un giro con Google e si trovano centinaia di voci. Voglio comunque segnalare il recente articolo di Jeff Atwood Maybe Normalizing Isn't Normal. Merita una lettura attenta.


Ci tenevo invece a riportare un paio di frasi ad effetto di Pat Helland
 
"Normalization is for Sissies"
  
"People normalize because their professor said to"
 

La prima è una provocazione. La seconda invece ci dovrebbe far pensare..... quante volte si fanno le cose in un certo modo perchè qualcuno di "autorevole" (o autoritario?) ci ha detto che così si deve fare?


PS: non sono un fan sfegatato della denormalizzazione. Anzi ritengo che i casi in cui la si possa o debba applicare in modo massiccio sono realmente pochi. D'altra parte non sono neanche un sostenitore della normalizzazione a tutti i costi. In un futuro post (tempo permettendo) cercherò di fare la mia list di tips sull'argomento.

giovedì, luglio 10, 2008

Bug generalizzato - DNS cache poisoning

In questi giorni sono state rilasciate varie patch da molti grossi nomi: Microsoft, Cisco, Sun, ecc.
Le patch correggono un bug nell'implementazione e, se ho capito bene, nell'uso dei server DNS. Lo scopritore del problema è Dan Kaminsky che sul suo blog ha pubblicato un interessante articolo in cui racconta lo sforzo congiunto di vari produttori per far fronte al problema:   http://www.doxpara.com/?p=1162

Per i dettagli tecnici, vedere l'articolo su CERT:  http://www.kb.cert.org/vuls/id/800113
Sempre nell'articolo del CERT è presente la lista dei sistemi coinvolti. Praticamente tutti, in varie forme:Microsoft, Cisco, Sun, Debian, RedHat, ecc. Altri sono ancora Unknown. Vedremo che cosa succederà nei prossimi giorni.

Molti dettagli tecnici sono presenti anche sul Advisory di Cisco:  http://www.cisco.com/en/US/products/products_security_advisory09186a00809c2168.shtml

C'è però una cosa che non mi è ancora chiara: lo stato di Debian. Leggendo i vari avvisi presenti sul loro sito sembra che il problema su BIND sia stato risolto ma non quello "lato client". Vedi  http://www.debian.org/security/2008/dsa-1605

Ad oggi, l'unico sistema ad ampia diffusione che sembra immune dal problema è Vista (almeno stando al bollettino di Microsoft).


UPDATE1: la cosa simpatica (si fa per dire) è che sembra che il problema fosse già stato evidenziato ben 3 anni addietro.  Ecco il documento su SANS: http://www.sans.org/reading_room/whitepapers/dns/1567.php
Il documento è molto interessante perchè spiega nel dettaglio come avviene l'attaco. Si tratta di un classico attacco "Man in the middle". Come client viene usato Windows XP ma, come abbiamo visto in questi giorni, il problema è generalizzato.

UPDATE2: altro post molto interessante:
http://blog.netherlabs.nl/articles/2008/07/09/some-thoughts-on-the-recent-dns-vulnerability
Bert Hubert, l'autore, oltre a sostenere che il problema fosse noto dal 1999, fa anche alcune interessanti riflessioni sul DNS in se e su come certi enti non siano stati in gradi di reagire per tempo. Molto interessante.

giovedì, luglio 03, 2008

Sicurezza Home Banking

Mi stavo chiedendo perchè più di una banca online non "copra" tutto il sito, pagina del form di login compresa, con https. Cercando con Google sono capitato su un post del 2006 di Raffaele Rialdi.  Sono passati gli anni e nulla è cambiato.
Ma le strutture tecniche che si occupano di web in queste banche, fanno finta di  niente oppure non capiscono neanche quale sia il problema?

La cosa è ancora più buffa (per non dire altro) se confrontata con il decalogo dell'ABI (Associazione Bancaria Italiana). A pagina 6, al fondo, si legge:
6. Quando inserite dati riservati in una pagina web, assicuratevi che si tratti di una pagina protetta: queste pagine sono riconoscibili in quanto l’indirizzo che compare nella barra degli indirizzi del browser comincia con “https://” e non con “http://” e nella parte in basso a destra della pagina è presente un lucchetto.
Stesso concetto è ribadito sempre dall'ABI in un comunicato stampa del 6 agosto 2007:

Verifica l’autenticità della connessione con la tua banca, controllando con attenzione il nome del sito nella barra di navigazione. Se è presente, “clicca” due volte sull’icona del lucchetto (o della chiave) in basso a destra nella finestra di navigazione e verifica la correttezza dei dati che vengono visualizzati.

Che dire? Speriamo che prima o poi certe banche decidano di leggere i decaloghi e i comunicati stampa della loro associazione, l'ABI.

Firefox lento con Asp.net Development Server

A futura memoria!

Firefox è particolarmente lento quando lo si usa per navigare un sito in sviluppo sotto Visual Studio 2005.
Quest'ultimo utilizza un piccolo web server interno per mostrare il sito: Asp.net Development Server (webdev.webserver.exe). Personalmente ho riscontrato il problema con Vista Business.

Soluzione: modificae un parametro di configurazione di Firefox.
  • about:config
  • impostare network.dns.disableIPv6 a true

mercoledì, luglio 02, 2008

Generics in C#: considerazioni dopo tre anni

Secondo me i Generics sono una delle feature più interessanti introdotte in NET 2.0.  Ormai sono quasi tre anni che li uso e mi rendo conto che semplificano enormemente la vita. Poter controllore già a compile-time la correttezza dei tipi fa risparmiare molto tempo e mal di testa.
Il primo uso è sicuramente nelle "liste" & affini:  poter lavorare con List<MiaClasse> invece che con ArrayList è tutta un'altra vita. Discorso analogo con Dictionary<A, B>, ecc.
Ci sono poi i delegate e metodi generics. Ad esempio: Comparison<T> , EventHandler<T> , ecc.  E Comparer<T>  nei metodi.

Per chi vuole approfondire il discorso sui generics facendo una comparazione anche con Java e C++ consiglio di leggere:

venerdì, giugno 20, 2008

Firebug e Firecookie

Un paio di tool molto utili per lo sviluppo web: FireBug e FireCookie.

Il primo è un plugin per Firefox che permette di vedere il codice javascript e scovare bug ed errori (oltre ad altre cose interessanti). Il secondo, FireCookie, è un plugin per FireBug che permette di vedere e modificare i cookie impostati durante la navigazione di un sito.
Entrambo molto utili.








venerdì, giugno 13, 2008

Use an internal class from another assembly

In big projects many classes has marked as internal. Tipically they are classes for internal activities and nobody needs to reference them from outside the assemply.

But, when you're developing you need to call them directly for testing/debugging. But... you cannot do that. The classes are internal.

There is a solution: mark the assembly as "friend" of another. An example: 2 assembly. MyLib with namy internal classes. DevTestApp, the test/development application with reference to MyLib. In the MyLib source code add:

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("DevTestApp")]

Now, from DevTestApp you can use public and internal classes from MyLib.


More details: http://msdn.microsoft.com/en-us/library/0tke9fxk(VS.80).aspx

giovedì, maggio 29, 2008

Asp.net "full" compile from Visual Studio

Asp.net automatically compiles aspx pages. The code-behind is compiled in different ways dependingif you choose to work with "Asp.Net web application" project or with a "Asp.net web site".
When you work on an aspx in visual studio and you build the project/solution, VS compile the code-behind of the aspx page. But not the code in the aspx itself. The aspnet engine will compile the aspx page the first time it will be requested.

OK. Fantastic... but.... if you did an error, also a simple syntax error, you'll get evidence of it when you page will run. Not good. I'd like to do "full compile" to check all the code.

An example: this code does not work. But Vs2005 does not show any errors.

<script runat="server">
public
static int Test()
{

return "text";

}

</script>



Another example: this code has a syntax error. Met2 is wrong. Met1 is the righe name. But again vs2005 does not show any errors.


<%=WebApplication1.Class1.Met2()%>




The only solution I have found is to do a full compile using aspnet_compiler.exe after the build process of Visual Studio. Add the following command in the Post-build event of the project:

$(MSBuildBinPath)\aspnet_compiler.exe -p $(ProjectDir) -v /





Now, you are notified if there are errors in you aspx pages.




Obviously compilation requires more time!

lunedì, maggio 19, 2008

Bug di sicurezza su Debian: la questione vera è un'altra

Sembra che nel lontano 2006, per la precisione il 2 maggio, gli sviluppatori di Debian abbiano messo una specie di "patch" ad OpenSSL distribuito con la loro versione di Linux. Il problema è che la "patch" in realtà non è una patch ma peggio ha introdotto un BUG:
http://www.debian.org/security/2008/dsa-1571
http://www.debian.org/security/2008/dsa-1576

Il bug è venuto fuori in questi giorni. Poco male si dirà. Certo, dopo poche ore c'era già la patch. Perfetto. Ma.... la patch risolve il bug e il funzionamento di openssl su Debian dal giorno in cui la si installa. Quindi tutti i certificati & affini creati con OpenSSL prima dell'applicazione della patch sono vulnerabili. Cioè quelli degli ultimi 2 anni. Vedi comunicato di Verisign: revocare i certificati e rigenerarli. Buon divertimento.

Ma la questione vera è un'altra. Non mi riferisco al fatto che tutti i sistemi operativi hanno dei bug. Questo è ovvio e sostenere il contrario è stupido. Non faccio paragoni fra Win e Linux e Mac e SunSolaris e chi volete voi: la scelta di un sistema operativo è o dovrebbe essere dettata da una serie di valutazone che comprendono ma che non si limitano al numero di bug e patch. Non voglio neanche entrare nella polemica del TCO (Total Cost of Ownership) fra Win e Linux.

Il punto vero su cui riflettere è che 2 righe di codice errato possono creare un casino enorme!

Quindi meglio pensarci 1000 volte prima di modificare codice funzionante soprattutto se scritto da altri.

venerdì, maggio 02, 2008

Sql HeartBeat

A very useful (and free!) product: Sql HeartBeat from SqlSolutions.

Very simple to use: select a sql server, connect to them and it shows info about:
  • Waits
  • Seek time
  • Physical R/W
  • Cache hits
  • Process/Connection activity

A screenshot:


giovedì, aprile 17, 2008

Scaricare una GridView ed aprirla con Excel

Vabbè.... per chi non ha voglia di cercare con Google (come Andrea), ecco come salvare ed aprire con Excel una GridView da una pagina Asp.Net


Nella codice della pagina asp.net:


protected void Button_Click(object sender, ImageClickEventArgs e)
{
this.RenderToHtml(GVDetails, "foo.xls");
}


private void RenderToHtml(GridView gv, string fileName)
{
_bypassNormalVRISF = true;
Response.Clear();
Response.ContentType = "application/vnd.ms-excel";
Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
gv.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
}

private bool _bypassNormalVRISF = false;
public override void VerifyRenderingInServerForm(Control control)
{
if (_bypassNormalVRISF)
return;
else
base.VerifyRenderingInServerForm(control);
}


Per i dettagli su VerifyRenderingInServerForm vedere il sito MSDN. Comunque in 2 parole: molti (tutti?) dei controlli Asp.net devono essere creati al di sotto di <form runat="server">
Il metodo viene chiamato da questi controlli, tra cui GridView. L'implementazione standard di Page prevede che venga sollevata un eccezione se in quel momento la costruzione della pagina non è "al di sotto" di <form runat="server"> . Basta andare in override sul metodo e fargli fare una porcheria: saltare il controllo! Ovviamente è bene farlo solo quando serve: per questo c'è _bypassNormalVRISF.


[UPDATE: 29/10/2008]

Il pezzo di codice precedente funziona solo se nella GridView non sono presenti Control. Se è tutto testo OK ma se c'è anche un solo Control (ad esempio un Button), vengono sollevate eccezioni.
Soluzione: prima di eseguire il render in html, bisogna eliminare tutti i Control. Per fare questo il metodo riceve la lista delle colonne da eliminare. Inoltre, per non avere con il metodo VerifyRenderingInServerForm  basta copiare le righe della GridView in un oggetto Table creato al volo.

Codice:

public static void Export(string fileName, GridView gv, int[] skipColumns)
{
    List skipColumnsList = new List(skipColumns);
    using (StringWriter sw = new StringWriter())
    {
        using (HtmlTextWriter htw = new HtmlTextWriter(sw))
        {
            Table table = new Table();
            table.GridLines = GridLines.Both;

            if (gv.HeaderRow != null)
                table.Rows.Add(gv.HeaderRow);

            foreach (GridViewRow row in gv.Rows)                    
                table.Rows.Add(row);                    

            if (gv.FooterRow != null)
                table.Rows.Add(gv.FooterRow);

            foreach (TableRow row in table.Rows)
                RemoveCells(row, skipColumnsList);

            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
            HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
            table.RenderControl(htw);
            HttpContext.Current.Response.Write(sw.ToString());
            HttpContext.Current.Response.End();
        }
    }
}

private static void RemoveCells(TableRow row, List skipColumnsList)
{
    for (int i = row.Cells.Count - 1; i >= 0; i--)
        if (skipColumnsList.Contains(i))
            row.Cells.RemoveAt(i);
}


venerdì, aprile 11, 2008

Italiani... non sono poi così male!

Ecco una notizia che mi fa veramente piacere: Jeff Atwood ha donato 5000 dollari al progetto ScrewTurn.
Jeff si era impegnato a donare 5000 dollari ad un progetto open source in tecnologia NET. La scelta è caduta su ScrewTurn, un motore wiki basato su asp.net.
Cosa c'entrano gli italiani? Semplice: ScrenTurn è coordinato da Dario Solera di Milano.

Complimenti Dario!

Esempi di sviluppo insicuro

Ecco alcuni link dal blog di Raffaele Rialdi che illustrano come NON sviluppare applicazioni web:
Il primo è pazzesco: web.config leggibile, db pubblico, sa come utente del db, administrator per la web application. Una summa delle peggiori cose che si possono fare in una web application. E sono riusciti pure a bypassare la sicurezza di NET rendendo leggibile il web.config.

Il secondo, invece, è un po' più subdolo ed ha a che fare più con aspetti di "politica della sicurezza" che con questioni strettamente tecniche.

Entrambbi da leggere assolutamente, commenti compresi!

martedì, aprile 08, 2008

IIS6 StackOverFlow

Sometimes you need to run code with extensive use of stack due to recursive algorithms. But recursion (if very deep) can be very harmful for stack. I encountered such situation, in a particular use of iTextSharp. In my case, IIS 6 (w3wp.exe) crashed with an unknow exception that seemed to be thrown from kernel32.

I spent many hours trying to understand where the problem was. Using WinDbg and AdPlus I understood that the problem came from Net managed code, and after dumping the stack, it was clear which was the method(s).

First: it's not a library bug. If I reduce the work-load (number of input pdf files) it works perfectly. Second: the same piece of code, with the same input pdf files, runs perfectly from a command-line application. So, the problem is related to the IIS "environment".

Solution: increase the stack! Ok, but how ? Simple: running the code inside a thread with a bigger stack!
On IIS6 the "default" threads are created with 256 KB of stack. I haven't found a way to change it. But, from your asp.net code you can create and run a new thread with a bigger stack.

Example code (direct run):

protected void Button1_Click(object sender, EventArgs e)
{
this.Run();
}


private void Run()

{

//... code with or calling library with high use of stack

}



Passing trought a "working" thread (with 1 MB of stack):

protected void Button1_Click(object sender, EventArgs e)
{

this.RunAsSeparatedThread();

}


private void RunAsSeparatedThread()

{

Thread t = new Thread(Run, 1 * 1024 * 1024);

t.IsBackground = true;

t.Start();

t.Join();

}

private void Run()
{

//... code with or calling library with high use of stack

}

domenica, aprile 06, 2008

Inkscape

Some days ago I was looking for a free drawing tool. But not a raster (bitmap) editor. I need a vector editor (like Illustrator or Freehand).
After googling for a while, I found Inkscape www.inkscape.org . It's an opensource vector graphics editor. It's based on SVG standard (W3C standard). Simple but very powerful.



Subversion: primi test con Visual Studio 2005

Primi test con SubVersion e Visual Studio 2005. Risultato: funziona... ma che bel casino!


Al momento sto valutando 2 approcci diversi per l'integrazione frs SVN e VS2005:
TortoiseSVN sembra decisamente più stabile e robusto ma AnkhSVN è molto più comodo da usare: tutte le attività possono essere fatte all'interno di Visual Studio.
Inoltre TortoiseSVN ha strumenti molto più sofisticati per la gestione dei conflitti. Ovviamente si possono usare entrambi: Ankhsvn per le attività "normali", TortoiseSvn per quelle speciali e sofisticate.

Dopo vari casini sono riuscito a mettere su anche Apache con il ModSvn e ad attivare l'Https. A dire la verità i grossi casini sono più nel creare un certificato di prova https per Apache che impostare subversion.



[Update 16/04/2008]

Primi test seri di sviluppo multi-utente: qui cominciano i veri problemi!
Il grosso problema è la fase di merge: è abbastanza comune che 2 sviluppatori abbiano bisogno di mettere mano agli stessi file di codice sorgente. Ad esempio il primo modifica un metodo e il secondo ne aggiunge uno nuovo. Fin qui non ci sono grossi problemi: il più delle volte Ankhsvn è in grado di fare il merge in automatico. In altri casi invece, non riesce a risolvere i conflitti è l'unica è risolverli "a mano" con TortoiseMerge: per ogni riga e/o blocco in conflitto bisogna decidere chi vince oppure se farli vincere entrambi. Se i 2 sviluppatori di prima aggiungono entrambi un nuovo metodo nella stessa zona di codice, si crea un conflitto.



In questo caso è probabile che la soluzione sia di farli convivere entrambi nella file finale.




Ma i veri casini arrivano quando si iniziano ad usare elementi gestiti in modo più o meno automatico da VS2005. Un esempio per tutti: i Typed DataSet. Personalmente li uso molto e come purtroppo immaginavo creano grossi problemi a Subversion. O meglio: subversion crea grossi problemi ai typed dataset. Il problema come al solito è il merge. C'è un dataset che ha già una datatable, 2 utenti lo modificano, ad esempio aggiungendo una datatable a testa. Ovviamente c'è un problema di merge. Ma il typed dataset è più complesso di un semplice file .cs. In gioco ci sono 4 file:
  • MyDS.xsd : dataset vero e proprio (xml)
  • MyDS.Deseigner.cs : file di codice autogenerato da VS2005
  • MyDS.xsc : autogenerato da vs2005
  • MyDS.xss : autogenerato da vs2005. Contiente le informazioni per la rappresentazione a video degli elementi (coordinate xy, larghezza, ecc.)
Il conflitto si può presentare su tutti e 4 i file ma il più importante è il file XSD. Nel mio caso con il tool di Merge ho risolto il conflitto anche se lavorare e muoversi all'interno del xml di un XSD non è la cosa più agevole di questo mondo. Il risultato, dopo vari click e calci in quel posto ai tool coinvolti è stato:




Ma... non è finita. Provo a muovere una tabella e mi becco un bel errore da VS2005.



Dopo vari tentativi, ho cancellato il file .xss e Designer.cs. A questo punto VS li crea nuovamente e tutto sembra tornare a funzionare.

Conclusione (per ora): continuo a fare prove ma non porto nulla in produzione. Subversion e compagni mi convincono ogni giorno sempre di meno.

lunedì, marzo 03, 2008

Ghostscript without dependencies

Ghostscript is one of the most powerful Postscript/Pdf engine I have ever used. It can convert Ps to Pdf, Pdf to Ps, rasterize Pdf and Ps to Jpeg, Tiff, Bmp and so on.
But Ghostscript requires many files to run. When you install it, they are placed in the lib and resource folders (plus some fonts placed in the font folder). During the installation process, some entries are also placed in the registry (on Windows systems).
So, if you need to run Ghostscript on a machine, you need to install it.

There is a way to include all the needed file into the ghostscript dll: compile it using the option COMPILE_INITS=1. The resulting dll is bigger than the normal: 8.7 MB instead of 3.5 MB. It contains all the needed files. To run ghostsfcript you need only gswin32c.exe and gsdll32.dll.

I have compiled ghostscript 8.62 using Visual Studio 2005.

Donwload the source code from SourceForge and from the VS2005 command line, run:

nmake -f src\msvc32.mak DEVSTUDIO= COMPILE_INITS=1 MSVC_VERSION=8 GS_LIB_DEFAULT = "./lib/;./font;$(GSROOTDIR)/lib;$(AROOTDIR)/fonts"



UPDATE: AFAIK Ghostscript is compiled with COMPILE_INITS=1 starting from version 8.63. So, you don't need to compile it by yourself.

.

venerdì, febbraio 08, 2008

Il mito degli "anni di esperienza"

Ieri è uscito un bel articolo sul blog di Jeff Atwood: The Years of Experience Myth (in inglese).
In sostanza Jeff mette in discussione uno degli elementi base usati da molte società di informatica o di recruitment durante la selezione del personale: gli "anni di esperienza".

Non posso che essere d'accordo con lui. Sostiene le stesse cose che mi è capitato più volte di dire: gli anni di esperienza non hanno alcun valore in quanto tali. Quello che conta realmente è la capacità di imparare, di aggiornarsi, di affrontare e di risolvere i problemi.
Ma, attenzione, tutto questo non vale solo nel campo dell'ICT. Anche quando facevo i corsi in Croce Rossa il messaggio che davo era sempre lo stesso: non basta essere "vecchi", cioè con molti anni di esperienza sulla strada, per essere dei buoni soccorritori. Ho conosciuto ottimi soccorritori usciti da pochi mesi dai corsi e pessimi soccorritori con molti anni di attività sulle spalle.

Tornando al settore ICT, sapere ad esempio che tizio ha lavorato 5 anni su Java non vuol dire niente. Bisogna invece capire che cosa ha fatto, come lo ha fatto, da dove è partito e dove è arrivato. 5 anni passati a fare manutenzione ad un'applicazione java che fa query su DB e che crea semplici tabelle html è quanto meno poco interessante. Meglio una persona che lavora da 1 solo anno su java ma che ha affrontato problemi ben più complessi.

Non voglio dire che l'esperienza non conti nulla, anzi. Sono il primo a sostenere che affrontare problemi reali in ambito lavorativo sia importantissimo. Ma la qualità del lavoro e dell'esperienza non si basa sul tempo "passato" ma dal come si è lavorato: curiosità, volontà di migliorarsi e di imparare cose nuove.

martedì, gennaio 29, 2008

Convert int[] to string[]

It's very common to need to convert an array of type T1 to an array of type T2.
Net 2.0 offers an interesting static member of the Array class: ConvertAll.
Using anonymous methods (MSDN) in conjunction with ConvertAll, you can convert an array of "simple" type to an array of another "simple" type in only ONE line of code.

An example: int[] to string[]

int[] inInt = new int[] { 47, 46, 45, 101 };

string[] outStr = Array.ConvertAll<int, string>(inInt, new Converter<int, string>(delegate(int x) { return x.ToString(); }));


or (smaller):

string[] outStr = Array.ConvertAll<int, string>(inInt, delegate(int x) { return x.ToString(); });


You can also convert string[] to int[]:

int[] outInt2 = Array.ConvertAll<string, int>(outStr, delegate(string s) { return int.Parse(s); });



If you need to convert between more complex type, probably you need more code in the delegate body. But the idea is the same: use a delegate as a converter between 2 types.

domenica, gennaio 27, 2008

Sviluppo "parallelo"

Ormai sono anni che i processori sono a tutti gli effetti dei "multi"processori. Si era iniziato con l'HyperThreding, poi i Dual Core, poi i QuadCore ed avanti così. Ma per gli sviluppatori la domanda è: ma ve ne fate realmente qualcosa di questi oggetti che sono in grado di eseguire più istruzioni in parallelo? Per molti la risposta è: NO! Ed il motivo è molto semplice: le applicazioni Console e Windows Form che sviluppano sono intrinsecamente mono-processo, o meglio mono-thread. Discorso a parte ovviamente per le applicazioni web tipo asp.net: questo effettivamente è un mondo effettivamente multi-thread.
Lo sviluppo parallelo non sempre è applicabile. Anzi sovente la logica è instrinsecamente lineare e non ci sono spazi per parallelizzarla. In altri casi invece questo è possibile. Ma qui iniziano i dolori. Senza un adeguato supporto fornito dal linguaggio/framework è molto oneroso (e tedioso) gestire i vari thread paralleli. Ed è forse per questo che, a meno di situazioni particolari in cui le performance sono fondamentali, si rinuncia allo sviluppo "parallelo" e si rimane sul tranquillo "seriale".
Come ho detto in precedenza, l'hardware è ormai molto avanti. Il software (sviluppo e framework) è ancora un po' indietro. Ma le cose stanno cambiando: un segno è l'uscita come Community Tecnology Preview di Parallel Extensions to .NET. Questa libreria fornisce una serie di estensioni a NET 3.5 per supportare in modo nativo una serie di costutti paralleli. Vedi articolo su MSDN Magazine.

martedì, gennaio 08, 2008

Typed dataset: consigli e tips

L'utilizzo dei typed dataset in Visual Studio 2005 semplifica e velocizza molto la scrittura di codice per l'accesso ai dati, quello che comunemente viene chiamato DAL (Data Access Layer). Ma i problemi sono dietro l'angolo....

Vedi: http://docs.google.com/Doc?id=dchmct9k_152cj9qfgdm

Come al solito, i commenti sono i benvenuti.

domenica, gennaio 06, 2008

compilation debug="true"

In web.config, tra le altre cose, c'è la modalità di compilazione. Durante lo sviluppo dovrebbe essere impostata a true: <compilation debug="true" />
Ma quando si porta l'applicazione in produzione, è importante ricordarsi di impostarla a false.
Questo per una lunga serie di motivi:
  • timeout: con true le pagine asp.net non vanno mai in timeout. Ottimo per il debug, disastroso in produzione.
  • compilazione batch: compilazioni più lenta con true.
  • ottimizzazione del codice: se true, non c'è ottimizzazione del codice. Performance peggiori.
  • utilizzo memoria: maggiore utilizzo di memoria con true
  • ... altri motivi
Attenzione: l'opzione di debug di compilation all'interno di web.config, non è la stessa cosa dell'opzione debug/release di Visual Studio. La prima ha effetto sulla compilazione "al volo" di asp.net e su come l'applicazione asp.net è eseguita da IIS (vedi timeout). La seconda invece ha effetto sulle dll compilate da Visual Studio.


Per maggiori info (in inglese):

Fiddler and Visual Studio 2005

There are some problem using Fiddler with Visual Studio 2005 Development Server (Cassini). In particular if you're using IE7 and Vista.
On many blogs there are many workarounds and tips. The only that works with me is to add a new entry in the HOSTS file (C:\Windows\System32\drivers\etc). In my case, I added:
127.0.0.1 myself
Now, the url in Ie7 will be http://myself:51784/page.aspx. It works both with and without Fiddler runnig.

mercoledì, gennaio 02, 2008

GridView, UpdatePanel e doppi click

Su vari post ho letto di persone che hanno problemi con GridView contenute in UpdatePanel Ajax.
Anche io ho trovato vari problemi. Il più strano è la necessità di premere 2 volte i linkbutton perchè questi facciano il loro lavoro. In realtà il postback avviene 2 volte ma la prima volta sembra andare perduto. La seconda volta funziona.
Facendo un po' di ricerche e di debug sembra che il primo post venga gestito come un"postback ajax" (passatemi questo termine) mentre il secondo è un trattato come un vero postback.
La soluzione che ho trovato è quello di registrare la GridView nella collezione dei Trigger del UpdatePanel che la contiene. Il trigger deve essere un PostBack e non un AsyncPostBack. In questo modo LinkButton tornano a funzionare al primo colpo.


<asp:updatepanel id="updtPnl" runat="server" updatemode="Conditional">
<contenttemplate>
<asp:gridview id="GV1">
.....
<asp:gridview>
</contenttemplate>
<triggers>
<asp:PostBackTrigger ControlID="GV1" />
<triggers>
<asp:updatepanel>


Anche la documentazione ufficiale relativa a PostBackTrigger sembra confermare questo uso. Non capisco però perchè funzioni con click in sequenza. Boh...


Probabilemente i problemi sono dovuti anche alla struttura abbastanza annidata dei componenti della mia pagina asp.net. In successione i "contenitori" sono:
- master page
- content page
- multiview
- view
- updatepanel
- gridview
- linkbutton (o imagebutton)


Sinceramente non ho fatto prove con una struttura più semplice. Appena trovo 10 minuti...