Feb 02 2010

Escribir un plugin para jQuery (3 parte)

Category: ProgramacionIndigo @ 1:56 PM

En mis anteriores artículos (Escribir un plugin para jQuery parte 1 y parte 2) sobre desarrollar un plugin para jQuery hemos visto como crear un plugin básico y como configurarlo dinámicamente. En esta ocasión vamos a ver como podemos disparar nuestros propios eventos y por ejemplo, que otro plugin actue en consecuencia.

Para esto vamos a seguir con el plugin que hemos desarrollado y que sirve para cambiar el estilo de nuestras cajas de texto cuando ésta tiene el foco y lo pierde.

Para usar eventos necesitamos tres cosas, el evento en si mismo (click, blur, focus), algo que lo lance y alguien que lo maneje (delegado). En jQuery el encargado de lanzar un evento es el método trigger y se hace de la siguiente manera

$(this).trigger('nombre_de_mi_evento', parametros_de_mi_evento);

Para manejar un evento se usa el método bind de la siguiente manera

$(this).bind(nombre_de_mi_eveto, function(e, data) {
// Código de la función que manejera mi evento. En la variable data tenemos los parameotros que hemos enviado en el trigger.
});

Aplicado esto a nuestro plugin, lo primero que haremos será crear un div donde iremos escribiendo todos lo eventos que vayamos manejando

<div id="status"></div>

y en nuestro fichero common.js pondremos los delegados

$('input').bind('myfocus', function(e, data) {
   var html = $('#status').html();
   html += 'onfocus<br />';
   $('#status').html(html);
});

$('input').bind('myblur', function(e, data) {
   var html = $('#status').html();
   html += 'onblur<br />';
   $('#status').html(html);
});

Luego sólo tendremos que modificar nuestro plugin para que lance los eventos

 $(this).focus(function() {
 	//...
    $(this).trigger('myfocus', "on focus");
	//...
 });
 $(this).blur(function() {
	//...
	$(this).trigger('myblur', "on blur");
	//...
 });

Con esto ya tendríamos nuestros propios eventos myfocus y myblur gestionados.

Tags: , ,


Jan 29 2010

Escribir un plugin para jQuery (2 parte)

Category: ProgramacionIndigo @ 10:37 PM

Lo más normal es que cuando escribamos un plugin para jQuery (o cualquier otro trozo de código reutilizable) lo dotemos de alguna forma para poder configurarlo dependiendo de las necesidades de cada momento.  Siguiente con el ejemplo de mi artículo anterior “Escribir un plugin para jQuery (1 parte)” veremos como dotar al plugin de esta capacidad de configuración. En este caso configuraremos el color del fondo, asi como el borde de nuestros textbox, tanto cuando tiene foco (focus) como cuando no lo tiene (blur). El código para guardar estos valores es así

$.fn.highlight.defaults = {
   focusbackground: '#EFF5FF',
   focusborder: 'solid 1px #73A6FF',
   blurbackground: '#EEEEEE',
   blurborder: 'solid 1px #DFDFDF'
};

Para permitir que nuestro plugin admita parametros de configuración usaremos un parametros en la llamada del plugin donde pasaremos los valores que queramos

$.fn.highlight = function(options) {
   var opts = $.extend({}, $.fn.highlight.defaults, options);
   // Resto del código
}

Juntándolo todo tendríamos lo siguiente

(function($) {
    $.fn.highlight = function(options) {
        var opts = $.extend({}, $.fn.highlight.defaults, options);
        this.each(function() {
            var obj = $(this);
            // Valores por defecto
            obj.css('background', opts.blurbackground);
            obj.css('border', opts.blurborder);

            obj.focus(function() {
                obj.css('background', opts.focusbackground);
                obj.css('border', opts.focusborder);
            });

            obj.blur(function() {
                obj.css('background', opts.blurbackground);
                obj.css('border', opts.blurborder);
            });
        });
    };

    $.fn.highlight.defaults = {
        focusbackground: '#EFF5FF',
        focusborder: 'solid 1px #73A6FF',
        blurbackground: '#EEEEEE',
        blurborder: 'solid 1px #DFDFDF'
    };
})(jQuery); 

Para hacer la llamada a nuestro plugin tan sólo hay que hacer lo siguiente

$().ready(function() {
    $('input').highlight({
        blurborder: 'red'
    });
});

Para la próxima entrega dejaremos otros detalles que podemos hacer para mejor el plugin y así aprender un poco mas de jQuery.

Tags: , ,


Jan 27 2010

Escribir un plugin para jQuery (1 parte)

Category: ProgramacionIndigo @ 8:25 PM

Durante el último año una de las cosas que más gratamente me ha sorprendido es jQuery y jQuery UI. Con muy poco código tenemos toda la potencia de javascript para poder hacer autenticas maravillas en cliente. Toda esta funcionalidad puede ser extendida mediante plugins. En la página de jQuery tener un gran cantidad de plugins preparados para ser usados en nuestra página con muy poco esfuerzo. Pero, ¿y si queremos hacernos un plugin personalizado? Pensé que hacer un plugin sería algo costoso y que requeriría de tener muchos conocimientos de javascript y jQuery, pero nada más lejos de la realidad. Para demostrarlo he hecho un pequeño plugin que cambia el estilo de todos las cajas de texto (inputs) cada vez que capture el foco y lo deje en un valor inicial cuando lo pierda. Para comenzar el plugin lo primero que tenemos que hacer es extender el propio objeto jquery para añadir nuestra funcionalidad (método). La forma de hacer esto es la siguiente

(function($) {
    $.fn.highlight = function(options) {
		// Nuestro método es 'highlight' y el código va a partir aquí.
    };
})(jQuery);

Bien, con esto ya podríamos llamar a nuestro código de la siguiente manera

$().ready(function() {
    $('input').highlight();
});

Este código llama a nuestro método para todos los ‘inputs’ (la potencia de jQuery es casi infinita) de nuestra página una vez que ésta esté disponible.

Volviendo a nuestro método, el código para cambiar los estilos de las cajas de texto quedaría de la siguiente manera

obj.focus(function() {
	obj.css('background', '#EFF5FF');
	obj.css('border', 'solid 1px #73A6FF');
});

obj.blur(function() {
	obj.css('background', '#EEE');
	obj.css('border', 'solid 1px #DFDFDF');
});

Juntándolo todo tenemos

(function($) {
    $.fn.highlight = function(options) {
        this.each(function() {
            var obj = $(this);
            // Valores por defecto
            obj.css('background', '#EEE');
            obj.css('border', 'solid 1px #DFDFDF');

            obj.focus(function() {
                obj.css('background', '#EFF5FF');
                obj.css('border', 'solid 1px #73A6FF');
            });

            obj.blur(function() {
                obj.css('background', '#EEE');
                obj.css('border', 'solid 1px #DFDFDF');
            });
        });
    };
})(jQuery);

Todo esto lo guardamos en un fichero con la extensión .js. Segun las buenas practicas nuestro plugin debería estar en un fichero con el nombre jquery.highlight.js.

El código que llama a nuestro plugin lo he puesto en un archivo llamado common.js, por lo que juntándolo todo en nuestra página aspx (o html) quedaría

<head runat="server">
    <title></title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js" type="text/javascript"></script>
    <script src="jquery.highlight.js" type="text/javascript"></script>
    <script src="common.js" type="text/javascript"></script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input id="text1" type="text" />
        <input id="text2" type="text" />
    </div>
    </form>
</body>
</html>

Como vemos, crear nuestro primer plugin en jQuery ha sido muy sencillo. Próximamente veremos como podemos personalizar aun más nuestro script para que admita parámetros.

Tags: , ,


Jan 23 2010

C# El método MapPath

Category: ProgramacionIndigo @ 4:58 PM

Un método bastante utilizado cuando desarrollamos aplicaciones web en ASP.NET es el método MapPath. Este método puede ser llamado de la siguiente manera

string path = HttpContext.Current.Server.MapPath("~");

Llamado así este método nos devuelve la ruta física de la raiz de la aplicación web. Es útil para localizar directorios y así, por ejemplo, poder abrir ficheros de configuración propia. Pero ¿qué ocurre si llamamos a este método en un delegado?. La llamada fallará porque el object HttpContext no está creado. La solución es llamar al método de la siguiente forma

string path = HostingEnvironment.MapPath()

La clase HostingEnvironment la tenemos en el espacio de nombre System.Web.Hosting, en el ensamblado System.Web.dll. Tenemos mas información de está clase en la MSDN al igual que del método MapPath.

Tags: , ,


Jan 11 2010

C# Como obtener la fecha de compilación de un ensamblado

Category: ProgramacionIndigo @ 9:47 PM

Para poder obtener la fecha de compilacion de un ensamblado, tendremos que hacer dos cosas

1.- Modificar las líneas AssemblyVersion y AssemblyFileVersion del fichero AssemblyInfo.cs

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("0.1.*")]
[assembly: AssemblyFileVersion("0.1.1.0")]

Del AssemblyVersion obtendremos la fecha de compilación mientras que la línea AssemblyFileVersion es de donde sacamos la versión del programa (aquí se puede usar cualquier numeración). Para esto usamos el siguiente código

Assembly assembly = Assembly.GetExecutingAssembly();

FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);

DateTime assemblyDate = new DateTime(2000, 1, 1)
        .AddDays(assembly.GetName().Version.Build)
        .AddSeconds(assembly.GetName().Version.Revision * 2);

version = string.Format("{0}.{1}.{2} del {3}",
    versionInfo.ProductMajorPart,
    versionInfo.ProductMinorPart,
    versionInfo.ProductBuildPart,
    assemblyDate.ToString("dd/MM/yyyy"));

Tags: , , ,


Jan 07 2010

c# Encriptar un string con MD5

Category: ProgramacionIndigo @ 2:05 PM

Tras la resaca navideña, volvemos al trabajo. En esta ocasión voy a escribir el código de método estático que nos permitiría codificar un string en MD5.  Para saber que es MD5 te recomiendo este enlace.

El código es tan simple como

public static string MD5Encrypt(string value)
{
  MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();

  byte[] data = System.Text.Encoding.ASCII.GetBytes(value);
  data = provider.ComputeHash(data);

  string md5 = string.Empty;

  for (int i = 0; i < data.Length; i++)
      md5 += data[i].ToString("x2").ToLower();

  return md5;
}

También debemos añadir esto en los using de nuestra clase

using System.Security.Cryptography;

Tags:


Jan 05 2010

Error usando System.Linq

Category: ProgramacionIndigo @ 5:28 PM

El otro día el Visual Studio me dio el siguiente error de compilación

Error 8 Could not find an implementation of the query pattern for source type
'System.Data.Linq.Table<Model.Provincia>'. 'Select' not found.
Are you missing a reference to 'System.Core.dll' or a using directive for 'System.Linq'?

La verdad es que el error es bastante raro y no deja muy claro a que se refiere. Una búsqueda por google y tras un ratillo leyendo respuestas encontré la solución. Tan sólo hay que añadir la referencia a System.Linq.

using System.Linq;

Tags: ,


Jan 29 2009

C# Comprimir y descomprimir un String (GZipStream)

Category: ProgramacionIndigo @ 11:05 PM

La verdad es que hace tiempo que no escribo nada en el blog, pero es que he estado bastante liado. Una de las últimas cosas que he tenido que hacer es comprimir un xml antes de guardarlo a disco ya que este ocupaba más de 5 megas y no era cuestión de tener ese espacio ocupado “inútilmente”. Aunque visto al precio que esta el MB o el GB podría evitarme estas molestias. La primera idea sería usar un compresor externo vía línea de comandos para comprimir esa cadena de texto. Como es lógico esta opción es muy poco viable. Otra solución sería implementar nosotros mismos un algoritmo de compresión y descompresión. Esta opción sería bastante interesante si quisiéramos pasar algo de tiempo aprendiendo sobre algoritmos de compresión, pero como no es el caso, también queda descartada. Ya sólo nos queda la opción de buscar algo dentro del framework de .NET y como suele ocurrir casi siempre, el framework nos trae una clase para esta tarea. En concreto es la clase GZipStream de la cual podemos leer mas información aquí.

El código para comprimir es el siguiente

   1: public static string Zip(string text)
   2: {
   3:     byte[] buffer = Encoding.UTF8.GetBytes(text);
   4:     MemoryStream ms = new MemoryStream();
   5:     using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
   6:     {
   7:         zip.Write(buffer, 0, buffer.Length);
   8:     }
   9:
  10:     ms.Position = 0;
  11:     MemoryStream outStream = new MemoryStream();
  12:
  13:     byte[] compressed = new byte[ms.Length];
  14:     ms.Read(compressed, 0, compressed.Length);
  15:
  16:     byte[] gzBuffer = new byte[compressed.Length + 4];
  17:     System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
  18:     System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
  19:     return Convert.ToBase64String(gzBuffer);
  20: }

y el código para descomprimir es muy parecido

   1: public static string UnZip(string compressedText)
   2: {
   3:     byte[] gzBuffer = Convert.FromBase64String(compressedText);
   4:     using (MemoryStream ms = new MemoryStream())
   5:     {
   6:         int msgLength = BitConverter.ToInt32(gzBuffer, 0);
   7:         ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
   8:
   9:         byte[] buffer = new byte[msgLength];
  10:
  11:         ms.Position = 0;
  12:         using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
  13:         {
  14:             zip.Read(buffer, 0, buffer.Length);
  15:         }
  16:
  17:         return Encoding.UTF8.GetString(buffer);
  18:     }
  19: }

Como vemos el código es bastante simple y nos sirve para evitar que nuestros ficheros auxiliares crezcan de manera incontrolada.

Saludos y nos vemos en la próxima entrega.

Tags: , , ,


Nov 23 2008

C# Reproducir un fichero wav (SoundPlayer)

Category: ProgramacionIndigo @ 4:54 PM

Uno de los motivos por lo que he estado tanto tiempo sin actualizar el blog es porque he estado metido en una puesta de producción dondo todo lo que ha podido ir mal, ha ido mal (siempre se cumplen la leyes de Murphy). Una de las cosas que se cambiaron a última hora, fueron unas notificaciones sonoras en muchas partes del programa. Yo tenía un código relativamente antiguo para reproducir un sonido.

[sourcecode language="csharp"]public int SND_ASYNC = 0×0001; // play asynchronously
public int SND_FILENAME = 0×00020000; // use file name
public int SND_PURGE = 0×0040; // purge non-static events

[System.Runtime.InteropServices.DllImport("WinMM.dll")]
public static extern bool PlaySound(string fname, int Mod, int flag);

private void button1_Click(object sender, EventArgs e)
{
PlaySound(”tada.wav”, 0, SND_FILENAME | SND_ASYNC);
}[/sourcecode]

Este código funciona perfectamente, pero nunca me ha gustado usar este tipo de codigo usando liberirías externas. Mirando en la MSDN encontré otra solución que me parece muchísimo mejor. Resulta que desde .NET 2.0 tenemos la clase SoundPlayer en el espacio de nombre System.Media que nos ayuda perfectamente a reproducir un sonido. El código para ésto es así de fácil

[sourcecode language="csharp"]private void button2_Click(object sender, EventArgs e)
{
System.Media.SoundPlayer soundPlayer = new System.Media.SoundPlayer();
soundPlayer.SoundLocation = “tada.wav”;
soundPlayer.Play();
}[/sourcecode]

Tenemos más información sobre esta clase en http://msdn.microsoft.com/en-us/library/system.media.soundplayer(VS.80).aspx

Tags: ,


Oct 23 2008

C# Enviar correo electronico desde .NET

Category: ProgramacionIndigo @ 10:05 AM

ara enviar un correo electrónico tenemos que usar los siguientes espacios de nombres

[sourcecode language='csharp']using System.Net;
using System.Net.Mail;[/sourcecode]

Con esto tendremos a nuestra disposición una serie de clases que nos harán la vida muy fácil para conseguir nuestro objetivo. Para enviar un correo electrónico necesitamos la siguiente información

  • Servidor smtp
  • Puerto (normalmente 25)
  • Nombre de usuario y contraseña en caso que el servidor requiera autencación.

El código es tan simple como este

[sourcecode language='csharp']try
{
SmtpClient smtpClient = new SmtpClient(”Servidor SMTP”, 25);

// Si tu servidor necesita autenticación
if ((_userName != string.Empty) &amp;amp;&amp;amp; (_password != string.Empty))
{
NetworkCredential networkCredential = new NetworkCredential(”username”, “passwor”);
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = networkCredential;
}

string body = string.Empty;
if (_isBodyHtml)
body = “Tu mensaje en html.”;
else
body = “Tu mensaje en texto plano.”;

MailMessage mailMessage = new MailMessage(”from”, “to”, “subject”, body);
mailMessage.IsBodyHtml = _isBodyHtml;

if (_sendAsync)
smtpClient.SendAsync(mailMessage, null);
else
smtpClient.Send(mailMessage);
}
catch
{
throw;
}

[/sourcecode]

  • Al principio creamos una instancia del objeto SmtpClient para lo cual necesitamos una dirección del host y el puerto de conexión.
  • Despues, es caso de que nuestro servidor requiera autenticación, creamos la credenciales que se usar al conectar con nuestro servidor de correo.
  • Despues construimos el mensaje, en base a la variable _isBodyHtml que nos dirá si el mensaje irá en texto plano o en html.
  • Posteriormente creamos el mensaje de correo, con un from (de), to (para), subject(asunto) y el mensaje.
  • Y para finalizar se envia el correo de manera síncrona o asíncrona dependiendo de _sendAsync.

Como vemos es realmente fácil. En caso que el envio te falle ten en cuenta

  1. Comprueba que los datos del host, nombre de usuario y contraseña sean correctos.
  2. Tengas acceso a la red y no salgas a Internet a través de un proxy.
  3. Comprobar si el antivirus te está bloqueando el envio del correo. A mi con el McAfee activado no puedo enviar correos.

Saludos.

Tags: ,


Next Page »