viernes, 3 de junio de 2011

Envio de correos desde PHP

El envió de correos desde php puede ser una de las tareas mas fáciles hasta una de las más complicadas, todo depende de la configuración y donde este corriendo nuestro código.

Problemas: Si estamos en un ambiente de desarrollo y pruebas como nuestra PC personal, lo más probable es que nos de un error al tratar de enviar un correo con esta función. Porque? pues porque necesitaríamos montar nuestra PC como un Mail Server con los puertos de salida abiertos para que funcione.

Ahora montar un Mail Server son otros 20 centavos que necesitaría varios post y lo cual no hago desde hace mucho tiempo pero si se animan les recomiendo leer este articulo que muestra un SMTP gratuito http://www.desarrolloweb.com/articulos/1624.php

Si por ejemplo estamos trabajando en una red interna donde tenemos acceso a un servidor que si funciona como Mail Server y no requiere autenticación podemos cambiar la configuración de php en el archivo php.ini de la siguiente forma:

Tienes que abrir php.ini luego localizar estas líneas:

[mail function]
; For Win32 only.
SMTP = localhost

En SMTP tienes que indicar el servidor SMTP que vas a utilizar para enviar el mensaje. Si la maquina donde corre el código tiene un servidor SMTP, se deja como "localhost", si no tiene que poner la dirección del servidor a utilizar como smtp.loscorreos.com o 200.35.36.7

Normalmente cuando se compra un servicio de hosting o según me han contado no me consta en algunos casos en hosting gratuitos ya viene incluido el servidor SMTP por lo que se dejaría como localhost.
Existe otra opción que es utilizar PEAR http://pear.php.net/ tiene unas funciones para enviar correo especificando servidor con las credenciales necesarias, usuario, clave, etc. pero si se requiere un poco de experiencia utilizando librerías.

Ahora un ejemplo de cómo sería el código para enviar el correo en php es el siguiente:

<?
$destinatario = "elingeniero@yahoo.com"; //quien lo envia
$asunto = "Mensaje es de prueba"; // asunto del mensaje
$cuerpo = "
<html>
<head>
   <title>Prueba de envio de Correo desde PHP</title>
</head>
<body>
<p>
Aca podria incluirse todo el mensaje que quieran poner con variables de php si fuera necesario ejemplo $nombre $clave
</p>
</body>
</html>
";

//para el envío en formato HTML se define lo que yo llamo cabecera (en español me gusta mas) con todo los datos de envio y configuracion
$cabecera = "MIME-Version: 1.0\r\n";
$cabecera .= "Content-type: text/html; charset=iso-8859-1\r\n";
$cabecera .= "From: Edsson Noe Gonzalez <edssongonzalez@gmail.com>\r\n"; //dirección del remitente
$cabecera .= "Reply-To: edsson_kln@hotmail.com\r\n"; //dirección de respuesta, si queremos que sea distinta que la del remitente
$cabecera .= "Cc: mijefe@concuidado.com\r\n"; //esto se pone si queremos copiar el correo a otra direccion

//Con esta funcion enviamos el correo
mail($destinatario,$asunto,$cuerpo,$cabecera);
?>

Una vez mas lo digo yo no soy experto no me considero para nada experto y puedo tener uno o muchos errores en esto, si alguien encuentra uno y me lo dice en hora buena, asi se aprende mas.

miércoles, 11 de mayo de 2011

Manejo de Buffers de Entrada - Compiladores


Esta sección trata algunos aspectos de la eficiencia relacionados con el manejo de los buffers de entrada, esto toma importancia cuando se busca un esquema de un pre análisis en la entrada para identificar los componentes léxicos, la finalidad de esto es utilizar técnicas que aumenten la velocidad de analizador léxico.

1.    DEFINICION DE TERMINOS

Analizador  léxico
 Lee  la secuencia de caracteres del programa fuente, carácter a carácter, y los agrupa para formar unidades con significado propio, ósea componentes léxicos  o tokens en ingles. Estos componentes léxicos representan: palabras reservadas: if, while, do,  identificadores  asociados a variables, nombres de funciones,  operadores: = * + - / == > < & ! =. . ., etc.

Buffer de datos
Un buffer en informática es un espacio de memoria, en el que se almacenan datos para evitar que el programa o recurso que los requiere, ya sea hardware o software, se quede sin datos durante una transferencia.


Un ejemplo de esto último ocurre en una comunicación telefónica, en la que al realizar una llamada esta se almacena, se disminuye su calidad y el numero de bytes a transferidos, y luego se envían estos datos modificados al receptor.

Pueden ser implementados por software o hardware, aunque la gran mayoría son del primer tipo. Normalmente se usan cuando la frecuencia de transferencia de datos es distinta a la de procesado. Estas diferencias temporales de transmisión son normalmente ajustadas mediante la implementación de un algoritmo con cola (o estructura de tipo FIFO) en memoria, para así escribir datos en la cola a una frecuencia y leerlos a otra.

Se puede ejemplificar la función de un buffer utilizando ésta metáfora: Un buffer es como tener dinero en el banco (buffer), un trabajo (entrada) y unos gastos fijos (salida). Si tienes un trabajo inestable, mientras tengas ciertos ahorros, puedes mantener tus gastos fijos sin problemas, e ir ingresando dinero cuando puedas según vas trabajando. Si los ahorros son pequeños, en seguida que no tengas trabajo, no vas a poder acometer los gastos fijos.


Diferencias con la caché:
Una caché puede ser usada a veces como un buffer, y viceversa. Sin embargo, una caché opera con el supuesto de que los mismos datos van a ser utilizados múltiples veces, que los datos escritos serán leídos en un periodo corto de tiempo, o teniendo en cuenta la posibilidad de múltiples lecturas o escrituras para formar un único bloque más grande. Su premisa básica es reducir los accesos a los almacenamientos de nivel más bajo, los cuales son bastante lentos.

Una caché de disco o archivo de caché guarda las estadísticas de los datos almacenados en él y proporciona datos con un tiempo máximo de espera en modos de escritura en diferido. Un buffer, por el contrario, no hace nada de esto, sino que es utilizado normalmente en entrada, salida y a veces, almacenamiento temporal de datos que se enrutan entre distintos dispositivos o que van a ser modificados de manera no secuencial antes de ser escritos o leídos de manera secuencial.


2.       MANEJO DE LOS BUFFERS DE ENTRADA

Hay tres métodos generales de implantación de un analizador léxico:

1. Utilizar un generador de analizadores léxicos, como el compilador LEX, para producir el analizador léxico a partir de una especificación basada en expresiones regulares. En este caso, el generador proporciona rutinas para leer la entrada y manejarla con buffers.

Nota Personal:
LEX y FLEX no son lo mismo LEX es un software utilizado para generar componentes léxicos para UNIX y como sobran UNIX es un sistema operativo no libre por lo tanto este LEX se convierte en un programa licenciado, FLEX es la versión libre de este sistema ,  FLEX estas desarrollado bajo licencia GNU la cual lo hace un software libre pero con  restricciones, GNU es una licencia orientada  a proteger la libre distribución modificación y uso del software pero a su vez lo protege de intentos de apropiación que lleguen a quitar libertades. GNU es juego de palabras que al final significa IS NOT UNIX su creador recomienda pronunciarlo como ÑU igual que el animal por eso el logo es la cabeza de este animal los que usaron FLEX la pudieron ver, pero al final todos lo pronunciamos como queramos.

2. Escribir el analizador léxico en un lenguaje convencional de programación de sistemas, utilizando las posibilidades de entrada y salida para leer la entrada.

3. Escribir el analizador léxico en lenguaje ensamblador y manejar explícitamente la lectura de la entrada.

Estas tres opciones se relacionan en orden de dificultad reciente para el encargado de la implantación. Aunque los enfoques más difíciles de implementar se convierten en los más rápidos y ya que el analizador léxico no es la más complicada pero si es la única etapa que lee el código fuente esto se puede traducir en tiempo.

3.       PAREJAS DE BUFFERS

Como se puede consumir mucho tiempo moviendo caracteres, se han desarrollado técnicas especializadas en el manejo de buffers para reducir el número de operaciones necesarias para procesar un carácter de entrada.

Se utiliza un buffer dividido en dos mitades de N caracteres cada una (por lo general N es el número de caracteres en un bloque de disco, por ejemplo, 1024 ó 4096). Se leen N caracteres de entrada en cada mitad del buffer con una orden de lectura, en vez de invocar una instrucción de lectura para cada carácter de entrada. Si quedan menos de N caracteres en la entrada, entonces se lee un carácter especial eof, que marca el final del archivo fuente. 

Se mantienen dos apuntadores al buffer de entrada.  La cadena de caracteres entre los dos apuntadores es el lexema en curso.
Al principio, los dos apuntadores apuntan al primer carácter del próximo lexema que hay que encontrar.
Uno de ellos, llamado apuntador delantero, examina hacia delante hasta encontrar una concordancia con un patrón. Una vez determinado el siguiente lexema, el apuntador delantero se coloca en el carácter de su extremo derecho. Después de haber procesado el lexema, ambos apuntadores se colocan en el carácter situado inmediatamente después del lexema.
Cuando el apuntador delantero está a punto de sobrepasar por la marca intermedia del buffer, se llena la mitad derecha con N nuevos caracteres de entrada.
Cuando el apuntador delantero está a punto de sobrepasar el extremo derecho del buffer, se llena la mitad izquierda con N nuevos caracteres de entrada y el apuntador delantero se regresa al principio del buffer.

(Este y el siguiente algoritmo lo escribí interpretando la información que encontré no se puede tomar como base porque no está probado y creo que hasta se puede mejorar en mucho)

If (delantero = final de la primera mitad){
                Recargar la segunda mitad;
                Delantero = delantero + 1;
}
If (delantero = final de la segunda mitad){
                Recargar la primera mitad;
                Pasar delantero al principio de la primera mitad;
}
If(delantero!= final de la primera mitad  &&  delantero!=final de la segunda mitad){
                Delantero=delantero+1;
}

4.       CENTINELAS

El centinela se define como un carácter especial que no puede ser parte del programa fuente. una elección natrual es eof (fin de archivo en ingles), lo que se hace es poner un carácter eof al final de cada mitad para evitar estar haciendo la comprobación con cada lexema, como se encuentran N caracteres de entrada entre los simbolos eof, el promedio de pruebas por cada carácter de entrada es próximo a 1

Delantero=delantero +1;
If (delantero = eof){
                If (delantero = final de la primer mitad){
                               Recargar la segunda mitad;
                               Delantero=delantero+1;
                }
                If(delantero=final de la segunda mitad){
                               Recargar la segunda mitad;
                               Delantero=delantero+1;
                }
                If(delantero!= final de la primera mitad  &&  delantero!=final de la segunda mitad){
                                //eof;
                               Terminar el análisis léxico
                }
}

Fuente de informacion: Wikipedia y  Libro Compiladores Principios Tecnicas Y Herramientas - Aho Sethi Ullman Pearson

martes, 10 de mayo de 2011

Twitter Vs Panaoia Gringa Vs Mal uso de los Terminos

Antes que nada me gustaría definir algunas palabras:

Trending topics (TT): Son las palabras clave más usadas en un momento dado en Twitter. Las keywords de moda, lo que se cuece en el momento, de lo que todo el mundo habla. Por ejemplo #BodaReal #BarcaVsMadril.

América: Nombre dado a un continente, siendo este el segundo más grande del mundo, después de Asia. Ocupa gran parte del Hemisferio Occidental de la Tierra. Debido a su gran tamaño y sus características geográficas, América es dividida tradicionalmente en América del Norte, América Central, las Antillas y América del Sur.

Aclarando este tema podemos deducir que Americano es aquella persona con origen en cualquiera de los países que conforman el continente; Ahora porque todo esto? pues en la madrugada del lunes 9 de mayo de 2011, después de una dolorosa eliminación del equipo América de México, aficionados americanistas vaciaron su frustración en Twitter y de pronto surgió el trend topic "Adiós América" el cual no tardo en llegar al top.

El problema vino cuando twiteros de los Estados Unidos pensaron que el tema "Adiós América" podría referirse a una amenaza terrorista en su contra derivado de la operación militar que asesino al líder de Al Qaeda y ahí empezó la diversión.

 El TT fue retirado de los tópicos mundiales pero reinstalado minutos después cuando personal del propio Twitter explicó el origen del tema, refiriéndose a la eliminación de un equipo mexicano de futbol y no a una amenaza terrorista.

Al final el TT siguió en línea y se creó un nuevo  TT llamado #gringospendejos.


Mis conclusiones serian: Uno que los Gringos tiene razón de estar temerosos y Dos si empezaran a llamarse Estadounidenses y no Americanos en referencia a su nacionalidad nada habría pasado.