jueves, octubre 29, 2009

Acerca de Ubuntu 9.10...



La nueva versión de Ubuntu 9.10, disponible desde hoy (Jueves 29), lleva en su corazón cambios y mejoras dedicadas al usuario de las que tenemos que hablar.
Las mejoras inmediatas, estan en los tiempos de carga y secuencia de arranque, mejoras en el audio (PulseAudio) y en de conectividad 3G.

También podemos mencionar el innovador proyecto "100 Paper Cuts", una iniciativa que en conjunto con la comunidad Ubuntu impacta de sobremanera la interfaz del usuario, y propone una nueva forma de mejorar la interfaz visual de cualquier software, liberándola de aquellas tonteras que molestan a los usuarios más exigentes.

También tenemos ahora el Ubuntu Software Center, un nuevo intento de encapsular el extenso directorio de aplicaciones disponibles para Ubuntu, exponiendo de manera más sencilla la informacion sobre el mismo. Lo que podemos traducir como acercar más el software libre al usuario.
Ojala que no sea como el (para mi fallido) CRN (Click and Run) de Linspire.




Esta version de Ubuntu incluye la integracion con "Ubuntu One", un servicio que Canonical libero como beta en mayo de este año. Ubuntu One es una suite de servicios online que mejorar la experiencia del escritorio, simplifica las tareas de respaldo, sincronizacion  (notas de Tomboy o contactos entre varias maquinas por ejemplo) y compartir archivos.


Ubuntu 9.10 tambien esta pensado para los developers, sean casuales o profesionales. "Quickly" automatiza las mundanas tareas involucrads en la programcion y ayuda a empaquetar codigo y redistribuirlo mediante los repositorios de Ubuntu. Ahora si esta facil desarrollar en Ubuntu ;)

Lo más interesante:
  • Tiempo de carga más veloz, secuencia de arranque coherente y una interfaz afinada.
  • Mejoraron PulseAudio
  • Firefox 3.5
  • Servicio de almacenamiento en la nube con Ubuntu One (2 GB gratis, 50 GB x $10 mensuales), integrado con el sistema.
Vinculos útiles:

¿Qué esperas para descargarlo?

Acerca de Ubuntu 9.10...



La nueva versión de Ubuntu 9.10, disponible desde hoy (Jueves 29), lleva en su corazón cambios y mejoras dedicadas al usuario de las que tenemos que hablar.
Las mejoras inmediatas, estan en los tiempos de carga y secuencia de arranque, mejoras en el audio (PulseAudio) y en de conectividad 3G.

También podemos mencionar el innovador proyecto "100 Paper Cuts", una iniciativa que en conjunto con la comunidad Ubuntu impacta de sobremanera la interfaz del usuario, y propone una nueva forma de mejorar la interfaz visual de cualquier software, liberándola de aquellas tonteras que molestan a los usuarios más exigentes.

También tenemos ahora el Ubuntu Software Center, un nuevo intento de encapsular el extenso directorio de aplicaciones disponibles para Ubuntu, exponiendo de manera más sencilla la informacion sobre el mismo. Lo que podemos traducir como acercar más el software libre al usuario.
Ojala que no sea como el (para mi fallido) CRN (Click and Run) de Linspire.




Esta version de Ubuntu incluye la integracion con "Ubuntu One", un servicio que Canonical libero como beta en mayo de este año. Ubuntu One es una suite de servicios online que mejorar la experiencia del escritorio, simplifica las tareas de respaldo, sincronizacion  (notas de Tomboy o contactos entre varias maquinas por ejemplo) y compartir archivos.


Ubuntu 9.10 tambien esta pensado para los developers, sean casuales o profesionales. "Quickly" automatiza las mundanas tareas involucrads en la programcion y ayuda a empaquetar codigo y redistribuirlo mediante los repositorios de Ubuntu. Ahora si esta facil desarrollar en Ubuntu ;)

Lo más interesante:
  • Tiempo de carga más veloz, secuencia de arranque coherente y una interfaz afinada.
  • Mejoraron PulseAudio
  • Firefox 3.5
  • Servicio de almacenamiento en la nube con Ubuntu One (2 GB gratis, 50 GB x $10 mensuales), integrado con el sistema.
Vinculos útiles:

¿Qué esperas para descargarlo?

lunes, octubre 26, 2009

Hilos y Sincronización...

En el trabajo, existen un buen numero de componentes que fueron ideados para ser reusables o "genéricos", el diseño de estos a veces funciona y otras... digamos que dejan mucho que desear. Pero existe un componente que resulta interesante (más nada practico en lo personal, a pesar de que se esta usando), que terminan empleando todas las aplicaciones, y en pocas palabras, se encarga de determinar la configuración adecuada a emplear de acuerdo al ambiente (ruta e IP) en el que se encuentra, nos referiremos a este componente con el nombre ficticio de: "ConfigUtility". Para usar este componente en X aplicación, se instancia un objeto "ReadConfiguration", y se especifica de que aplicativo queremos la información, luego el ReadConfiguration, leerá de un archivo XML la configuración adecuada a la aplicación especificada.

Existen dos problemas fundamentales con el ConfigUtility...
El primero, es que cada vez que se realiza una instancia de este objeto, se realiza la lectura y conversión de un archivo XML a un objeto.
El segundo es que en un segundo, un proceso puede invocar hasta seis veces el ConfigUtility, lo que se convierte en seis lecturas del mismo archivo... y si son 100 usuarios los que usan ese proceso en un determinado instante (algo muy probable), entonces son 600 lecturas en un segundo de ese archivo.


Se me ocurrió mejorar los tiempos de carga del archivo realizan un "cache" del objeto en memoria, y modificar este hasta que el archivo XML cambie en el disco. Una buena idea cuando se prueba con una sola persona, pero que se convierte en un caos con muchas usuarios.






¿La razón del fracaso? los hilos de ejecución (Threads).

Un hilo de ejecución, es una característica en los procesadores que permite a una aplicación realizar varias tareas a la vez (concurrentemente), especialmente en los ambientes multi-núcleo modernos que se vuelven más y mas comunes. Los distintos hilos de ejecución comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situación de autenticación, etc.
Así una aplicación puede llevar a cabo distintas tareas simultáneamente por ejemplo: Writer de OpenOffice.org y Word, emplean hilos para ejecutar el proceso del corrector ortográfico mientras se escribe.


A la sumatoria de los hilos de ejecución y los recursos que estos comparten se les conoce como: proceso (Lo que ves cuando ejecutas Top en el bash, o el TaskManager en Windows). El hecho de que los hilos de ejecución de un mismo proceso compartan los recursos hace que cualquiera de estos hilos pueda modificar éstos. Cuando un hilo modifica un dato en la memoria, los otros hilos pueden acceder a ese dato modificado inmediatamente. En el ConfigUtility (antes de la dichosa mejora) cada objeto pertenece a un hilo, y este realiza la lectura del archivo. Si existen muchas lecturas al archivo, cada hilo correspondiente se espera a que el otro hilo suelte el archivo para poder leerlo completamente.

En el nuevo ConfigUtility, como la información del archivo en cuestión se mantiene en memoria como objeto (y esta información se comparte entre todas las instancias del objeto), la única vez que esta información pueda cambiar, es cuando el archivo XML real sea modificado. Sin este cambio la lectura del archivo era de 1.6 segundos, con el cambio solo la primera lectura tiene ese tiempo y las lecturas/invocaciones consecutivas retornan en un tiempo de 234 milisegundos.


"Run ... new instance of ReadConfiguration, Run!"


Pero los hilos comenzaron a molestarse, ya que en determinados momentos y circunstancias todos querían verificar si el archivo había cambiado, al mismo tiempo (lo que genera un error de concurrencia) y todos querían emplear el objeto en memoria (objeto que podía contener información corrupta, porque la lectura y escritura a este no era Atómica). Claro, acá falta explicar muchas cosas sobre como es el código en cuestión, atomicidad, concurrencia, locks, mutex y demás, pero se entiende la idea (bien) general (quizás más adelante escriba un poco sobre lo mencionado).




"El dilema de los Filosofos (Concurrencia)"


¿La solución? Sincronizar los hilos. Al menos la solución sencilla de implementar, consiste en emplear la palabra reservada de Java: Synchronize, para asegurarnos que un bloque de código (o un método completo) sea "Thread Safe", es decir, que en ese preciso bloque, los hilos harán "fila" para usarlo.


La lección:

Programar con la idea de la concurrencia en mente...  no solo cuando haces algo nuevo, sino que también cuando modificas algo existente. Hay que recordar, que en un ambiente con muchos clientes conectados que pueden emplear el mismo método en un determinado instante, puede suceder que treinta hilos corren salvajemente a utilizar un recurso critico, lo que podría resultar en un pequeño infierno de dudas, incertidumbres y defectos extraños, todo porque tu lógica no es "Thread Safe".


¡No se olviden de sincronizar sus hilos! Saludos :)

Hilos y Sincronización...

En el trabajo, existen un buen numero de componentes que fueron ideados para ser reusables o "genéricos", el diseño de estos a veces funciona y otras... digamos que dejan mucho que desear. Pero existe un componente que resulta interesante (más nada practico en lo personal, a pesar de que se esta usando), que terminan empleando todas las aplicaciones, y en pocas palabras, se encarga de determinar la configuración adecuada a emplear de acuerdo al ambiente (ruta e IP) en el que se encuentra, nos referiremos a este componente con el nombre ficticio de: "ConfigUtility". Para usar este componente en X aplicación, se instancia un objeto "ReadConfiguration", y se especifica de que aplicativo queremos la información, luego el ReadConfiguration, leerá de un archivo XML la configuración adecuada a la aplicación especificada.

Existen dos problemas fundamentales con el ConfigUtility...
El primero, es que cada vez que se realiza una instancia de este objeto, se realiza la lectura y conversión de un archivo XML a un objeto.
El segundo es que en un segundo, un proceso puede invocar hasta seis veces el ConfigUtility, lo que se convierte en seis lecturas del mismo archivo... y si son 100 usuarios los que usan ese proceso en un determinado instante (algo muy probable), entonces son 600 lecturas en un segundo de ese archivo.


Se me ocurrió mejorar los tiempos de carga del archivo realizan un "cache" del objeto en memoria, y modificar este hasta que el archivo XML cambie en el disco. Una buena idea cuando se prueba con una sola persona, pero que se convierte en un caos con muchas usuarios.






¿La razón del fracaso? los hilos de ejecución (Threads).

Un hilo de ejecución, es una característica en los procesadores que permite a una aplicación realizar varias tareas a la vez (concurrentemente), especialmente en los ambientes multi-núcleo modernos que se vuelven más y mas comunes. Los distintos hilos de ejecución comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situación de autenticación, etc.
Así una aplicación puede llevar a cabo distintas tareas simultáneamente por ejemplo: Writer de OpenOffice.org y Word, emplean hilos para ejecutar el proceso del corrector ortográfico mientras se escribe.


A la sumatoria de los hilos de ejecución y los recursos que estos comparten se les conoce como: proceso (Lo que ves cuando ejecutas Top en el bash, o el TaskManager en Windows). El hecho de que los hilos de ejecución de un mismo proceso compartan los recursos hace que cualquiera de estos hilos pueda modificar éstos. Cuando un hilo modifica un dato en la memoria, los otros hilos pueden acceder a ese dato modificado inmediatamente. En el ConfigUtility (antes de la dichosa mejora) cada objeto pertenece a un hilo, y este realiza la lectura del archivo. Si existen muchas lecturas al archivo, cada hilo correspondiente se espera a que el otro hilo suelte el archivo para poder leerlo completamente.

En el nuevo ConfigUtility, como la información del archivo en cuestión se mantiene en memoria como objeto (y esta información se comparte entre todas las instancias del objeto), la única vez que esta información pueda cambiar, es cuando el archivo XML real sea modificado. Sin este cambio la lectura del archivo era de 1.6 segundos, con el cambio solo la primera lectura tiene ese tiempo y las lecturas/invocaciones consecutivas retornan en un tiempo de 234 milisegundos.


"Run ... new instance of ReadConfiguration, Run!"


Pero los hilos comenzaron a molestarse, ya que en determinados momentos y circunstancias todos querían verificar si el archivo había cambiado, al mismo tiempo (lo que genera un error de concurrencia) y todos querían emplear el objeto en memoria (objeto que podía contener información corrupta, porque la lectura y escritura a este no era Atómica). Claro, acá falta explicar muchas cosas sobre como es el código en cuestión, atomicidad, concurrencia, locks, mutex y demás, pero se entiende la idea (bien) general (quizás más adelante escriba un poco sobre lo mencionado).




"El dilema de los Filosofos (Concurrencia)"


¿La solución? Sincronizar los hilos. Al menos la solución sencilla de implementar, consiste en emplear la palabra reservada de Java: Synchronize, para asegurarnos que un bloque de código (o un método completo) sea "Thread Safe", es decir, que en ese preciso bloque, los hilos harán "fila" para usarlo.


La lección:

Programar con la idea de la concurrencia en mente...  no solo cuando haces algo nuevo, sino que también cuando modificas algo existente. Hay que recordar, que en un ambiente con muchos clientes conectados que pueden emplear el mismo método en un determinado instante, puede suceder que treinta hilos corren salvajemente a utilizar un recurso critico, lo que podría resultar en un pequeño infierno de dudas, incertidumbres y defectos extraños, todo porque tu lógica no es "Thread Safe".


¡No se olviden de sincronizar sus hilos! Saludos :)

domingo, octubre 25, 2009

¿Quieres ir al Campus Party en México?

Lectores, esta breve nota seguramente les interesara: por medio de Twitter, Facebook y el blog de Oscar Guandique, me di cuenta de una buena noticia para todos aquellos que quieran revivir la experiencia de la Campus Party  Iberoamericana.




Resulta que Paco Gagageles, el Presidente de Futura Networks, que es la entidad organizadora de la Campus Party a nivel global, contacto al Grupo de Campuseros Salvadoreños en Facebook con una propuesta para los que tenian ganas de ir al CP en Mexico:

"Si se organiza al menos un bus de campuseros que parta a mexico, se les regala la entrada a la Campus Party México."

Requisitos mínimos:

También se pueden poner en contacto con la amiga @darkela para organizar la salida en bus y obtener detalles adicionales. Recomiendo que se suscriban al grupo en FB, esto es muy importante para estar al tanto de la ida al CP en Mexico.

¡Espero que les salga el viaje, saludos!

¿Quieres ir al Campus Party en México?

Lectores, esta breve nota seguramente les interesara: por medio de Twitter, Facebook y el blog de Oscar Guandique, me di cuenta de una buena noticia para todos aquellos que quieran revivir la experiencia de la Campus Party  Iberoamericana.




Resulta que Paco Gagageles, el Presidente de Futura Networks, que es la entidad organizadora de la Campus Party a nivel global, contacto al Grupo de Campuseros Salvadoreños en Facebook con una propuesta para los que tenian ganas de ir al CP en Mexico:

"Si se organiza al menos un bus de campuseros que parta a mexico, se les regala la entrada a la Campus Party México."

Requisitos mínimos:

También se pueden poner en contacto con la amiga @darkela para organizar la salida en bus y obtener detalles adicionales. Recomiendo que se suscriban al grupo en FB, esto es muy importante para estar al tanto de la ida al CP en Mexico.

¡Espero que les salga el viaje, saludos!

sábado, octubre 24, 2009

Trabajando con Google Web Toolkit y Google App Engine


"Logotipo del framework Google App Engine"


Habiendo salido de mi tesis recientemente, me he interesado en buscar hobbies relacionados con programación y en plasmar muchas ideas de software que vinieron a mi cabeza mientras estaba ocupado haciendo el trabajo de grado. Uno de los inconvenientes que tenemos los desarrolladores Java es que no existen en internet tantas alternativas para hosting de aplicaciones así como la gran variedad disponible para el Stack LAMP (Linux/Apache/Mysql/PHP).

Además, cada programador Java está acostumbrado a trabajar con su propio Stack y es bastante diversa la gama de combinaciones que se pueden armar entre sistema operativo, application server y framework para el entorno visual así como la base de datos y el framework para la persistencia de los datos, esto sin mencionar las versiones de cada una de estas soluciones informáticas. Esto hace aun mas difícil encontrar entornos (pagados o gratuitos) donde alojar nuestras aplicaciones web a menos que nos decidamos a montar nuestro propio server.

Buscando en internet me dí cuenta que Google ofrece una alternativa sencilla y barata (gratuita hasta cierto punto) para alojar aplicaciones desarrolladas con Java: Google App Engine.

Este servicio de google te permite desarrollar aplicaciones relativamente sencillas y hostearlas dentro de los servidores que ellos mismos te ofrecen. Eso si, no puede ser cualquier tipo de aplicación y lo mejor sería desarrollar aplicaciones orientadas a esta plataforma de Google, ya que estos ya te ofrecen la alternativa para la persistencia de los datos y los frameworks visuales a utilizar.

La ventaja es que el soporte se ve bastante decente (te brindan un plugin para Eclipse que te hace la mayor parte del trabajo de configuración y el upload de tu aplicación) además que la documentación te explica el framework de una manera bastante sencilla. En la galería de aplicaciones puedes ver las aplicaciones que otros ya han publicado, notando que algunas pueden ser bastante complejas y de un acabado muy profesional.

Lo único a tener en cuenta es que nada mas puedes subir 10 aplicaciones como máximo, y no puedes borrar una aplicación que ya has subido al server de Google.

Otro tema que me llamó la atención al navegar entre las soluciones de desarrollo de google fue el GWT, Google Web Toolkit. Este es un framework visual para apps web que te permite desarrollar aplicaciones sin la necesidad de escribir HTML o Javascript, generándolo todo desde clases Java. Es un framework bastante joven comparado con JSF, Struts o Tapestry pero teniendo el respaldo de google puede llegar lejos, ademas la idea de no escribir HTML será un alivio para muchos desarrolladores web que no saben mucho de estructuración y decoración de sitios web con HTML/CSS y desean una solución rápida y sencilla para sus interfaces. Al igual que con el App Engine Framework, Google apuesta nuevamente por eclipse brindando soporte para la creación de proyectos de GWT mediante asistentes y el uso de un navegador embedido que te permite realizar pruebas de tus aplicaciones sin necesidad de hacer deploy.

"Aplicación de ejemplo de uso de GWT, creada a partir de un proyecto web de eclipse con el plugin de GWT y App Engine. En la captura pueden apreciar el browser embedido que incluye el framework de GWT."

Cabe mencionar que GWT puede ser usado nada más para generar el HTML/Javascript de un sitio, usando cualquier otro lenguaje de programación del lado del server. Como ellos bien lo mencionan, este puede ser usado para generar front-ends en aplicaciones Ruby, Python, etc. Además es full Ajax-enabled trabajando de forma transparente con invocaciones a código del lado del servidor hecho con Java y mediante el uso de XML-RPC para otros lenguajes.

Trabajando con Google Web Toolkit y Google App Engine


"Logotipo del framework Google App Engine"


Habiendo salido de mi tesis recientemente, me he interesado en buscar hobbies relacionados con programación y en plasmar muchas ideas de software que vinieron a mi cabeza mientras estaba ocupado haciendo el trabajo de grado. Uno de los inconvenientes que tenemos los desarrolladores Java es que no existen en internet tantas alternativas para hosting de aplicaciones así como la gran variedad disponible para el Stack LAMP (Linux/Apache/Mysql/PHP).

Además, cada programador Java está acostumbrado a trabajar con su propio Stack y es bastante diversa la gama de combinaciones que se pueden armar entre sistema operativo, application server y framework para el entorno visual así como la base de datos y el framework para la persistencia de los datos, esto sin mencionar las versiones de cada una de estas soluciones informáticas. Esto hace aun mas difícil encontrar entornos (pagados o gratuitos) donde alojar nuestras aplicaciones web a menos que nos decidamos a montar nuestro propio server.

Buscando en internet me dí cuenta que Google ofrece una alternativa sencilla y barata (gratuita hasta cierto punto) para alojar aplicaciones desarrolladas con Java: Google App Engine.

Este servicio de google te permite desarrollar aplicaciones relativamente sencillas y hostearlas dentro de los servidores que ellos mismos te ofrecen. Eso si, no puede ser cualquier tipo de aplicación y lo mejor sería desarrollar aplicaciones orientadas a esta plataforma de Google, ya que estos ya te ofrecen la alternativa para la persistencia de los datos y los frameworks visuales a utilizar.

La ventaja es que el soporte se ve bastante decente (te brindan un plugin para Eclipse que te hace la mayor parte del trabajo de configuración y el upload de tu aplicación) además que la documentación te explica el framework de una manera bastante sencilla. En la galería de aplicaciones puedes ver las aplicaciones que otros ya han publicado, notando que algunas pueden ser bastante complejas y de un acabado muy profesional.

Lo único a tener en cuenta es que nada mas puedes subir 10 aplicaciones como máximo, y no puedes borrar una aplicación que ya has subido al server de Google.

Otro tema que me llamó la atención al navegar entre las soluciones de desarrollo de google fue el GWT, Google Web Toolkit. Este es un framework visual para apps web que te permite desarrollar aplicaciones sin la necesidad de escribir HTML o Javascript, generándolo todo desde clases Java. Es un framework bastante joven comparado con JSF, Struts o Tapestry pero teniendo el respaldo de google puede llegar lejos, ademas la idea de no escribir HTML será un alivio para muchos desarrolladores web que no saben mucho de estructuración y decoración de sitios web con HTML/CSS y desean una solución rápida y sencilla para sus interfaces. Al igual que con el App Engine Framework, Google apuesta nuevamente por eclipse brindando soporte para la creación de proyectos de GWT mediante asistentes y el uso de un navegador embedido que te permite realizar pruebas de tus aplicaciones sin necesidad de hacer deploy.

"Aplicación de ejemplo de uso de GWT, creada a partir de un proyecto web de eclipse con el plugin de GWT y App Engine. En la captura pueden apreciar el browser embedido que incluye el framework de GWT."

Cabe mencionar que GWT puede ser usado nada más para generar el HTML/Javascript de un sitio, usando cualquier otro lenguaje de programación del lado del server. Como ellos bien lo mencionan, este puede ser usado para generar front-ends en aplicaciones Ruby, Python, etc. Además es full Ajax-enabled trabajando de forma transparente con invocaciones a código del lado del servidor hecho con Java y mediante el uso de XML-RPC para otros lenguajes.

jueves, octubre 15, 2009

Apoyando a Happy Punk Panda

Este medio día, me tope con la triste noticia de que Gustavo Gutierrez (@flugus) falleció. Gustavo es el fundador de los estudios Happy Punk Panda.

Happy Punk Panda (HPP), se dedica al diseño de sitios Web, a la animación (2D y 3D) y multimedia en general. Uno de sus proyectos más ambiciosos: "La Leyenda de la Carreta Bruja", fue el que me hizo ver el espiritu emprededor de Gustavo y del equipo de HPP.

Conocí a Gustavo el año pasado, en la Campus Party Iberoamericana, y hace poco comenzamos a hablar un poco mas seguido. Sinceramente, puedo decir que es de las pocas personas (al menos en El Salvador) que admiro. Dedicado, honesto, proactivo y trabajador son caracteristicas que lo definian, a el y a su equipo. Espero sinceramente, que el equipo de Happy Punk Panda no se desanime, que sigan con su trabajo como siempre, y que no dejen a Gito Gito (la mascota) sin familia...

"Gito Gito"

Este blog se une al luto de Happy Punk Panda, y oramos por la familia y amigos de Gustavo para resignarce ante la perdida. "Te fuiste a animar el cielo".

Apoyando a Happy Punk Panda

Este medio día, me tope con la triste noticia de que Gustavo Gutierrez (@flugus) falleció. Gustavo es el fundador de los estudios Happy Punk Panda.

Happy Punk Panda (HPP), se dedica al diseño de sitios Web, a la animación (2D y 3D) y multimedia en general. Uno de sus proyectos más ambiciosos: "La Leyenda de la Carreta Bruja", fue el que me hizo ver el espiritu emprededor de Gustavo y del equipo de HPP.

Conocí a Gustavo el año pasado, en la Campus Party Iberoamericana, y hace poco comenzamos a hablar un poco mas seguido. Sinceramente, puedo decir que es de las pocas personas (al menos en El Salvador) que admiro. Dedicado, honesto, proactivo y trabajador son caracteristicas que lo definian, a el y a su equipo. Espero sinceramente, que el equipo de Happy Punk Panda no se desanime, que sigan con su trabajo como siempre, y que no dejen a Gito Gito (la mascota) sin familia...

"Gito Gito"

Este blog se une al luto de Happy Punk Panda, y oramos por la familia y amigos de Gustavo para resignarce ante la perdida. "Te fuiste a animar el cielo".

miércoles, octubre 14, 2009

¿Qué es Heurística?

Si has "escaneado" tu máquina con un antivirus, y pasaste minutos de tu vida mirando la barra de progreso y los comentarios en cada archivo, probablemente viste mas de alguna vez (y con cualquier buen antivirus) la palabra: heurística.

"Fuera interesante ver el progreso de escaneo de un ativirus así"

En la mayoría de antivirus, la heurística se refiere a una técnica especifica para reconocer código malicioso (virus, gusanos, troyanos, etc.) que este (el antivirus) no posea en su base de datos por diversas razones, como que los programas maliciosos sean nuevos o poco divulgados.

La heurística, como termino general, implica funcionalidades como detección a través de firmas genéricas, reconocimiento del código compilado, desensamblado, desempaquetamiento, entre otros. Recordemos que los antivirus, son como inmensos programas de listas negras, si encuentran algo en memoria o en el disco que sea igual a lo que esta en su base de datos lo eliminan inmediatamente. Y con la heurística, sus capacidades para detectar software malicioso aumenta. La importancia comercial y técnica de la heurística (al menos en los antivirus) radica en el hecho de ser la única defensa automática y reactiva posible frente a la aparición de nuevo software maliciosos de los que no se posea "firmas" o conocimiento alguno (en la base de datos).
Pero claro, el costo de la seguridad es el desempeño y por esta misma razón mientras mas detallado o profundo sea el análisis heurístico de un antivirus, más pobre sera el rendimiento del mismo.
La heurística no solo se emplea como palabra complicada para denotar una técnica que todo antivirus decente debería tener, sino que también se emplea en el area de la inteligencia artificial. Muchos algoritmos de "denominada" inteligencia artificial son heurísticos por naturaleza o usan reglas heurísticas, un excelente ejemplo es SpamAssassin que usa una amplia variedad de reglas heurísticas para determinar cuando un email es spam...

"SpamAssassin = Apache.org + Heuristics"

Cualquiera de las reglas usadas de forma independiente pueden llevar a errores de clasificación, pero cuando se unen múltiples reglas heurísticas, la solución es más robusta y creíble. Esto se llama alta credibilidad en el reconocimiento de patrones.

Ahora bien, no todo es bueno con la heurística... si algo podemos decir de un algoritmo cualquiera, es que este se pueda ejecutar varias veces, y su resultado sea óptimo. Por irónico que parezca, un algoritmo heurístico abandona estos objetivos para obtener una buena solucion, que pudiera convertirse arbitrariamente en una mala solucion, como los famosos falsos positivos en un antivirus...

":@ esto es lo mas terrible del mundo, un falso positivo en un archivo perfectamente sano."

O sino, el algoritmo heurístico se ejecuta razonablemente rápido, pero no hay argumento de que esto siga sucediendo siempre. Finalmente, y con la música de Eurythmics de fondo...


"Eurythmics - Sweet Dreams"

...quiero cerrar esta breve explicación de un tema tan amplio citando al científico Judea Pearl: "Heurística, son métodos basados en búsquedas inteligentes de estrategias para resolver problemas computacionales utilizando muchos acercamientos alternativos."

Espero que les sirva, ¡Saludos!

¿Qué es Heurística?

Si has "escaneado" tu máquina con un antivirus, y pasaste minutos de tu vida mirando la barra de progreso y los comentarios en cada archivo, probablemente viste mas de alguna vez (y con cualquier buen antivirus) la palabra: heurística.

"Fuera interesante ver el progreso de escaneo de un ativirus así"

En la mayoría de antivirus, la heurística se refiere a una técnica especifica para reconocer código malicioso (virus, gusanos, troyanos, etc.) que este (el antivirus) no posea en su base de datos por diversas razones, como que los programas maliciosos sean nuevos o poco divulgados.

La heurística, como termino general, implica funcionalidades como detección a través de firmas genéricas, reconocimiento del código compilado, desensamblado, desempaquetamiento, entre otros. Recordemos que los antivirus, son como inmensos programas de listas negras, si encuentran algo en memoria o en el disco que sea igual a lo que esta en su base de datos lo eliminan inmediatamente. Y con la heurística, sus capacidades para detectar software malicioso aumenta. La importancia comercial y técnica de la heurística (al menos en los antivirus) radica en el hecho de ser la única defensa automática y reactiva posible frente a la aparición de nuevo software maliciosos de los que no se posea "firmas" o conocimiento alguno (en la base de datos).
Pero claro, el costo de la seguridad es el desempeño y por esta misma razón mientras mas detallado o profundo sea el análisis heurístico de un antivirus, más pobre sera el rendimiento del mismo.
La heurística no solo se emplea como palabra complicada para denotar una técnica que todo antivirus decente debería tener, sino que también se emplea en el area de la inteligencia artificial. Muchos algoritmos de "denominada" inteligencia artificial son heurísticos por naturaleza o usan reglas heurísticas, un excelente ejemplo es SpamAssassin que usa una amplia variedad de reglas heurísticas para determinar cuando un email es spam...

"SpamAssassin = Apache.org + Heuristics"

Cualquiera de las reglas usadas de forma independiente pueden llevar a errores de clasificación, pero cuando se unen múltiples reglas heurísticas, la solución es más robusta y creíble. Esto se llama alta credibilidad en el reconocimiento de patrones.

Ahora bien, no todo es bueno con la heurística... si algo podemos decir de un algoritmo cualquiera, es que este se pueda ejecutar varias veces, y su resultado sea óptimo. Por irónico que parezca, un algoritmo heurístico abandona estos objetivos para obtener una buena solucion, que pudiera convertirse arbitrariamente en una mala solucion, como los famosos falsos positivos en un antivirus...

":@ esto es lo mas terrible del mundo, un falso positivo en un archivo perfectamente sano."

O sino, el algoritmo heurístico se ejecuta razonablemente rápido, pero no hay argumento de que esto siga sucediendo siempre. Finalmente, y con la música de Eurythmics de fondo...


"Eurythmics - Sweet Dreams"

...quiero cerrar esta breve explicación de un tema tan amplio citando al científico Judea Pearl: "Heurística, son métodos basados en búsquedas inteligentes de estrategias para resolver problemas computacionales utilizando muchos acercamientos alternativos."

Espero que les sirva, ¡Saludos!

miércoles, octubre 07, 2009

¿Por qué Aprender RPG?

La primera vez que escuché hablar del lenguaje de programación RPG mi expresión fue: "What? Role Playing Game? :O" porque al igual que muchos programadores, tampoco tenía idea de la existencia de este lenguaje de programación. Aun así, es un lenguaje tan antíguo como Fortran, tan robusto como Java y tan tedioso como Assembler.

"Final Fantasy VII. Hasta ese entonces, esto es lo que yo conocía como RPG"

La razón por la que RPG no es tan popular como el resto de lenguajes se debe a su aplicación y por la plataforma donde este lenguaje es usado. Esto quiere decir que no encontrarás un IDE o un compilador de RPG para plataformas Intel (como cualquier PC en el mercado) sino que únicamente está disponible para plataformas IBM AS/400.

AS/400?

Es un modelo de mainframes desarrollados por IBM, ahora integrado con otros modelos para formar la familia IBM Power Systems. Estos mainframes son comúnmente utilizados en grandes empresas cuando estas requieren equipo de alto rendimiento para procesar grandes cantidades de transacciones o para contar con un entorno de múltiples servidores virtualres. Estos equipos cuestan candidades de cinco cifras como mínimo por lo que no cualquierea puede tener uno de estos en su casa para dedicarse a aprender a programar en RPG.

Esta dificultad para concer el lenguaje ha permitido que existan relativamente pocos programadores conocedores del lenguaje y esto por ende los vuelve muy cotizados en el mercado.

Aparte de eso, el lenguaje no es tan amigable que digamos especialmente considerando que ya tiene más de cuarenta años de existencia y está muy lejos de ser jubilado. Su apariencia es como una combinación de Assembler (por el hecho de definir su estructura basada en posiciones o columnas) y Fox (por la integración directa con gestor de bases de datos). Ejemplo de ello es la complejidad que implica desarrollar el tan popular programa Hello World:

"Ejemplo del programa Hello World escrito en RPG IV (ILE) tomado de The Hello World Collection"

Por este hecho, si tienes la oportunidad de trabajar en algún lugar donde cuenten con un servidor AS/400 les recomiendo de sobremanera aprender a utilizar el lenguaje RPG con el que podrán optar a nuevas y mejores oportunidades de empleo.

Admito que ni el lenguaje ni la plataforma se llevan bien con la filosofía del software libre o código abierto. IBM siempre ha sido muy cerrado en este aspecto pero aun así todos sabemos que los sistemas basados en el software libre son hoy en día una realidad inminente y la adaptación algo inevitable por lo que esperemos que IBM tome en consideración este hecho así como Sun Microsystems lo hizo alguna vez con Java.

¿Por qué Aprender RPG?

La primera vez que escuché hablar del lenguaje de programación RPG mi expresión fue: "What? Role Playing Game? :O" porque al igual que muchos programadores, tampoco tenía idea de la existencia de este lenguaje de programación. Aun así, es un lenguaje tan antíguo como Fortran, tan robusto como Java y tan tedioso como Assembler.

"Final Fantasy VII. Hasta ese entonces, esto es lo que yo conocía como RPG"

La razón por la que RPG no es tan popular como el resto de lenguajes se debe a su aplicación y por la plataforma donde este lenguaje es usado. Esto quiere decir que no encontrarás un IDE o un compilador de RPG para plataformas Intel (como cualquier PC en el mercado) sino que únicamente está disponible para plataformas IBM AS/400.

AS/400?

Es un modelo de mainframes desarrollados por IBM, ahora integrado con otros modelos para formar la familia IBM Power Systems. Estos mainframes son comúnmente utilizados en grandes empresas cuando estas requieren equipo de alto rendimiento para procesar grandes cantidades de transacciones o para contar con un entorno de múltiples servidores virtualres. Estos equipos cuestan candidades de cinco cifras como mínimo por lo que no cualquierea puede tener uno de estos en su casa para dedicarse a aprender a programar en RPG.

Esta dificultad para concer el lenguaje ha permitido que existan relativamente pocos programadores conocedores del lenguaje y esto por ende los vuelve muy cotizados en el mercado.

Aparte de eso, el lenguaje no es tan amigable que digamos especialmente considerando que ya tiene más de cuarenta años de existencia y está muy lejos de ser jubilado. Su apariencia es como una combinación de Assembler (por el hecho de definir su estructura basada en posiciones o columnas) y Fox (por la integración directa con gestor de bases de datos). Ejemplo de ello es la complejidad que implica desarrollar el tan popular programa Hello World:

"Ejemplo del programa Hello World escrito en RPG IV (ILE) tomado de The Hello World Collection"

Por este hecho, si tienes la oportunidad de trabajar en algún lugar donde cuenten con un servidor AS/400 les recomiendo de sobremanera aprender a utilizar el lenguaje RPG con el que podrán optar a nuevas y mejores oportunidades de empleo.

Admito que ni el lenguaje ni la plataforma se llevan bien con la filosofía del software libre o código abierto. IBM siempre ha sido muy cerrado en este aspecto pero aun así todos sabemos que los sistemas basados en el software libre son hoy en día una realidad inminente y la adaptación algo inevitable por lo que esperemos que IBM tome en consideración este hecho así como Sun Microsystems lo hizo alguna vez con Java.

lunes, octubre 05, 2009

Día del Informático

Cuando comencé mi carrera, como a todos, los compañeros solían preguntarme: ¿Porque estudias Sistemas?. Yo usualmente respondía así:

"Estudio sistemas, porque cuando ordeno algo a la máquina, esta no se equivoca, y si lo hace, es mi culpa, y no de nadie mas."

Simple, practico y directo... yo no quería tener absolutamente nada que ver con personas y "manejarlas" (administrarlas), y por algún tiempo pensé que seria posible hacerlo... y vaya que estaba terriblemente equivocado.

Claro, en "aquellos días" era un muchacho mucho mas enojado y bélico de
lo que soy ahora (gracias a Diosito que me he calmado). Tenia poca confianza y animos para hablar con la gente de software, principalmente por que de por si, casi cualquier tema de informática en una conversación tiene el potencial de dejar en la luna a muchas personas, y también habrá siempre alguno que no entienda lo que se dijo, ¡ah! y claro: los tecnicismos no ayudan para nada, en fin, toda una frustración.

Así que me forme la idea de que la gente, era algo que tenia que eliminar de la ecuación de mi carrera, y limitarme a programar por programar y listo. Pasar horas frente a la PC, aprendiendo de forma autodidacta seria mejor que estar con las personas que no entendían pero ni papa de lo que hago.

Error, grave, grave error....

¿Saben como me dí cuenta de lo equivocado que estaba?: cuando note, que no podía hacer participe de mi alegría en alguna asignatura/trabajo a mi mamá, y contarle que al fin entendí el concepto de "instancia de una clase" (no me lo explicaron bien en Progra II), o pude compilar por primera vez un kernel sin que diera "Kernel Panic"... porque para mi era demasiado difícil explicarle lo que había hecho... bien fregado.

Luego el aprendizaje y programación se volvieron solitarios, y por lo tanto aburridos, y luego me tope con la filosofía del software libre, y la idea de compartir el código y programar bien (para que la gente entienda ese código) y discutir el código, mejorarlo, y de pronto... me gusto eso de las comunidades de Linux y software libre (como la de Ubuntu SV, que los veo muy unidos). Que bueno que esos dias ya pasaron y ahora todo es más sencillo, y este blog es prueba de eso, o al menos, eso intentamos.

Verán, quieran o no, la gente SI importa en este medio, y vale la pena escribir y explicar la tecnología (y aprender a explicarlo) y reducir la famosa "brecha digital".

Si vos, lector, crees que nunca vas a tener que tratar con gente por darle mantenimiento a tu super servidor, en un cuarto frío, o que gastas horas de tu vida
programando como loco y no podes socializar "fuera de la cajita", dejame
decirte (con mucho respeto) que estas tirando tu vida al carajo.

Acordate que por eso: estudiar en grupo es mejor y más divertido, y que
hacer "Extreme Programming" suele ayudar y funciona en momentos de crisis, y los juegos de computadora que más $$$ dan son los de multijugadores.

La informática, en si misma, sin programadores, sin usuarios, sin
bloggers, sin gente bayunca que atesta sus paginas de Hi5 con miles de
tonterías, y sin los que sueña con cambiar el fondo de su pagina en FaceBook, pues seria terriblemente aburrida (a mi ya me dan risa).

¡FaceBook Spam!

La informática, sin gente, se convierte en simples unos y ceros, "sentados" en un
disco duro, inertes.

"Real programmers code for people"

En mi experiencia, pocas cosas dan tanta satisfacción como saber que lo que estoy haciendo (programando) hará a alguien su vida más fácil (es decir: ayudar). Que ya no tendrá que pasar 3 horas diarias de su vida, realizando la misma tarea, porque le ayude a automatizarla, y ahora tendrá más tiempo para hacer algo mas (quizas le den otro trabajo, pero eso no importa jajaja).

No hay como saber, que la gente esta usando todos los días un software en el que ayudaste, y en algún momento, esos unos y ceros se van a mover y transformar en datos útiles, en proyecciones, estadísticas, reportes, imágenes, sonidos, sorpresas, en alegrías o tristezas.

"Se trabaja para el usuario, no para la máquina"

Porque lo que hace el que se dedica a la informática, no debe ser: pasar horas
frente a la máquina para hacer un programa, sino más bien: pasar horas sentados por los usuarios, para que no pierdan tiempo, para que su vida sea más fácil, para hacerlos mas felices, para acercarlos, para llevarles mas información a la punta de los dedos.

Muchas de las razones para estudiar Ingeniería de Sistemas, que escuche cuando comencé la carrera, fueron:

  1. Esta de moda.
  2. Da pisto eso, es la carrera del futuro.
  3. Quiero hacer un juego/Me gustan los juegos.
  4. Puedo usar paint, y eso de mover el mouse... y me gusta pasar en la máquina.
  5. Es que es bien "chivo chatiar" en el "mazinger" y me gusta pasar en la máquina

... los últimos dos son verídicos.

Con el tiempo, los puntos mencionados se vuelven razones obviamente equivocadas para elegir una carrera afín a la informática, y la mía peor. Más sin embargo he acuñando y descubierto mi razón personal para seguir por este caminito digital, y la comparto con el fin de que a alguien le sirva... ahora si alguien me pregunta ¿por qué estudiaste sistemas? yo le respondo:

"Porque me quería convertir en el comunicador entre las necesidades el usuario y la información de la máquina."

Creo que de eso es ser informático, y a todos ustedes, que son un puente entre la carne y el metal, entre neurona y transistor, que unen brechas, entre la creatividad y los cálculos para ayudar a los usuarios, les deseo un feliz día del informático.

Atentamente:

Rodrigo Amaya

Día del Informático

Cuando comencé mi carrera, como a todos, los compañeros solían preguntarme: ¿Porque estudias Sistemas?. Yo usualmente respondía así:

"Estudio sistemas, porque cuando ordeno algo a la máquina, esta no se equivoca, y si lo hace, es mi culpa, y no de nadie mas."

Simple, practico y directo... yo no quería tener absolutamente nada que ver con personas y "manejarlas" (administrarlas), y por algún tiempo pensé que seria posible hacerlo... y vaya que estaba terriblemente equivocado.

Claro, en "aquellos días" era un muchacho mucho mas enojado y bélico de
lo que soy ahora (gracias a Diosito que me he calmado). Tenia poca confianza y animos para hablar con la gente de software, principalmente por que de por si, casi cualquier tema de informática en una conversación tiene el potencial de dejar en la luna a muchas personas, y también habrá siempre alguno que no entienda lo que se dijo, ¡ah! y claro: los tecnicismos no ayudan para nada, en fin, toda una frustración.

Así que me forme la idea de que la gente, era algo que tenia que eliminar de la ecuación de mi carrera, y limitarme a programar por programar y listo. Pasar horas frente a la PC, aprendiendo de forma autodidacta seria mejor que estar con las personas que no entendían pero ni papa de lo que hago.

Error, grave, grave error....

¿Saben como me dí cuenta de lo equivocado que estaba?: cuando note, que no podía hacer participe de mi alegría en alguna asignatura/trabajo a mi mamá, y contarle que al fin entendí el concepto de "instancia de una clase" (no me lo explicaron bien en Progra II), o pude compilar por primera vez un kernel sin que diera "Kernel Panic"... porque para mi era demasiado difícil explicarle lo que había hecho... bien fregado.

Luego el aprendizaje y programación se volvieron solitarios, y por lo tanto aburridos, y luego me tope con la filosofía del software libre, y la idea de compartir el código y programar bien (para que la gente entienda ese código) y discutir el código, mejorarlo, y de pronto... me gusto eso de las comunidades de Linux y software libre (como la de Ubuntu SV, que los veo muy unidos). Que bueno que esos dias ya pasaron y ahora todo es más sencillo, y este blog es prueba de eso, o al menos, eso intentamos.

Verán, quieran o no, la gente SI importa en este medio, y vale la pena escribir y explicar la tecnología (y aprender a explicarlo) y reducir la famosa "brecha digital".

Si vos, lector, crees que nunca vas a tener que tratar con gente por darle mantenimiento a tu super servidor, en un cuarto frío, o que gastas horas de tu vida
programando como loco y no podes socializar "fuera de la cajita", dejame
decirte (con mucho respeto) que estas tirando tu vida al carajo.

Acordate que por eso: estudiar en grupo es mejor y más divertido, y que
hacer "Extreme Programming" suele ayudar y funciona en momentos de crisis, y los juegos de computadora que más $$$ dan son los de multijugadores.

La informática, en si misma, sin programadores, sin usuarios, sin
bloggers, sin gente bayunca que atesta sus paginas de Hi5 con miles de
tonterías, y sin los que sueña con cambiar el fondo de su pagina en FaceBook, pues seria terriblemente aburrida (a mi ya me dan risa).

¡FaceBook Spam!

La informática, sin gente, se convierte en simples unos y ceros, "sentados" en un
disco duro, inertes.

"Real programmers code for people"

En mi experiencia, pocas cosas dan tanta satisfacción como saber que lo que estoy haciendo (programando) hará a alguien su vida más fácil (es decir: ayudar). Que ya no tendrá que pasar 3 horas diarias de su vida, realizando la misma tarea, porque le ayude a automatizarla, y ahora tendrá más tiempo para hacer algo mas (quizas le den otro trabajo, pero eso no importa jajaja).

No hay como saber, que la gente esta usando todos los días un software en el que ayudaste, y en algún momento, esos unos y ceros se van a mover y transformar en datos útiles, en proyecciones, estadísticas, reportes, imágenes, sonidos, sorpresas, en alegrías o tristezas.

"Se trabaja para el usuario, no para la máquina"

Porque lo que hace el que se dedica a la informática, no debe ser: pasar horas
frente a la máquina para hacer un programa, sino más bien: pasar horas sentados por los usuarios, para que no pierdan tiempo, para que su vida sea más fácil, para hacerlos mas felices, para acercarlos, para llevarles mas información a la punta de los dedos.

Muchas de las razones para estudiar Ingeniería de Sistemas, que escuche cuando comencé la carrera, fueron:

  1. Esta de moda.
  2. Da pisto eso, es la carrera del futuro.
  3. Quiero hacer un juego/Me gustan los juegos.
  4. Puedo usar paint, y eso de mover el mouse... y me gusta pasar en la máquina.
  5. Es que es bien "chivo chatiar" en el "mazinger" y me gusta pasar en la máquina

... los últimos dos son verídicos.

Con el tiempo, los puntos mencionados se vuelven razones obviamente equivocadas para elegir una carrera afín a la informática, y la mía peor. Más sin embargo he acuñando y descubierto mi razón personal para seguir por este caminito digital, y la comparto con el fin de que a alguien le sirva... ahora si alguien me pregunta ¿por qué estudiaste sistemas? yo le respondo:

"Porque me quería convertir en el comunicador entre las necesidades el usuario y la información de la máquina."

Creo que de eso es ser informático, y a todos ustedes, que son un puente entre la carne y el metal, entre neurona y transistor, que unen brechas, entre la creatividad y los cálculos para ayudar a los usuarios, les deseo un feliz día del informático.

Atentamente:

Rodrigo Amaya

Sunsetting Sr. Byte.

El Sr. Byte ha estado más de 5 años inactivo. Digamos que estaba en " code freeze ". Pero ahora es el último release. Quizas no...