martes, 8 de mayo de 2012

Incrustar imagen en correo HTML

¡Vaya que esto de escribir es más difícil de lo que pensaba! Mis respetos para todos los bloggers que se dedican a esto.

Bien, directo al punto: Esta vez tuve la necesidad de encontrar una forma de insertar una imagen en el cuerpo de un mensaje de correo electrónico, pero, ésta no debe ser importada de otra ubicación y tampoco debe ser un adjunto del mensaje.

¿Cómo lograr esto?

Investigando un poco dí con este artículo en www.variablenotfound.com donde se muestra cómo se puede realizar esta azaña (jeje); cabe mencionar que el código que allí publicaron está hecho en C#, y yo me tomé la libertad de pasarlo a Visual Basic .NET.

El código es el siguiente:


' Necesitaremos estos namespaces...
Imports System.Net.Mail
Imports System.Net.Mime

Module Module1

   Sub Main()
   
  ' Crearé algunas variables aquí para facilitar las pruebas:
   Dim MiDireccionDeCorreo as String = ""
   Dim DireccionCorreoDestino as String = ""
   Dim DireccionSMTP as String = "" 'Puede ser una IP o una URL
   Dim PuertoSMTP = 25
   Dim Imagen as String = "" 'Ruta completa y nombre de la imagen.
  
       Try
           ' Montamos la estructura básica del mensaje...
           Dim mail As MailMessage = New MailMessage()
           mail.From = New MailAddress(MiDireccionDeCorreo)
           mail.To.Add(DireccionCorreoDestino)
           mail.Subject = "Mensaje con imagen"

           ' Creamos la vista para clientes que
           ' sólo pueden acceder a texto plano...

           Dim text As String = "Hola, ayer estuve disfrutando de " & _
                                   "un paisaje estupendo."

           Dim plainView As AlternateView = AlternateView.CreateAlternateViewFromString(text, System.Text.Encoding.UTF8, MediaTypeNames.Text.Plain)


           ' Ahora creamos la vista para clientes que
           ' pueden mostrar contenido HTML...

           Dim html As String = "<h2><b>¡¡¡Hola!!!</b> Mira dónde estuve ayer:</h2>" & _
                               "<img src='cid:wbtestimagenbg' />"

           Dim htmlView As AlternateView = AlternateView.CreateAlternateViewFromString(html, System.Text.Encoding.UTF8, MediaTypeNames.Text.Html)

           ' Creamos el recurso a incrustar. Observen
           ' que el ID que le asignamos (arbitrario) está
           ' referenciado desde el código HTML como origen
           ' de la imagen

           Dim img As LinkedResource = New LinkedResource(Imagen, MediaTypeNames.Image.Jpeg)
           img.ContentId = "wbtestimagenbg"

           ' Lo incrustamos en la vista HTML...

           htmlView.LinkedResources.Add(img)

           ' Por último, vinculamos ambas vistas al mensaje...

           mail.AlternateViews.Add(plainView)
           mail.AlternateViews.Add(htmlView)

           ' Y lo enviamos a través del servidor SMTP...
           Console.Out.WriteLine("Empiezo a crear el cliente smtp...")
           Dim smtp As SmtpClient = New SmtpClient(DireccionSMTP, PuertoSMTP)
           Console.Out.WriteLine("Y envio el correo...")
           smtp.Send(mail)
           Console.Out.WriteLine("Correo enviado")
       Catch ex As Exception
           Console.Out.WriteLine(ex.ToString)
           Threading.Thread.Sleep(60000)
       End Try
   End Sub

End Module


Este código me funcionó con un smtp que no requería autenticación. Si ya han hecho pruebas exitosas de envío de correo, se puede simplemente reemplazar la definición de mi cliente smtp con el que hayan utilizado.

Espero que sea de utilidad; saludos y hasta la próxima.

martes, 21 de febrero de 2012

Comprimir archivos a ZIP en Visual Basic .NET

En estos días me he visto en la necesidad de buscar una forma de comprimir a un ZIP un archivo de texto, lo cual es algo no muy simple, por lo que he podido ver.

Me puse manos a la obra y exploré las soluciones que se me ofrecían (la mayoría, de pago), pero, como todos sabemos, "... el que buscare, encontrará".

La solución que encontré se llama DotNetZip Library, y no es más que una librería y set de herramientas gratuito publicado por la comunidad de open source CodePlex, la cual se rige por la licencia Microsoft Public License.

Entonces, vamos a lo que nos interesa: ¿Cómo se comprime un archivo?

Con esta librería he encontrado que se hace de una forma muy simple; lo primero que necesitamos es bajarnos la librería DotNetZip, y luego, vamos a buscar dentro del zip que bajamos, el siguiente archivo: zip-v1.9\Release\Ionic.Zip.dll, el cual descomprimiremos en cualquier lugar de nuestro sistema.

Hecho esto, en Visual Studio hemos de crear un nuevo proyecto, nombrarlo como deseemos y hacer lo siguiente:

  1. Añadir una referencia a Ionic.Zip.dll: En el explorador del proyecto, click derecho y seleccionar la opción "Agregar referencia" o "Add reference" en el caso de que esté en inglés.
  2. Importar el namespace: Tecleamos en el area de imports de nuestro proyecto lo siguiente: Imports Ionic.Zip
Ahora, el código:


Imports Ionic.Zip

    Private Sub Comprimir()
       Using zip As ZipFile = New ZipFile()
           zip.AddFile("rutaarchivo\nombrearchivo1.ext","")
           zip.AddFile("rutaarchivo\nombrearchivo2.ext","")
           zip.Save("rutazip\nombrezip.zip")
       End Using
    End Sub

Como podrán ver, la forma de hacerlo es muy sencilla, simplemente se utiliza el método "AddFile" del objeto zip de tipo ZipFile para añadir cuantos archivos necesitemos comprimir, y luego se guarda el Zip con el método "Save"; ahora bien, podemos observar que AddFile tiene un segundo parámetro el cual es un string en blanco. ¿Qué siginifica? Pues, simplemente es una ruta que se utilizará dentro del ZIP; por ejemplo, si la instrucción fuera:

           zip.AddFile("rutaarchivo\nombrearchivo.ext","test\")

entonces, al abrir el zip resultante, tendríamos primero una carpeta llamada "test" dentro de la cual estaría almacenado el archivo.
Por lo tanto, como el segundo parámetro es una cadena vacía, se le indica a la clase que quiere que no haya ninguna estructura de directorios dentro del Zip, simplemente el archivo en cuestión; por defecto, si no se especifica este parámetro, el método creará la estructura de directorios original del archivo dentro del ZIP.

Para más información de cómo utilizar esta librería, pueden visitar su documentación oficial (en inglés), donde podrán encontrar la referencia de los espacios de nombres, clases, etc. y una sección con bastantes ejemplos (como comprimir de forma simple o incluso agregando una contraseña, descomprimir, etc.) en cada lenguaje con el que se puede utilizar.

 Espero les sea de utilidad esta información.

Saludos.

domingo, 19 de febrero de 2012

Libros de programación web gratuitos

Una de las cosas que más me costó mientras aprendía a programar con lenguajes para web, era encontrar contenidos de calidad, al menor costo posible.

Sabemos que todo cuesta en esta vida, pero hay algunos colaboradores que realizan un trabajo de primera, y lo distribuyen sin fines de lucro por la red.

LibrosWeb.es es un sitio donde se han publicado varias obras que, a mi criterio, tienen un valor incalculable, puesto que los conocimientos que están plasmados en ellos son de mucha utilidad para desarrolladores web de cualquier nivel.

¿Que tipo de libros encontraré aquí? Podemos mencionar que son libros didácticos para aprender lenguajes, frameworks y tecnologías como:

  • XHTML
  • JavaScript
  • CSS
  • Symphony
  • AJAX
¿Que es lo interesante del sitio? Lo que más me gusta es que en sus publicaciones, hay una referencia muy completa acerca de cada lenguaje, además de ejemplos muy claros y ejercicios, pero algo que pesa mucho, es que todos son ¡totalmente gratuitos! Incluso, la mayoría tiene versión en pdf que puede ser descargada para ser impresa, y esto también sin costo alguno... todas las obras están publicadas bajo la licencia Creative Commons Reconocimiento No Comercial - Sin Obra Derivada 3.0

Yo personalmente he leído "Introducción a Ajax", y es simplemente genial, todo está muy bien explicado, y cubre la mayoría de los aspectos a considerar tanto en JavaScript como utilizando Ajax, así que se las recomiendo.

Enlace: LibrosWeb.es

lunes, 13 de febrero de 2012

Hablando de algoritmos


Hablando de algoritmos...

En general, podríamos definir a un algoritmo como cualquier conjunto de instrucciones detalladas que resultan en un "estado final predecible", partiendo de un "inicio conocido".
La calidad de los algoritmos está basada en la calidad de las instrucciones dadas, en tanto sean correctamente ordenadas y estructuradas, así como oportunas, de lo contrario, se corre el riesgo de que el resultado sea incorrecto.

Ahora, después de esta definición algo formal, ¿cuales son las ideas que necesito para entender mejor este concepto? cuestionemos entonces la definición:

Lo primero que se me ocurre es, ¿A que tipo de "inicio conocido" y "estado final predecible" se refiere la definición?
Bien, podría tomarme bastante tiempo explicando y ejemplificando esto, pero vamos al grano:
Estos conceptos tienen su relación en lo que conocemos como RESOLUCION DE PROBLEMAS, donde, a partir de un enunciado y datos iniciales, se realiza un procedimiento para poder resolver un problema y llegar al resultado deseado.

Entonces, de la forma más sencilla, se podría decir de un algoritmo que es... UN CONJUNTO DE INSTRUCCIONES CON LAS QUE SE RESUELVE UN DETERMINADO PROBLEMA.

Ahora bien, ¿Que tipo de instrucciones? Lo explicaré con un ejemplo:

Antonio viene por primera vez a la ciudad, pero no sabe cómo llegar al museo de historia. Le pregunta a una persona de la localidad, la cual conoce cómo hacerlo, y le da las siguientes INSTRUCCIONES:


  • Camine derecho hasta 4 calles y doble a la derecha, luego camine derecho 3 cuadras, y doble hacia la izquierda.
  • Camine derecho otras 6 calles, y a su lado izquierdo podrá observar el museo; buen día.


Si analizamos este escenario, encontraremos muchas cosas interesantes...

Lo primero que observamos son los siguientes hechos:

  1. Condicion inicial: Donde está ubicado.
  2. Resultado deseado: Llegar al museo de historia.
Lo siguiente que podemos ver es lo claro, ordenado y sencillo que se da cada instrucción.
Lo tercero que se puede observar es algo interesante y parte de lo abstracto de todo esto: el dato de que la persona sea alguien que no conozca la ciudad, lo cual ayuda mucho a elegir la forma en la que daremos las instrucciones.

En la siguiente entrega sobre este tema profundizaré sobre estos, para que podamos entender y aprender el abstraccionismo de todo esto.

viernes, 16 de diciembre de 2011

¿Que se necesita para aprender a programar?

Todo programador principiante se hace esta pregunta en algún momento, ya sea antes de empezar a aprender o cuando está practicando los ejercicios que repentinamente no le salen bien... esta última situación es crítica puesto que es donde muchos de los que inician el aprendizaje se dejan vencer por la complejidad que supone el aprender a programar.
En base a mi propia experiencia, puedo decirles a mis amigos principiantes que no es tan complicado como piensan, así que me permito enumerar algunos elementos que son muy útiles tanto en el aprendizaje como a la hora de ejercer esta profesión.


  1. Paciencia y perseverancia: Dos actitudes muy importantes en todo momento para un programador, de hecho, para cualquier cosa que se emprenda.
  2. Aptitud: Como reza un dicho que alguna vez leí, "Uno no puede obtener lo que la naturaleza no le ha dado". Personalmente pienso que el conjunto de nuestros intereses y nuestras habilidades forman lo que se llama "aptitud"; Si uno cuenta con el interés pero no con las habilidades necesarias, aún se pueden desarrollar esas habilidades, pero, como podrán imaginar, ser requerirá de mucha paciencia y perseverancia.
  3. Conocimientos de informática: Obviamente no se puede considerar aprender a programar de inmediato si no se sabe qué es una computadora y cómo funciona, qué es hardware, software, etc. Por lo tanto, alguien que considere aprender a programar tiene que, forzosamente, pasar algún curso de computación hasta llegar, de preferencia, a un nivel avanzado, de tal forma que conozca bien la administración y estructura de directorios y archivos del sistema operativo, más que todo; también podríamos aplicar el dicho "echando a perder se aprende", pero eso talvez salga un poquitín más costoso.
  4. Lógica matemática: Esto es fundamental para no volverte loco a la hora de programar. Las matemáticas discretas y combinatorias son, a mi parecer, las ciencias fundamentales para todo aquel que quiera introducirse al mundo de la programación. Solo como una breve descripción, el estudio de estas ciencias ayuda a ejercitar al cerebro para analizar expresiones que tienen 2 valores posibles: verdadero o falso. Esto es importante porque la programación se reduce a muchas tomas de decisión donde el resultado puede ser verdadero o falso.
Para terminar, muchos se preguntarán... ¿Y los algoritmos? Pues, resulta que los algoritmos son parte de lo que se quiere aprender, por esto mismo se deja para otra ocasión.

Me gustaría agregar un artículo que leí hace poco, y que me parece muy interesante, originalmente está escrito en iglés, pero esta es una traducción, y se llama "Aprenda a programar en diez años!".

Y ustedes, ¿Qué otros elementos creen que sean importantes para el aprendizaje y ejercicio de la programación?

Saludos.

lunes, 5 de diciembre de 2011

Empezar... ¿desde dónde?

Muy bien, entonces, he de empezar mi blog contándoles que no se me ocurre por donde empezar... me gustaría postear muchísimas cosas, pero resulta que no he planeado cómo estructurarlas todas.

Un día, me dije a mí mismo:
- Mi mismo, ¿Qué es lo que necesitaría un programador principiante?
Pregunta que cambió luego a, ¿Qué necesitaría yo si fuera un programador novato?, y luego evolucionó a ¿Qué era lo que yo esperaba cuando era un novato?

Fué entonces que recordé la escencia que debe tener este blog: Debe ser un lugar práctico donde el programador de cualquier nivel pueda encontrar rápidamente lo que busca, y aprenderlo y comprenderlo utilizando el menor tiempo posible.

Pues bien, gracias a esto, la respuesta a mi interrogante fué muy sencilla: necesito una página bien estructurada donde pueda encontrar fácilmente todo lo que necesite, desde lo más básico para un programador hasta enlaces hacia cursos y recursos externos, pero todo en un solo lugar.

Pensé en las siguientes posibilidades:

  • Una página con varios cursos de varios lenguajes de programación, suena bien, pero de estos ya existen muchos y muy buenos, así que hacer un curso más sería algo muy poco práctico a estas alturas, talvez sería mejor hacer un directorio para enlazar a los cursos ya existentes.
  • Tutoriales o "Howto's", pero de estos también existen muchos, y muy bien explicados.
  • Traducciones de artículos en inglés, puesto que hay muchos que no se llevan aún con éste idioma.
  • Traducciones de documentación de Microsoft a un lenguaje que los humanos podamos entender (creo que esto sí sería de mucha utilidad, jaja).


Después de pensar sobre estas cosas, creo que tengo una idea más clara de cómo puedo iniciar con este sitio de recursos (JA! ¿Que tal? de blog a sitio de recursos... ¿Iré muy rápido?):

  • Podría incluir un directorio que tenga enlaces a los cursos online que ya existen, de todos los lenguajes posibles.
  • Además, podría incluir tutoriales o "howto's" dentro de los cuales incluya enlaces a otros tutoriales similares, ya que todos necesitamos más que un ejemplo.
  • Un gran golsario para programadores no estaría nada mal; no sería un glosario como los demás: además de la definición formal de un  término, podría añadir una definición un poco más informal, pero fácilmente entendible, y talvez enlaces a howto's y ejemplos relacionados.


En fin... son tantas cosas las que se me ocurren, pero algo bien importante: ESTOY ABIERTO A SUGERENCIAS... Si lo que busco es ayudar a los lectores de este blog, escuchar sus ideas y opiniones para implementarlo es algo necesario, ¿No creen? Así que, toda sugerencia es bienvenida.

Pronto incluiré contenido útil. Saludos.

martes, 29 de noviembre de 2011

Introducción y... ¡Bienvenidos a mi blog!


Es increíble cómo cambian las cosas, cómo las nuevas tecnologías cambian de tal forma que uno nunca sabe por completo sobre algo, y siempre es necesario estar en constante aprendizaje.

Una muestra de esta situación es la programación. Con la amplia gama de lenguajes (y frameworks) que existe hoy en día, todos tenemos la oportunidad de conocerles y elegir los que creamos convenientes para desarrollar nuestros programas... jaja, ¡mentira!. Resulta que contamos con una "pequeña cosa loca", que lastimosamente no se llama amor, sino "tiempo", y que cada vez es mas y mas escaso en "algunas" situaciones, tan escaso, que normalmente no contamos con él para poder realizar pruebas y conocer mejor los resultados que puedan dar algunas funciones que no conocemos de nuestro lenguaje favorito, no digamos de un lenguaje que estemos aprendiendo.

Realmente, si no fuera por la gran cantidad de blogs y foros que se unen a la documentación oficial, documentación de terceros y discusiones que hay en línea acerca de un solo lenguaje o, incluso, de una sola función, no podríamos avanzar mucho en nuestro aprendizaje.

Es por esto que me veo motivado a realizar este blog, el cual espero que se convierta en un espacio en donde pueda almacenar mis impresiones acerca de los lenguajes que vaya aprendiendo y probando, además de poder compartir con otros jóvenes programadores, de forma práctica, lo que yo haya observado de cada función con la que haya experimentado, así como compartir algunas ideas de algoritmos, tips, etc.

Entonces, es de mi agrado poder añadir este espacio al tan amplio mundo de la documentación para programadores, y aunque mi público objetivo son los programadores principiantes, creo (y espero) que pueda llegar a ser de gran utilidad para programadores de todos los niveles.

Ya que no me queda más que decir para inaugurar este, mi primer blog, entonces les doy la más cordial bienvenida, que, como ya dije, sea de mucha utilidad y, pues... ¡Comenzamos!

Saludos.