Archivio

Articolo taggato ‘programmazione’

c# Try/Catch cost

June 9th, 2009 5 comments

Oggi in ufficio è uscito il discorso performance, strutture di programmazione e ottimizzazione. Il dialogo si è particolarmente acceso sull’argomento "uso del try / catch". Ma quel’è il reale costo del try / catch?

Partiamo da un presupposto: il codice c# è ottimizzato dal compilatore. Ottimizzare il codice che scriviamo noi comporta anche strutturare gruppi di istruzioni più atomici possibili. In questo modo il compilatore può lavorare al meglio. Inoltre è buona regola prevedere le eccezioni, piuttosto che gestirle.

Leggi tutto…

.Net Framework 3.5 (full)

April 16th, 2009 6 comments

Per chi sviluppo in ambiente Microsoft l’ultimo elemento ufficiale necessario si chiama .Net Framework 3.5. Il framework non è altro che un insieme di librerie ed oggetti precreati che vi permettono di avere la vita notevolmente facilitata.

Leggi tutto…

Silverlight vs Flash

April 2nd, 2009 No comments

Da qualche settimana sto studiando Silverlight, il Flash di Microsoft per intenderci. Ho iniziato come sviluppatore Flash e il passaggio non è stato facile. Devo però ammettere che per le aziende con know how microsoft/.net/c# è il prodotto che mancava. I tool visuali di sviluppo (blend) non sono ancora il massimo, molto distanti dal Flash editor, però è appena nato.

Leggi tutto…

Vbscript e campi text

January 27th, 2009 No comments

Una pillola a mo’ di segnalibro. Purtroppo vbscript nativamente non è compatibile con i campi di SQL Server di tipo text / ntext. O meglio non viene prodotto un errore particolare, ma il valore di output è sempre vuoto.

Per risolvere il problema bisogna settare la proprità CursorLocation della connessione ADO DB, in modo che venga utilizzato un cursore client-side.

<%
set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open(Server.Mappath("northwind.mdb"))
set rs=Server.CreateObject("ADODB.recordset")
sql="SELECT * FROM Customers"
rs.CursorLocation=adUseClient
rs.CursorType=adOpenStatic
rs.LockType=adLockBatchOptimistic
rs.Open sql,conn
rs.Close
conn.Close
%>

Esempio tratto da AdoDb di w3school. Al posto di adUseClient possiamo usare il valore 3.

VBScript: convertire in stringa

January 26th, 2009 No comments

Uno dei maggiori difetti di VBScript è la gestione del tipo di dato. In realtà VBScript non è dichiarativo, però ha comportamenti strani, specie quando legge i dati da un recordset, in quanto eredità il tipo di dato del recordset e da grossi problemi al momento in cui si effettuando delle operazioni booleane di confronto.

Dopo 1000 tentativi di uso delle varie funzioni di conversione tipo (CStr, CInt, …) ho dedotto che il metodo migliore è confrontare delle stringhe, e che la migliore conversione in stringa è quella di aggiungere a un dato un carattere (come si faceva antetempo…).

Ecco quindi un codice ignorante per risolvere il problema:

'converto in stringa
Function ToString(s)
    'debug(s)
    if (isNull(s)) then
        ToString = ""
    else
        tmp = s & "a"
        tmp = left(tmp,len(tmp)-1)
        ToString = tmp
    end if
End Function

Buona settimana cari.

Deserialize Dictionary

January 21st, 2009 No comments

Dopo infiniti debug ad una applicazione infimissima in c# abbiamo finalmente trovato la soluzione, utilizzando il miglior debug e solution solver in commercio. E’ un prodotto assolutamente gratis e usabile da tutti, in pieno stile 2.0: si chiama Google.

Ringrazio subito Miha Markič e Brent Challis per la preziosa collaborazione, anche senza che io gli avessi detto niente. Devono essere dei veri e propri guru :)

 

Problema

Non si riescie a deserializzare (da binario) un oggetto di tipo Dictionary, o meglio una classe che eredita un oggetto di tipo Dictionary<(Of <(TKey, TValue>. L’errore del compilatore (VS9 in ambiente .net 2.0) è:

{"Impossibile trovare il costruttore richiesto per deserializzare un oggetto di tipo '<Namespace>.<ClassName>'."}

 

Soluzione

L’oggetto Dictionary è serializzabile in quanto implementa l’interfaccia ISerializable. Al suo interno (classe base) è definito però un costruttore necessario alla deserializzazione:

protected Dictionary(SerializationInfo info, StreamingContext context);

E’ quindi necessario che nella nostra classe, che eredita Dictionary, quindi tutti i  suoi metodi ma non i suoi costruttori, implementare tale costruttore basato su classe base in questo modo:

public <ClassName>(SerializationInfo si, StreamingContext sc):base(si,sc){}

 

E il gioco è fatto! Grazie Franz per l’appoggio morale, e riprendi in mano il tuo blog che era eccezionale!

Creare data in Vbscript

December 4th, 2008 2 comments

Uno dei più grandi difetti dell’obsoleto VBScript è la gestione delle date. Il buco più grosso è che la creazione di una data è affidata alla funzione CDate, che accetta un oggetto di tipo Date.

Questo oggetto accetta vari formati di data, compreso quello con il mese in formato verboso (vedi sintassi). Il problema è che se noi gli diamo in pasto una data in formato numerico tipo "12/12/2008" lui riconosce la posizione del mese in base al settaggio del formato locale del server: TERRRRRRRRRRRRRRRIBBBBBBBBBBBBBBBBBILE!!!

Come ovviare? Dopo aver imprecato qualsiasi entità superiore buona o cattiva ho trovato una soluzione blasfemica, ma funziona: usiamo il verbose mode.

Creiamo un array per valorizzare il mese:

Dim elencoMesi(12)
    elencoMesi(0) = "January"
    elencoMesi(1) = "February"
    elencoMesi(2) = "March"
    elencoMesi(3) = "April"
    elencoMesi(4) = "May"
    elencoMesi(5) = "June"
    elencoMesi(6) = "July"
    elencoMesi(7) = "August"
    elencoMesi(8) = "September"
    elencoMesi(9) = "October"
    elencoMesi(10) = "November"
    elencoMesi(11) = "December"

Quindi creiamo una stringa di data e tempo in formato para verboso:

tmpDateReg2S = elencoMesi(MM-1) & " " & DD & ", " & YYYY & " " & HH & ":" & NN & ":" & SS)

E il gioco è fatto. Avete altre soluzioni più decenti voi?

ps.: NN sono i minuti!

Javascript: gestire gli eventi

July 23rd, 2008 No comments

Oggi ho trovato un interessante articolo su Javascript e sulla gestione degli eventi. Uno script che secondo l’autore è un po’ datato, ma che pare sia ancora attualissimo.

Non vengono usati prototype, jQuery o altri framework javascript. Solamente un paio di funzioni: addEvent, removeEvent.

function addEvent(obj, type, fn){
if (obj.attachEvent) {
obj[’e’ + type + fn] = fn;
obj[type + fn] = function(){
obj[’e’ + type + fn](window.event);
}
obj.attachEvent(’on’ + type, obj[type + fn]);
}
else
obj.addEventListener(type, fn, false);
}

function removeEvent(obj, type, fn){
if (obj.detachEvent) {
obj.detachEvent(’on’ + type, obj[type + fn]);
obj[type + fn] = null;
}
else
obj.removeEventListener(type, fn, false);
}

Utilizzare le due funzioni è veramente molto semplice:

addEvent(document.getElementById('my_elem'),'click',foo);

Con la chiamata di addEvent, l’elemento "my_elem" avrà un evento legato al click che chiamerà la funzione foo!

via GregWolejko

(mscorlib)Insufficient system resources exist to complete the requested service

June 19th, 2008 No comments

Ho creato un’applicazione .net che prende in carico dei file e poi li elabora e li risalva in HD. Il problema è che tali file devono essere gestiti completamente in memoria, e che con grandi file, il buon Windows 2003 risponde:

(mscorlib)Insufficient system resources exist to complete the requested service

Pare che mamma microsoft dia però una soluzione (kb 304101):

 

1 Click Start, click Run, type regedit in the Open box, and then click OK.
2. Locate and then click the following registry subkey:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
3. On the Edit menu, point to New, and then click DWORD Value.
4. Type PoolUsageMaximum as the entry name, and then press ENTER.
5. Right-click PoolUsageMaximum, and then click Modify.
6. Click Decimal.
7. In the Value data box, type 60, and then click OK.

Important

Use 60 as your initial value. If your backup does not succeed, use 40 as your value. If that does not work, you must change the behavior of your backup program to reduce the demand of paged pool. If the value works, you may want to increase the value by approximately 25 percent until the backup does not work. If the backup is unsuccessful, use the second registry setting that is described in this article.
Make sure that the value for this registry setting is not more than 60.
If you are using the /3GB switch, use 40 as your initial setting. Note that this value is a percentage value.
8. Quit Registry Editor.
9. Restart your computer.

Ciao!

Active Server Pages, ASP 0131

May 27th, 2008 3 comments

Se vi capita l’errore "Active Server Pages, ASP 0131" significa che state usando degli include server side, in modalità file, e che il vostro server web non supporta i percorsi parent, cioè il classico "..". Esempio:

<!--#include file="../Application.asp" -->

Per risolvere questo problema, è sufficiente abilitare in IIS nel sito web, o nel sito predefinito, la navigazione verso le directory parent. Negli IIS inglesi questa opzione la trovate nelle proprietà del sito > home directory > configuration > option > e mettete il check su "Enable Parent Paths".

Nella versione italiana invece è: proprietà del sito > Home directory > Configurazione… > Opzioni > e ceccate "Abilita percorsi principali".

Notte…

Categorie: Web Mania Tag: , ,