Archive for the ‘programación’ Category

ley de Kernighan

febrero 25, 2012

“Debuggear es el doble de difícil que escribir código. Por lo tanto, si escribo el código más ingenioso que puedo, no soy, por definición, lo suficientemente inteligente para debuggearlo”.

Así que a escribir código feliz y declarativo.

Anuncios

¿qué es esto de los servlets?

enero 12, 2012

Mi inmersión al mundo java web ocurrió hace unos años ya, pero recuerdo que yo andaba medio perdido con muchos nombres nuevos y con poca idea de cómo se hacían las cosas por ese alocado lugar.

Hoy un poco más cascado puedo ordenar algunas ideas y contar un poco lo que aprendí.

Antes que nada responden a una especificación como casi todo en java.

Un servlet es un componente java que permite generar contenido dinámico y que corre en el contexto de contenedor de servlets. Los servlets que usamos para programar web son los HTTP Servlets. Estos corren en un contenedor -que es parte de un servidor web o de un servidor de aplicaciones y que se encarga de manejar la comunicación con el cliente usando el modelo de Petición / Respuesta. Un ejemplo de contenedor de servlets es apache tomcat.

El contenedor suele tener un archivo descriptor de despliegue: el archivo WEB-INF/web.xml.

En este archivo mapeamos las URL con los servlets que vamos creando, configuración de la sesión y otras cosas como definición de filtros y etc.

A diferencia de otras tecnologías, donde se crea todo un proceso por cada solicitud del cliente, un servlet corre en un hilo. Esto genera menos carga para el servidor, por lo que se supondría que es más rápido.

El contendor maneja su ciclo de vida, que empieza llamando al método init(ServletConfig) e inicializa nuestro servlet. Por cada petición que recibe, invoca al método service(ServletRequest, ServletResponse). Finalmente destroy() es invocado cuando el contenedor decide descargarlo y es el momento para liberar recursos.

Los HttpServlet en particular nos abstraen de manejar qué mensaje HTTP implementando el método service y dejándonos a nosotros implementar los distintos mensajes como GET, POST, DELETE y PUT mediante doGet, doPost, doDelete y doPut. Estos a su vez reciben como parámetro los objetos de clase HttpServletRequest y HttpServletResponse. El servlet trabajará con el contexto provisto por el Request y escribirá en el Response los resultados de su ejecución.

En el próximo capítulo vamos a implementar un servlet muy sencillo que recibe una frase y cuenta la cantidad de palabras. Este implementa los métodos de HTTP, POST y GET. Si no recibe nada para contar,  explica el uso y provee un form, si recibe algo directamente muestra el resultado.

¡Hasta la próxima!

eScalando

mayo 20, 2011

Hace un tiempo ya que estoy trabajando con java. También me tocó pasarlo con alguna materia de la facu.

Java está bien, pero lo pone a uno poco más charlatán de lo que debería. Y no lo digo por los debates acerca si sigue sirviendo o no, si tipado o no, si interpretado o …

Hay muchas cosas que se vuelven repetitivas. Si uno quiere evitar código redundante, tiene que empezar a fabricar clases para cubrir estos baches. Esas clases hacen más ruido del que deberían hacer (eso que la literatura anglo parlante llama boiler plate code).

Hay por ahí un lenguaje que se llama Scala, que ya tiene sus años y que estoy usándolo para probar. Los vendedores de elixhir sostienen que es la felicidad en tu java virtual machine. Scala es la contracción de SCAlable LAnguage.

Del nombre surgen dos interpretaciones, una por el rendimiento del equipo y la paralelización del código al favorecer estructuras inmutables, y la otra interpretación es por el rendimiento del lenguaje según el programador. En scala podés programar objetos y funcional, o muy para un lado o muy para el otro, todo depende del palo del que vengás. Ahora a medida que vas aprendiendo, vas aplicando mejor el paradigma que te conviene y tu código es más claro. También promete facilidad para generar tus lenguajes de dominio específico, que es casualmente una curiosidad que me pica desde que me enteré que existía LISP y todo eso de extender el lenguaje.

Me parece interesante eso de que el lenguaje “te deje” entrar con tu estilo y que vayás aprendiendo, manteniendo tu JVM abajo. Creo que eso tiene gancho para el ambiente profesional y académico.

Así que para ahí voy.

Como ya tengo algo de programación funcional (haskell mediante) encima, no me parece tan raro.

Como regalo al peregrino le dejo una función escrita en scala y un par de líneas para probarla:

def funcionUltraConocida(n: Int) = (2 to n).foldLeft (1) (_ * _)
def esLaRespuesta = 42.equals(_)
esLaRespuesta (funcionUltraConocida(7) / funcionUltraConocida(5))

¡Suerte! Hoy tengo parcial de física 2 y está bastante complicado.

que diferencia hay entre write, fwrite y send

marzo 31, 2009

joven argentino que cursas en la utn sistemas operativos o muchacho global que andas queriendo aprender a programar entrada salida y sockets en C, espero que esto te oriente.

write es la llamada del sistema operativo a un descriptor. El descriptor es una abstracción que usan los sistemas operativos tipo POSIX para representar un dispositivo al que se le pueden escribir o se pueden leerle datos. La función está declarada en el archivo header unistd.h.

fwrite es una función de la biblioteca estándar de C y se utiliza para escribir registros, indicando cuántos, a un flujo binario. Un flujo es una abstracción que usan muchos lenguajes de programación y que consiste en una secuencia de caracteres (fwrite permite tratarlo de a bytes o bloques) que vienen de un lugar y van a hacia otro. Los flujos más conocidos son los estándar de la consola: teclado entrada y pantalla salida. Para usarla hay que hacer include de stdio.h

send es una función de los sockets. Para utilizarla es necesario incluir las cabeceras sys/types.h y sys/socket.h. Los sockets son otro tipo de abstracción que se utilizan para comunicación entre procesos. Estos procesos pueden estar en un mismo sistema o en distintos. Se le pasa un socket que es también un descriptor pero este se obtiene con las funciones de sockets.

write es de más bajo nivel, es una llamada al sistema operativo. fwrite es propia del concepto de flujo de la biblioteca estándar de C. send permite.

Las 3 reciben un puntero a void, que es la manera en C de referenciar a una posición de datos sin importarnos el tipo de dato. También reciben un size_t que es el tamaño del bloque de datos que vamos a envíar.

Si bien se puede obtener el descriptor de un flujo a traves de una función de biblioteca no se puede hacer el camino inverso ya que el flujo usa un descriptor y no al revés.

send ofrece más control en lo referente a sockets. Se puede indicar que el envío sea bloqueante (el programa se queda bloqueado hasta que pueda envíar los datos) o no bloquentes.

más adelante vamos a hablar de read, fread y recv.

Ah! Revisar la guía beej que es un buen tutorial para iniciarse con sockets.

¡Mucha suerte!

Red Gnutella completa y aprobada

diciembre 25, 2008

Finalmente con ayuda del glorioso Drinktin completamos la red gnutella que nos pedían. El código es ANSI C y lo pude compilar en FreeBSD.

La cosa es más o menos así, uno tiene una red de servidores gnutella funcionando en linux que intercambian queries y queries hits, a partir de un query generado en un servidor que se encarga de recibir pedidos de búsquedas. Este servidor a su vez dispone de un servidor de cache que permite ahorrarse el proceso de búsqueda en la red gnutella, pasándole al cliente -una aplicación de consola en win32- la lista de archivos encontrada en la red gnutella que cumplan, con la dirección adecuada para realizar la descarga mediante HTTP.

En el desarrollo de este proyecto aprendí sockets, algo de ipc sobre unix, threads en win32 y, tal vez lo más valioso, lo importante de tener un equipo aceitado de trabajo donde todos tiremos para el mismo lado. Desde quienes analizan y diseñan, hasta quienes testean, redactan y transcriben todos empujamos para un mismo lado y la cosa fue saliendo.

Y obvio también quienes nos aguantaron en nuestras casas, nuestr@s amig@s que nos escucharon y también aguantaron.

Fue un laburo de aquellos, pero bueno, salió. Gracias a todos, aunque no lean este humilde espacio.

Y si hay consultas de sockets, ipc, threads y procesos distribuidos. Ya pueden consultar.

Felicidades y terminen bien el año, muchach@s.

Programando sobre Linux con C

septiembre 13, 2008

Sigo con esto de programar en ANSI C con GNU/Linux y POSIX.

Encontré un blog muy interesante de un Pablo Garaizar Sagarminaga. El amigo es de españa y se mandó un interesante curso de programación en C para GNU Linux.

Muy recomendable para acompañar la cursada de Sistemas Operativos de FBRA/UTN.

usando ansi C

septiembre 3, 2008

Actualmente estoy cursando dos materias muy relacionadas con el uso del Lenguaje C. Una sellama Sintaxis y Semánticas de los lenguajes. Muy interesante, porque nos da una mejor perspectiva de como se diseñan e implementan los lenguajes de programación. Como caso de estudio usamos el Lenguaje de Programación C en su versión ANSI C.  Como bibliografía tenemos el libro homónimo de Kernighan y Ritchie y un libro de la cátedra acerca de Autómatas escrito por el jefe de cátedra.

La otra es Sistemas Operativos. Sistemas operativos es dura. El trabajo práctico es duro. La teoría es extensa, aunque debo considerar que a mí me gusta. Tal vez la materia no tiene tanto que ver con C en sí, pero sí con el uso de C como lenguaje para relacionarse con los servicios del Sistema. Encima el trabajo práctico consiste en una aplicación distribuida con servidores de archivos que forman una red tipo GNutella y el cliente es una aplicación de línea de comandos multi-hilos sobre Win32. Todo en ANSI C usando las bibliotecas de cada sistema operativo.

No voy a negar que es un desafío para mis compañeros y para mí, pero la verdad es que me gusta la temática.

Además estoy cursando Modelos Numéricos, pero eso es otro cantar, aunque no menos desafiante.

El tema es ansi C. C tiene más de 35 años. Yo cuento con 28. C nació como una mejora de B que era un lenguaje para implementar BCPL sobre una máquina de 8KB de memoria. Como los muchachos de Unix estaban jugados con la memoria tuvieron que ir cortándole cosas. Después Ritchie lo fue mejorando y, según él, tomó la forma actual alrededor de 1973. Es curioso como un lenguaje pensado para hacer algo como trabajar a un nivel un poco más alto que el assembler con los escasos recursos computacionales terminó siendo el lenguaje más utilizado para todo tipo de propósitos durante más de 30 años.

Leí por ahí que las dos causas que hicieron que C sea tan exitoso sean:

– el lenguaje es bastante sencillo, los tipos de datos estándar son los mismos que maneja un procesador de cualquier tipo: entero, caracteres, punto flotante y direcciones de memoria. luego no es tan difícil de implementar en cualquier hardware.

– C hace lo necesario y deja que nosotros hagamos lo que necesitamos, razón por la cuál cada uno puede usar C de la manera que necesite. Entonces sobre una herramienta tan básica se pueden construir cosas tan amplias como los programas de sistemas para manejar un sistema operativo o bien una modelo de objetos tan complejo y rico como gnome.

Yo no sé si existe tal cosa como el éxito en los lenguajes. El éxito viene porque los que lo usamos podemos resolver nuestros problemas.

Hay algo que me gusta de esas características de C y es que el lenguaje hace que convivan dos mundos en él. Por un lado el de la máquina y sus punteros y todas esas cosas. Y por otro lado el de nuestras ideas de como resolver problemas. Es como si estuviera cerca de los dos mundos de este fenómeno inconmesurable que empezó con Babbage y Ada Lovelace y que hoy nos permite tantas cosas.

Así que bueno, acá estoy de vuelta usando lenguaje C para construir autómatas por un lado y para armar un sistema distribuido multiplataforma para descarga de archivos por el otro. Y no hablo de una web 😉

Al Juarismi no me olvido de vos, pero ellos empezaron con esto de llevar tu trabajo a las máquinas. Tampoco de los hindúes que nos prestaron sus númeritos de bellas curvas. ¿Notaron que el alfabeto hindú tiene caracteres de hermosas curvas? No es de extrañar que sea la misma gente que la del Kamasutra.

Gracias! Vuelvan prontos!

Crear PDFs del lado del servidor: iText y FPDF

marzo 7, 2008

Armando un form super largo que después tenía que salir por impresora se me presentó la dicotomía: OpenXML o PDF.

Necesitaba soporte para headers y paginación. Que el documento de salida fuera editable no era necesario.

Estaba en .NET, razón por la cuál OpenXML hubiera sido la opción más razonable. A poco de andar terminé encontrando que utilizar Word a través de COM no era nada recomendable del lado del servidor. Necesitaba entonces una biblioteca que maneje el tema. Me encontré con una paga a la cuál no voy a linkear, porque le sobran links de entrada. Microsoft ofrece una biblioteca para generar OpenXML pero genera documentos para Office 2007. No todo el mundo tiene Office 2007, razón por la cuál el camino del OpenXML se iba cerrando. La última opción era generar el doc, guardar como Office XML 2003 y parsear el documento mediante XML o tags. El documento terminaba pesando 900 KB, inaceptable para un ambiente con concurrencia.

Bueno, hubo que tomar el camino del PDF…Yo había hecho algo parecido en PHP con una biblioteca que se llama FPDF. Es una clase PHP 4.0 sencilla pero muy potente para generar PDFs. Lo bueno es que hay un montón de ejemplos en su sitio y hay documentación en español. Lo malo es que es un poco tosca, pero es muy fácil de extender. El enfoque es como trabajar con un lienzo (canvas para la muchachada) donde vamos dibujando nuestras genialidades.

El drama era que había que conseguir algo parecido y allà GPL para .NET. Me encontré con iTextSharp. iText es una biblioteca para generar PDF en java. Muy completa, también es un lienzo pero tiene estructuras como párrafo, frase y pedacito (Paragraph, Phrase y Chunk) y una completa implementación de tablas. Esto permite simplificar muchas tareas que en FPDF me costaban bastante. La biblioteca está muy bien hecha y facilita mucho trabajo. A su vez permite acceder al contenido del pdf a bajo nivel de una manera muy sencilla.

Por si fuera poco hay un tutorial para iTextSharp muy sencillo y elocuente para el desarrollador en apuros, al igual que en FPDF. Lo único que se añora es que no esté en español.

Los autores Bruno Lowagie y Paulo Soares(responsable del port a .NET) han hecho un gran trabajo. Hay un libro muy interesante llamado iText in Action. El libro a través de un caso ficticio -pero muy parecido a lo que pasa en realidad- va cubriendo todas las funcionalidades de la biblioteca y trae piezas de código muy interesantes.

En esencia la biblioteca nos permite generar un pdf en 5 pasos básicos:

  • instanciar un objeto Document
  • generar una instancia del PdfWriter y asociarla a un canal (stream)
  • abrir el documento
  • insertar el contenido
  • cerrar el documento

Nuestro trabajo será esencialmente generar el contenido, porque todo lo demás ya nos los provee la biblioteca.

A su vez tiene un modelo de eventos para la documento, página y tabla. De esta manera podemos generar encabezados y pies de página dinámicos, centralizar los estáticos, etc.

La verdad es que fue una grata sorpresa encontrar la biblioteca esta. Mi solución terminó siendo un HttpHandler que genera los pdfs con iTextSharp. El archivo pesa 40 KB. El mundo ha sido salvado nuevamente. Diós está en el Cielo, todo está en en la Tierra.

A colación de la Collation…

diciembre 26, 2007

Un problema típico trabajando con cadenas y comparaciones es como lidiar con cuestiones de acentos y la diferencia de mayúsculas y minúsculas.

El problema surge de que la computadora guarda los caracteres como (sucesiones de) bytes: así la letra A es un byte 65 o 0x41, la B es 66 o 0x42, la a es 97 o 0x61 y, en la tabla ISO-8859-1 á es 160 o 0xA0. Cuando la computadora compara los bytes A es disntito de a y de á. Esto es extrictamente cierto y necesario, pero hay (muchas) veces en la que es un efecto no deseado.

La solución más común es “normalizar” las cadenas para búsquedas y comparaciones. Para eso hacemos unas funciones muy bonitas que termina metiéndole mano hasta el kiosquero de la esquina.

Este enfoque no es malo, pero en seguida resulta ineficiente, ya que por cada búsqueda o comparación hay que normalizar. Para eso nuestro DBA amigo nos sugirió crear un campo donde podamos guardar nuestra cadena normalizada -pobre tipo, ya tiene bastante lío revirtiendo nuestros accidentes-. Nosotros, codeadores empedernidos sentimos un poco de frustración por guardar dos veces lo que podemos calcular con nuestra superfunción. Pero todo sea en nombre de la concurrencia y el rendimiento.

¿Nadie resolvió esto ya?

¡Sí!

¡Para eso se inventó la Collation de nuestras bases de datos, tablas, o incluso de nuestros campos!

Lo que hace la Collation es establecer un orden alternativo independiente del mapeo de caracteres. Es una secuencia de orden alternativa. No es un algoritmo de ordenación.

De esta manera nuestra base de datos ya nos provee el tratamiento de cadenas con caracteres especiales.

Si quisiéramos aplicar Collation en una base MySQL para un campo con charset utf8 utilizaríamos utf8_spanish_ci.

Si quisiéramos aplicar Collation para un campo con charset iso-8859-1 (latin-1) latin1_spanish_ci.

Se puede leer más y mejor en la documentación de mysql para charset utf-8 y para el caso iso-8859-1.

El tema tiene mucha tela para cortar y dejo esto para empzar. Ya volveremos con algo más interesante.

Saludos y ¡buen año!

Problemas con Charset y PHP

octubre 9, 2007

Los problemas de charset surgen de dos cuestiones:

  • Estoy abriendo una fuente utf-8 y mi salida se ve en iso-8859-1
  • o bien el opuesto: iso-8859-1 la fuente, salida utf-8

Vamos a “simular” que abrimos un archivo XML y tenemos problemas con el charset.

Primer caso

Diagnóstico: Por lo general el primer caso se da cuando veo en vez de eñes y acentos dos caracteres. Suelen ser un à y algo más. En el ejemplo el archivo XML estaría codificado en utf-8 (caso más común) y nuestra página se ve en iso-8859-1

Solución: La fuente está viniendo en utf8 y necesito pasarlo a Latin-1. Esto se hace con la función utf8_decode().

$origen = "http://algunblog/feed/";

//CURL mediante o file_get_contents
//En este caso hacemos la conversion de utf-8
//a iso-8859-1
$contenido = utf8_decode(file_get_contents($origen));

$xml = simplexml_load_string($contenido);
//"masajeamos" el contenido del XML

Segundo caso

Diagnóstico: En vez de caracteres especiales vemos unos signos de interrogación o cuadraditos con números. Esto significa que no puede traducir el caracter a alguno Unicode porque está “mal formado”.

Solución: Hay que convertir nuestra cadena a utf-8 mediante la función utf8_encode().

$origen = "http://algunblog/feed/";

//CURL mediante o file_get_contents
//En este caso hacemos la conversion de iso-8859-1
//a utf-8
$contenido = utf8_encode(file_get_contents($origen));

$xml = simplexml_load_string($contenido);
//"masajeamos" el contenido del XML

Estos son los dos casos básicos. Desde ya que esto tiene una explicación un poco más teórica, pero que vamos a abordar en otro post o tal vez le dediquemos una página. Por ahora con esto ya podemos solucionar muchos problemas.

Cuando trabajemos con bases de datos también tenemos que tener en cuenta estas consideraciones. Tenemos ventajas además, por lo general nos permite seleccionar el encoding de la conexión. El parámetro suele llamarse “charset”.

Mi intención es fundar la SALPICADA (Sociedad Argentina por la Lucha contra Problemas Indescifrables de Charset Accediendo a Datos y Archivos) para investigar el tema, capacitar y ofrecer ayuda. Evitemos que nuestras páginas terminen SALPICADAs por feos caracteres que hacen los textos menos legibles.

Cualquier duda, acá estoy.