Servicio de Validacion de Mail

febrero 23, 2009

En base a un trabajo que se presento en mi oficina, me pidieron realizar un servicio web que cumpla la funcion de una realizar la comparacion general para un mail valido.

Se me ocurrio que podria usar una “Expresion Regular”  y como muy vago de mi parte, no me puse a realizarla, si no que busque algunas existentes y analice probe y finalmente me quede con la siguiente

^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))@((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})$.

Pero despues de hacer el testeo general y completo de esta expresion regular pasón que no me valida direcciones que despues del arroba tenga un numero, lo cual me dejaba fuera direcciones con por ejemplo nombre@2media.com y para no romper la expresion y para que todo salga rapido se lo deje a resolucion a nuestro amigo C#.

Bueno llego la hora de plasmarla en el servicio lo cual me quedo algo asi.


using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Text.RegularExpressions;
using System.Configuration;

namespace TestEmail
{
///
/// Summary description for EmailTest
///
[WebService(Namespace = “http://anses.gov.ar/arquitectura/”)]
[WebServiceBinding(ConformsTo = WsiProfiles.None)]
[ToolboxItem(false)]
public class EmailTest : System.Web.Services.WebService
{
[WebMethod]
public bool ValidaEmail(string sMail)
{
return IsEmail(sMail);
}
[WebMethod]
private bool IsEmail(string email)
{
const string PatronEmail =
@”^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))@”
+ @”((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.”
+ @”([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|”
+ @”([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})$”;
bool bRes = Regex.IsMatch(email, PatronEmail);
if (bRes)
{
return FiltroPalabras(email);
}
return bRes;
}
private String[] Filtro;
public bool FiltroPalabras(string email)
{
String sPalabras = ConfigurationManager.AppSettings[“ADRIANFiltro”];
this.Filtro = sPalabras.Split(new Char[] { ‘|’ });
foreach (string sPalabra in this.Filtro)
{
if (email.Contains(sPalabra)) return false;
}
return true;
}

Bueno hasta aca todo muy lindo pero, una de las pautas que tenia era que este filtro no tendria que dejar pasar las direcciones provenientes de nuestra misma empresa (Requisito particular), es por esto que tuve que agregar un filtro en el archivo Web.config, para cumplir con esta restricción.

 < appSettings>
       <add key=ADRIANiltro value=“algonzalez.com.ar|adrgon.com.ar/>
</appSettings>

Esto me sirvio para salir del paso, como esas soluciones provisorias para siempre, lo bueno es que esta funcionando y hasta el momento no me genero reclamos.


Clase separador de letras y Numeros

noviembre 5, 2008

Después de un largo periodo de sin actividad, es mi deseo de retomar, con algunas notas, ejemplos y artículos.
Para que esta entrada no quede pobre les voy a dejar una pequeña clase en C# que he preparado hoy para una aplicacion,
La función es de este es dividir una cadena en letras y numero, yo la utilizo para dividir el documento y el tipo, Por ejemplo DU22330011

class Complemento
{
public static string retornaTipo(string sCadena)
{
string sLetras = string.Empty;

foreach (char s in sCadena)
{
if (Char.IsLetter(s))
{
sLetras += s;
}
}
return sLetras;
}

public static string retornaDocumento(string sCadena)
{
string sNumeros = string.Empty;

 

foreach (char s in sCadena)
{
if (Char.IsDigit(s))
{
sNumeros += s;
}
}
return sNumeros;
}
}

Puede que no sea lo que esperaban y sea poco pero espero que a alguien le sea de utilidad, si no quedara para la posteridad


AIR File API

marzo 29, 2008

Es una de las APIs más funcionales en AIR

Es posible crear archivos y directorios, abrir y leer archivos, escribir archivos, listar el contenido de un directorio, acceder a directorios, comunes entre S.O., inspeccionar propiedades de un archivo, son todas clases del paquete flash.filesystem

Las tres clases que manejan toda esta API son File, FileMode, FileStream para leer/escribir archivos. Cuando queremos trabajar con archivos el primer paso es referenciarlo, se pueden identificar dos formas de hacerlos, la primera es instanciando un objeto y definir la propiedad nativePathvar

archivo =  new air.File();   
JS
var archivo : file = new File(); 
AS
Archive.nativePath = “C:/Documents and Settings…”;
Si bien esta alternativa es totalmente valida la forma más usual es a través de un directorio especialvar archivo File;
archivo = File.documentsDirectory.resolve(“foto.jpg”);
var archivo;
archivo = air.file.documentsDirectory.resolve(“…”);

Los directorios especiales pueden usar el método resolve para obtener un path hijo o usar el mismo objeto como File, tenemos los siguientes directorios especiales:

 applicationStorageDirectory: Donde podemos almacenar archivos propios de nuestra aplicación applicationResourceDirectory: La carpeta donde están nuestros archivos de instalación
desktopDirectory: “Escritorio del usuario”
documentsDirectory: “Mis Documentos”
userDirectory: Generalmente en un nivel superior a Mis Documentos Las operaciones sobre los archivos pueden ser sincronicas o asincrónicas, en el caso de asincrónicas, debemos escuchar el evento “complete” o Event.COMPLETE

Los métodos existentes son:

File.copyTo()                             File.copyToAsync()
File.deleteDirectory()              File.deleteDirectoryAsync()
File.deleteFile()                        File.deleteFileAsync()
File.listDirectory()                    File.listDirectoryAsync()
File.moveTo()                           FilemoveToAsync()
File.moveToTrash()                 File.moveToTrashAsync()
FileStream.open()                    FileStream.openAsync()

Un detalle de las propiedades de los archivos:

  • exists
  • icon
  • isDirectory
  • isHidden
  • isPackage
  • isSymbolicLink
  • nativePath
  • parent
  • url
  • creationDate
  • extension
  • modificationDate
  • name
  • size
  • type

Para abrir y leer un archivo, debemos obtener una referencia al objeto File y luego crear un FileStreamvar flujo:

FileStream = new FileStream();
flujo.open(archive, modo);

Los modos posibles son: FileMode.READ, FileMode.WRITE, FileMode.APPEND, FileMode.UPDATE.
También tenemos métodos para escribir distintos tipos de datos writeBoolean, writeInt, WriteUTF y para leer en el mismo orden, creamos archivos binarios.
El trabajo con directorios es igual que con los archivos, hay que referenciarlos y también es posible crear directorios temporales y borrarlos.


SQL en AIR

marzo 20, 2008

AIR puede conectarse a datos mediante un RDBMS embebido, hablamos de SQLite, esto es parte de los 10 MB que incluye el runtime de AIR.

Existen dos modelos que podemos utilizar, Sincrónico / Asincrónico pero una vez elegido un método, hay que continuar siempre con el mismo.

Las clases que mas podemos llegar a utilizar:

air.SQLConnection: representa a la conexión
air.SQLStatement: representa una consulta
air.SQLResult: representa una respuesta de la Base de Datos
air.SQLEvent: representa un evento de base de datos
air.SQLerrorEvent: representa un evento de error en la base de datos.

Para ejecutar una consulta tipo SELECT:

  1. Crear y abrir la coneccion
  2. Crear el SQLStatement y especificar la base de datos
    1. var select = new air.SQLStatement();
    2. select.sqlConnection = conn;
  3. Definir el query
    1. select.text = “SELECT * FROM CLIENTES”;
  4. Definir eventos
    1. Select.addEventListener(air.SQLEvent.RESULT, respondio);
  5. Definir la función respondió para capturar el resultado
  6. Ejecutar
    1. select.execute()

Opcionalmente se pueden definir parámetros en el query y luego definirlos como parameters, también es posible traer solo los primeros XX resutados y luego ir pidiendo mas, para eso se usa execute.


El archivo AppDescriptor

marzo 1, 2008

El archivo descriptor de una aplicación AIR se llama “Application.xml” y es un archivo XML que setea algunas directivas que nuestra aplicacion AIR debera seguir, puede ser generado manualmente mediante cualquier editor de texto o con algun plugin. Dreamweaver nos ofrece una version muy simplificada y Basica con lo escencial que una aplicacion necesta. Aptana nos ofrece otro bastante mas completa bastante completo de todas formas siempre pueden ser modificacos posteriormente.

Esta es una aproximación a los nodos principales de un Application.xml standar con algunos comentarios.


<?xml version="1.0" encoding="utf-8" standalone="no"?>
 
<application xmlns="http://ns.adobe.com/air/application/1.0">
<id>ar.com.algonzalez.example.seteos</id><!-- Identificador único de caracter obligatorio es por esto que se recomienda una notacion del tipo direccion web inversa. -->
<filename>seteos</filename><!-- Un nombre de archivo para la aplicacion de caracter obligarorio, no lleva extension. -->
<name>seteos</name><!-- Este es el nombre que se visualizara duranta la instalacion de la aplicacion de caracter opcional -->
<version>1.0</version><!-- Designa en forma de texto una version para la aplicacion (V1, Version 1.0, Beta, Release, etc) es obligatorio . -->
<description>Aplicacion de prueba de seteos standart para una aplicacion AIR</description><!-- Tambien de caracter opcional y se podra ver en durante la instalacion de la nuestra aplicacion AIR. -->
<copyright>No tengo copy right</copyright><!-- Una informacion de copyright de caracter opcional -->
<initialWindow><!-- Es obligatorio y se usa de contenedor para configurar algunas opciones de la ventana inicial. -->
<content>seteos.html</content><!-- Es el pricipal HTML de la aplicacion y es obligatorio. -->
<title>Mi Aplicacion AIR<title/><!-- Titulo de la ventana principal. es Opcional. -->
<systemChrome>standard</systemChrome><!-- Puede contener dos valores "standard" or "none". Es opcional y por defecto standard. -->
<transparent>false</transparent><!-- Los valores pueden ser true o false, por defecto false y se puede aplicar solamente cuando systemChrome sea "none". -->
<visible>true</visible><!-- para inicializar la ventana en visible o no, es opcional y por defecto esta en false. -->
<minimizable>true</minimizable><!-- Si estara disponible la opcion de minimizar. Default true. -->
<maximizable>true</maximizable><!-- Si estara disponible la opcion de maximizar. Default true. -->
<resizable>true</resizable><!-- Si estara disponible la opcion de redimensionar. Default true. -->
<width>1024</width><!-- Espesifica el ancho inicial de la ventana. Opcional. -->
<height>768</height><!-- Espesifica el alto inicial de la ventana. Opcional. -->
<x>200</x><!-- posicion inicial de la ventana en x. Opcional. -->
<y>200</y><!-- posicion inicial de la ventana en y. Optional. -->
<minSize>800 600</minSize><!-- Especifica la configuacion minima de visualización de la ventana, Opcional. -->
<maxSize>1280 1024</maxSize><!-- Especifica la configuacion maxima de visualización de la ventana, Opcional. -->
</initialWindow>
<icon> <!-- El icono que representara la aplicacion se recomienda usar todas las medidas para su correcta visualizacion. -->
<image16x16></image16x16>
<image32x32></image32x32>
<image48x48></image48x48>
<image128x128></image128x128>
</icon>
<fileTypes><!-- Defines un tipo de archivos. Opcional. -->
<fileType> <!-- El nombre que el sistema mostrara para registrar un tipo de auchivo. Requerido. -->
<name></name> <!-- La extension que se va a registrar. Requerido -->
<extension></extension> <!-- Una descripcion del tipo de archivo. Opcional. -->
<description></description> <!-- El tipo MIME. Opcional. -->
<contentType></contentType> <!-- El icono que se va a mostrar por el tipo de archivo Opcional. -->
<icon>
<image16x16></image16x16>
<image32x32></image32x32>
<image48x48></image48x48>
<image128x128></image128x128>
</icon>
</fileType>
</fileTypes>
</application>