Pagine

venerdì 13 gennaio 2012

Ombra e sfumature cross browser con css e filtri

Per creare un'ombra con i css possiamo fare in questo modo:
.cross-browser-shadow{
-moz-box-shadow: 2px 2px 3px #333333;
-webkit-box-shadow: 2px 2px 3px #333333;
box-shadow: 2px 2px 3px #333333;
-ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=3, Direction=135, Color='#333333')";
filter: progid:DXImageTransform.Microsoft.Shadow(Strength=3, Direction=135, Color='#333333');
}

Analogamente per la sfumatura dal rosso (#FF0000) al verde (#00FF00):
.cross-browser-gradient{
background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), to(#00ff00));
background: -moz-linear-gradient(top, #ff0000, #00ff00);
background: -webkit-linear-gradient(top, #ff0000, #00ff00);
background: linear-gradient(top, #ff0000, #00ff00);
background: -ms-linear-gradient(top, #ff0000, #00ff00);
filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#ff0000', EndColorStr='#00ff00');
}

Qui puoi vedere un esempio

Redirect 301

Ciao a tutti oggi vediamo come fare un redirect 301 in ASP.NET. Semplicemente occorre effettuare la seguente procedura:
HttpContext.Current.Response.StatusCode = 301;
HttpContext.Current.Response.Status = "301 Moved Permanently";
HttpContext.Current.Response.AddHeader("Location", "NUOVO INDIRIZZO");

mercoledì 11 gennaio 2012

Recuperare i colori da un file CSS

Ciao a tutti in questo post volevo mostrarvi un modo per recuperare tutti i colori all'interno di un file css e di creare una pagina html con tutti i colori ritrovati. Passatemi il modo un pò spartano che utilizzo per generare il tutto.
List collection = new List();
StringBuilder res = new StringBuilder();
string text = File.ReadAllText(@"NOME_DEL_FILE_DA_CUI_PRENDERE_I_VAOLRI");

MatchCollection contents = Regex.Matches(text, @"#(?[\w\d]{3,6}?);", RegexOptions.Singleline | RegexOptions.IgnoreCase);
foreach (Match content in contents)
{
    string color = content.Groups["color"].Value;
    if (!string.IsNullOrWhiteSpace(color) && !collection.Contains(color.ToUpper()))
        collection.Add(color.ToUpper());
}
collection.Sort();

foreach (string col in collection)
    res.AppendLine(string.Format("#{0}; <span style=\"background-color:#{0};\">        </span><br/><br/>",col));

string html = res.ToString();

NOTA: se modifico la regex in questo modo #(?[\w\d]{3,6}?) ossia senza ";", riesco a prendere pure i valori contenenti per esempio nei css tipo background: linear-gradient.

martedì 10 gennaio 2012

Scrittura in Request.ServerVariables

Ciao a tutti in questo articolo ho deciso di inserire un metodo per scrivere in Request.ServerVariables... Come tutti sapete questa collection è ReadOnly... per fortuna che c'è Reflection!!!!
In primis creiamo un HttpModule, questo ci permetterà di "trappare" la richiesta e di scriverci dentro... ovviamente non è indispensabile, ma così il metodo può essere riusato in tutte le richieste.
In secundis, utilizziamo un pò di reflection per rendere scrivibile la collection...
In definitiva, possiamo fare così:
using System;
using System.Text;
using System.Web;
using System.Reflection;
using System.Collections.Specialized;

public class ServerVariableWriter : IHttpModule
{
 public void Dispose()
 {
 }

 public void Init(HttpApplication context)
 {
  context.BeginRequest += new EventHandler(Context_BeginRequest);
 }

 protected void Context_BeginRequest(object sender, EventArgs e)
 {
  HttpApplication application = (HttpApplication)sender;

  BindingFlags temp = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;

  MethodInfo addStatic = null;
  MethodInfo makeReadOnly = null;
  MethodInfo makeReadWrite = null;

  Type type = application.Request.ServerVariables.GetType();
  MethodInfo[] methods = type.GetMethods(temp);
  foreach (MethodInfo method in methods)
  {
   switch (method.Name)
   {
    case "MakeReadWrite": makeReadWrite = method;
     break;
    case "MakeReadOnly": makeReadOnly = method;
     break;
    case "AddStatic": addStatic = method;
     break;
   }
  }

  makeReadWrite.Invoke(application.Request.ServerVariables, null);

  string[] values = { "KEY", "VALUE" };
  addStatic.Invoke(application.Request.ServerVariables, values);

  makeReadOnly.Invoke(application.Request.ServerVariables, null);
 }
}

dove KEY e VALUE sono rispettivamente la chiave della variabile server ed il suo valore. Per recuperare il valore, una volta registrato il modulo nel web.config, basta fare semplicemente:
string value = Request.ServerVariables["KEY"];

giovedì 5 gennaio 2012

Creazione di una stringa Hash MD5

Per creare una stringa in formato MD5 occorre:
1) importare il namespace System.Security.Cryptography
2) utilizzare la seguente procedura:
string input="testo_di_cui_calcolare_md5";
string output= string.empty;

MD5 md5Hasher = MD5.Create();

// Prendo la stringa di partenza, la converto in byte e ne calcolo l'hash.
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
StringBuilder sBuilder = new StringBuilder();

// Eseguo un ciclo su ogni byte presente nell'array data
// e formatto ciasuno di questi in formato esadecimale.
for (int i = 0; i < data.Length; i++)
 sBuilder.Append(data[i].ToString("x2"));

// calcolo l'output.
output= sBuilder.ToString();

lunedì 2 gennaio 2012

BulkCopy in ADO.NET

Ciao a tutti con questo post volevo proporvi un esempio di come sia possibile effettuare un BulkCopy in Sql Server mediante ADO.NET. Il tutto è davvero semplicissimo:
1) importare i namespaces adatti
using System.Data;
using Core;
using System.Data.SqlClient;

2) utilizzare il seguente codice all'interno di un metodo:
DataTable sourceTable = DATA_SOURCE;//data table con i dati originari
string destinationTableName="tabella_di_destinazione"; //nome della tabella di destinazione
int notifyAfter = 10;//ogni 10 righee copiate viene lanciato un evento di notifica

using (SqlConnection connection = new SqlConnection(STRINGA_DI_CONNESSIONE))
{
 connection.Open();
 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
 {
  bulkCopy.DestinationTableName = destinationTableName;
  //ogni colonna del DataTable viene mappata nella corrispondente colonna della tabella fisica
  foreach (DataColumn col in sourceTable.Columns)
   bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);

  if (notifyAfter > 0)
   bulkCopy.NotifyAfter = notifyAfter;
  //dopo "notifyAfter" righe inserite, viene lanciato l'evento rowsCopied
  bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(rowsCopied);
  bulkCopy.WriteToServer(sourceTable);
  bulkCopy.Close();
 }
 connection.Close();
}

3) implementare la funzione di notifica rowsCopied con la seguente firma:
void rowsCopied(object sender, SqlRowsCopiedEventArgs e)
{
 //operazioni da effettuare sopo che sono state inserite "notifyAfter" righe
}

Come si può vedere il tutto è davvero semplice... l'oggetto SqlBulkCopy si occupa di tutto il lavoro "sporco". E' necessario solamente fornire una sorgente dati e il gioco è fatto.

Recuperare IP di una macchina

Per recuperare i vari IP di una macchina possiamo fare nel seguente modo:
1) importare i namespaces necessari
using System;
using System.Collections.Generic;
using System.Net;

2) recuperare con il metodo AddressList tutti gli indirizzi IP associati alla macchina
// Occorre recuperare il nome host della macchina.
string strHostName = Dns.GetHostName ();
Console.WriteLine ("Local Machine's Host Name: " +  strHostName);

// Quindi a partire dall'host name è possibile prendere gli indirizzi associati..
IPHostEntry ipEntry = Dns.GetHostByName (strHostName);
IPAddress [] addr = ipEntry.AddressList;

for (int i = 0; i < addr.Length; i++)
  Console.WriteLine ("IP Address {0}: {1} ", i, addr[i].ToString ());