lunedì 6 dicembre 2010

Shrink dei file di log per tutti i db su SQL Server 2008

Ad integrazione del mio precedente post del 24/06/2009, in cui proponevo uno script per fare lo Shrink del file di log di tutti i DB su un server SQL Server 2005, ecco lo script per Sql Server 2008:

EXECUTE sp_msforeachdb
'USE ?;

Alter Database ? Set Recovery Simple;
Alter Database ? Set Recovery Full;

DECLARE @LogLogicalName nvarchar(100);
SELECT @LogLogicalName = file_name(2);

dbcc shrinkfile(@LogLogicalName, 1);

dbcc shrinkfile(@LogLogicalName, 1);

dbcc shrinkfile(@LogLogicalName, 1);

dbcc shrinkfile(@LogLogicalName, 1);'

giovedì 18 novembre 2010

Confronto con password criptate in Aspnet_Membership

Ultimamente mi sono trovato ad affrontare un problema singolare, ovvero la necessità di confrontare una password inserita da un utente su un programma client Windows Form con una password memorizzata e gestita da Asp.net, nella tabella Aspnet_Membership.

Il problema principale è che la password di Asp.net è salvata criptata e non possibile decrittarla. L'unica cosa da fare, quindi, è quella di crittare allo stesso modo la password che abbiamo in chiaro e confrontare i due valori criptati. Per fare questo è necessario però il "Salt", ovvero il valore che Asp.net si salva nella colonna PasswordSalt sempre su Aspnet_Membership.

Ecco a voi la procedura (mi scuso ma non ho avuto tempo di sistemare i colori :D ):

VB.Net


Public Function Confronta(ByVal password As String, ByVal aspnetSalt As String, ByVal aspnetPassword As String) As Boolean
    Dim isEqual As Boolean = False
    If aspnetPassword = GenerateHash(password, aspnetSalt) Then
        isEqual = True
    End If
    Return isEqual
End Function

Private Function GenerateHash(ByVal pwd As String, ByVal salt As String) As String
    Dim p1 As Byte() = Convert.FromBase64String(salt)
    Return GenerateHash(pwd, p1)
End Function

Private Function GenerateHash(ByVal pwd As String, ByVal saltAsByteArray As Byte()) As String
    Dim sha As New System.Security.Cryptography.SHA1CryptoServiceProvider()
    Dim p1 As Byte() = saltAsByteArray
    Dim p2 As Byte() = System.Text.Encoding.Unicode.GetBytes(pwd)
    Dim data() As Byte = New Byte(((p1.Length + p2.Length)) - 1) {}
    p1.CopyTo(data, 0)
    p2.CopyTo(data, p1.Length)
    Dim result As Byte() = sha.ComputeHash(data)
    Dim rtn As String = Convert.ToBase64String(result)
    Return rtn
End Function


C#

public boolean Confronta(string password, string aspnetSalt, string aspnetPassword)
{
    boolean isEqual = False
    If (aspnetPassword = GenerateHash(password, aspnetSalt))
    {
        isEqual = True
    }
    return isEqual
}

private string GenerateHash(string pwd, string saltAsBase64)
{
    byte[] p1 = Convert.FromBase64String(saltAsBase64);
    return GenerateHash(pwd, p1);
}

private string GenerateHash(string pwd, byte[] saltAsByteArray)
{
    System.Security.Cryptography.SHA1 sha = new System.Security.Cryptography.SHA1CryptoServiceProvider();

    byte[] p1 = saltAsByteArray;
    byte[] p2 = System.Text.Encoding.Unicode.GetBytes(pwd);

    byte[] data = new byte[p1.Length + p2.Length];

    p1.CopyTo(data, 0);
    p2.CopyTo(data, p1.Length);

    byte[] result = sha.ComputeHash(data);

    string res = Convert.ToBase64String(result);
    return res;
}

venerdì 12 novembre 2010

Prima lettera maiuscola (Capitalize) in Sql Server

C'è un modo molto semplice per fare, in Sql Server (con T-SQL) quello che in inglese si chiama "Capitalize", ovvero rendere una stringa con la prima lettera maiuscola e tutto il resto in minuscolo.

Se la necessità è solo in output, basta usare la seguente SELECT:

SELECT UPPER(LEFT(Colonna,1)) + LOWER(SUBSTRING(Colonna,2,LEN(Colonna))) FROM Tabella


Se, invece, la necessità è quella di modificare i da dati nel database:

UPDATE Tabella SET Colonna=UPPER(LEFT(Colonna,1)) + LOWER(SUBSTRING(Colonna,2,LEN(Colonna)))

venerdì 9 luglio 2010

Asp.Net Menu: eliminare una voce a runtime

A volte capita di avere l'esigenza di eliminare dal menu di una web application in aspnet un menu (o un sottomenu) al verificarsi di qualche particolare condizione. Il problema è che il componente in questione non mette a disposizione a runtime un metodo per nascondere un menuitem. Ecco quindi come fare:

Protected Sub Menu1_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Menu1.PreRender
    If CONDIZIONE Then
        'elimino il menu che non mi serve
        Dim tot As Integer = Menu1.Items.Count - 1
        Dim i As Integer = 0
            While i <= tot
            Dim ss As MenuItem = Menu1.Items(i)
            If ss.Text.ToLower = "nome menu" Then
                'elimino i sotto menu
                Dim subtot As Integer = Menu1.Items(i).ChildItems.Count - 1
                Dim j As Integer = 0
                While j <= subtot
                    Menu1.Items(i).ChildItems.RemoveAt(0)
                    j += 1
                End While
                'elimino il menu
                Menu1.Items.Remove(ss)
                i = i - 1
                tot = tot - 1
            End If
            i += 1
        End While
    End If
End Sub

martedì 29 giugno 2010

Asp.Net Menu: Chrome, Safari e Opera

In passato avevo già pubblicato un post che riguardava il non corretto funzionamento del componente Asp.Net Menu con IE8. Oggi mi occupo invece dei problemi che di verificano visualizzando web application con questo componente attraverso browser diversi, precisamente con Chrome, Safari ed Opera.

Con questi browser, infatti, il menu non funziona correttamete (scompare se cliccato).

Per renderlo funzionate, bisogna aggiungere alle pagine in cui è presente il menu (generalmente, se l'applicazione segue le guidelines, basta la pagina master) il seguente codice all'interno dell'evento Page_Init:

[VB.Net]
If Request.UserAgent.Contains("AppleWebKit") Then
    Request.Browser.Adapters.Clear()
End If

[C#]
If Request.UserAgent.Contains("AppleWebKit") Request.Browser.Adapters.Clear() ;

venerdì 28 maggio 2010

Leggere e Scrivere con Cassanda in VB.Net

Ecco un primo esempio di applicazione in vb.net che scrive e legge dei dati su Cassandra utilizzando l’interfaccia HectorSharp (http://hectorsharp.com/). Basta scaricare il progetto HectorSharp e compilarlo per avere le librerie necessarie allo scopo. Ovviamente, bisogna creare il riferimento alla libreria di HectorSharp nel nostro progetto.

In questo esempio utilizzeremo il keyspace di default installato con Cassandra (Keyspace1) e una column family sempre di default (Standard1).

Creeremo nella column family una column che chiameremo "MyColumn" e ci metteremo dentro un valore.

Per questo esempio utilizzeremo un’applicazione Web in cui ci sarà una label, denominata “lbltest”, in cui visualizzeremo il valore che recupereremo da Cassandra.

Imports HectorSharp

[…]

'connessione al db
Dim cf As New KeyedCassandraClientFactory(New CassandraClientPoolFactory().Create(), _
New KeyedCassandraClientFactory.Config())
Dim client = cf.Make(New Endpoint("localhost", 9160))

'definizione db (keyspace)
Dim keyspace = client.GetKeyspace("Keyspace1")

'Dim path = New ColumnPath(nome columnfamily, nome supercolumn, nome column)
Dim path = New ColumnPath("Standard1", "", "MyColumn")

'inserimento di un valore in db
keyspace.Insert("0", path, "My new value")

'recupero del valore
Dim column As Column = keyspace.GetColumn("0", path)

lbltest.Text = column.Value


Come potete vedere, lavorare con Cassandra utilizzando HectorSharp è veramente molto semplice ed intuitivo.

Installazione di Cassandra su Windows

Installare Cassandra Project (http://cassandra.apache.org/) su Windows è molto semplice, forse più semplice che su Linux.

Essendo un motore DB scritto in Java, l'unico prerequisito di cui necessita è che sulla macchina su cui si vuole far girare Cassandra ci sia installato Java 1.6 (Conviene utilizzare sempre il JDK più aggiornato).

Dopo aver installato Java, bisogna scaricare l'archivio tar.gz dal sito ufficiale e scompattarlo in una cartella a scelta (In questo esempio utilizzeremo "C:\Cassandra").

Ora, bisogna fare un minimo di configurazione. Aprire il file "C:\Cassandra\conf\storage-conf.xml" e cambiare i valori di default dei nodi sottostanti in questo modo:

<commitlogdirectory>C:\Cassandra\commitlog</commitlogdirectory>
<datafiledirectories>
<datafiledirectory>C:\Cassandra\data</datafiledirectory>
</datafiledirectories>

Nota: è buona norma utilizzare due dischi diversi per i commitlog e per i dati.

Infine, bisogna settare come variabile di sistema "CASSANDRA_HOME" con valore "C:\Cassandra"

Fatto questo, si può lanciare il file "C:\Cassandra\bin\cassandra.bat" per far partire il server.

Ok, a questo punto il vostro server Cassandra sarà "up-n-running".


Per testare se tutto è ok, potete lanciare "C:\Cassandra\bin\cassandra-cli.bat" e poi dare il comando:

connect localhost/9160

Se tutto funziona la risposta sarà "Connected to: "Test Cluster" in localhost/9160 "


Buon lavoro :)

lunedì 8 febbraio 2010

Creare un collegamento dalla linea di comando

Per creare un collegamento a un file o ad una cartella generalmente si utilizza l'interfaccia grafica. Per scopi particolari (script, file batch) è possibile però utilizzare i comandi che sono messi a disposizione dalla shell di comandi.

I comandi da utilizzare sono:

mklink "Nome Collegamento" c:\Cartella\Sottocartella\nomefile.txt

oppure

mklink "Nome Collegamento" c:\Cartella\Sottocartella


Questi comandi creano il collegamento chiamato "Nome Collegamento", che punta alla cartella o al file specificato.

Attenzione: il collegamento viene creato nella cartella in cui viene lanciato il comando.

martedì 5 gennaio 2010

God Mode su Windows 7

Windows 7 (e in verità anche Windows Vista) dispone di una modalità nascosta che si chiama "God Mode". In pratica, con un piccolo escamotage è possibile accedere a un Pannello di Controllo Esteso con una miriade di funzioni.

Si parla di tutte le personalizzazioni possibili e immaginabili che Microsoft ha previsto per i suoi sistemi operativi. Nessun filtro e quindi grande libertà di movimento.

La procedura è semplice: basta cliccare con il tasto destro del mouse sul desktop e creare una nuova cartella. Dopodiché è sufficiente rinominarla in:

GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}

Fatto questo comparirà un'icona di collegamento ad una comoda interfaccia. L'unica avvertenza è che il trucco sembra non funzionare bene con le versioni a 64 bit, dove si rischiano fastidiosi crash.