Archivo

Archivo para la categoría ‘programación’

¿Como saber el tipo de un archivo? (I)

Sábado, 26 de febrero de 2011

Por alguna razón, este articulo viejo ha tenido algo de tráfico en los últimos días. Me dí cuenta que la idea de usar Java y JNI nunca se materializó, sólo dí unas pistas.

Una forma de hacer esto es llamando a la librería ‘magic’. Magic viene prácticamente en cualquier sistema operativo que se parezca a UNIX que se respete, como BSD, OSX y por supuesto Linux.

Si usted llama a la página man (man 3 libmagic) allí encontrará suficiente información. Por ejemplo, aquí les muestro un pequeño programa que hice en C el cual detecta el tipo de archivo que usted le pase por la línea de comandos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include 
#include 
 
/*
 * Program that shows how to use the magic library to figure out the type of a file
 * @author Jose V Nunez (josevnz@kodegeek.com)
 * License: BSD
 */
int main(int argc, char ** argv) {
 
        if (argc == 1) {
                printf("[ERROR]: Please provide the file name to check and try again!\n");
                return 1;
        }
 
        // See manpage libmagic for details on what this flags mean
        int flags = MAGIC_SYMLINK|MAGIC_COMPRESS|MAGIC_CONTINUE|MAGIC_PRESERVE_ATIME|MAGIC_ERROR;
 
        magic_t cookie = magic_open(flags);
        if (cookie == NULL) {
                printf("There was a problem opening the magic library!\n");
                return 1;
        }
        int status = magic_load(cookie, NULL);
        if (status != 0) {
                printf("Unable to load magic default database!, %s\n", magic_error(cookie));
                magic_close(cookie);
                return 1;
        }
 
        const char * file_details =  magic_file(cookie, argv[1]);
        printf("Type for file: %s is %s\n", argv[1], file_details);
 
        magic_close(cookie);
        return 0;
}

Para compilarlo les dejo un archivo Makefile:

1
2
3
CPPFLAGS += -O2 -L/Users/Shared/lib -I/Users/Shared/include -lmagic
all: magic.c
        $(CC) $(CPPFLAGS) magic.c -o magic

Y finalmente como se corre:

1
2
3
4
5
auyan:c josevnz$ make
cc -O2 -L/Users/Shared/lib -I/Users/Shared/include -lmagic magic.c -o magic
auyan:c josevnz$ ./magic /Users/josevnz/CTX.DAT
Mime type for file: /Users/josevnz/CTX.DAT is Java serialization data, version 5
auyan:c josevnz$

En la siguiente entrada las prometo como hacer esto desde Java (pista, vamos a utilizar JNI).

–José

c, java, mime magic libmagic jni java, opensource, programación , , , , , ,

Resoluciones de navidad, año nuevo y otros

Viernes, 31 de diciembre de 2010

2010-11-02 08.06.11.jpg
Como el tren, un año que se va y otro que viene con cosas nuevas.

Leyendo un articulo que publiqué en el 2006, me di cuenta lo malo que es hacer resoluciones de año nuevo. No sólo terminé haciendo cosas que prometí no hacer de la lista (como comprar un XBOX360), sino que hubo cosas que no hice (como programar Ruby, algo que nunca despegó para mí).

Así que mejor les escribo sobre las cosas que SI traté de hacer y como salieron (bien o mal). Voy a empezar por las cosas malas ya que soy el eterno pesimista en estas listas.

IMG_1043.JPG
Hubo un par de ‘muertos’ este año, y ¡no me refiero a los Zombies en Times Square!

Las cosas que salieron mal:

  • JavaFX: Después de varios libros, problemas con Eclipse y finalmente la decisión por parte de Oracle de matar a JavaFX script para volverlo un API, sólo puedo decir que JavaFX fué una de los peores barrancos de este año. La inversión en libros y horas de aprender esta tecnología fueron una perdida de tiempo, en parte por la debacle en la que Sun se vio involucrada. Oracle promete una versión 2.0 mejor integrada con Java para el año que viene, sin embargo esta vez no pienso invertir tiempo en esta tecnología al menos que comience a mostrar signos de madurez. Lo siento JavaFX, está vez me tienes que seducir y mostrar que existe un nivel decente de adopción. No se si el mercado de JavaFX son los dispositivos celulares o si son los clientes de escritorio. Amanecerá y veremos…
  • Ruby: Probé usarlo en varios proyectos de la oficina (si ninguno web, olvídense de Rails). Probé JRuby pero al final terminé volviendo a Perl (salir rápido del apuro) o Bean Shell (es increíble lo versátil de este lenguaje, tan pegado a Java) y Python (curiosamente no Jython). Aún ando indeciso con cual debería ser el siguiente lenguaje en mi lista de herramientas, me hace falta una experiencia para enamorarme del nuevo lenguaje :D
  • StupidZombie: Si, después de lanzar el proyecto perdí interés en este ya que WordPress me ofrece lo que hace StupidZombie. Logró su cometido, pero no hay funcionalidad extra que quiera desarrollar y nunca logró despertar el suficiente interés (solamente 600 descargas o algo así). Quizas reviva el proyecto con otro nombre o con otra aplicación, quizas una excusa para re-escribirlo en JavaFX cuando salga la versión 2.0. Si pasa algo, lo publicaré en este blog.

Serpiente marina, detalle del vapor
Hubo más cosas buenas que malas este año. En la foto, la serpiente marina de las máquinas de Nantes

las que salieron bien:

  • Mente sana en cuerpo sano: El desafío de este año fué más grande, mantener la misma condición sin faltar a la rutina; Fué más complicado, ya que ahora el entrenamiento es de mantenimiento y de progreso, lo cual implica mantener el balance entre tiempo con la familia, trabajo y tiempo libre. Debo admitir que fui algo obsesivo durante unas geniales vacaciones por Europa en cuanto a la comida, pero al final logré relajarme un poco y disfrutar como es debido.  Aprendiendo sobre la marcha dicen por allí. Ahora estoy más esperanzado a que puedo mantener este ritmo en los años que vienen. Ya no veo al entrenamiento como una obligación sino que se me ha hecho una necesidad. Estoy más claro de lo que quiero hacer y este año que viene haré otras cosas en combinación con los ejercicios de resistencia.
  • Muerte de CVS, viva Subversion: Si, este año fué el año en el que al final me despedí de CVS tanto en el trabajo como en mis proyectos de código abierto. Las herramientas de migración son muy fáciles de usar, maduras y en general estoy muy contento con SVN por su desempeño y habilidades. Aún no me terminan de convencer los repositorios distribuidos como Mercurial o Git, no porque sean malos sino porque no necesito su funcionalidad (mis proyectos personales o el trabajo). Estoy encantado con las propiedades extendidas, el soporte de WebDav y las opciones mejoradas de ‘Merge+Copy’. El año que viene estoy escribiendo clientes con los ‘binding’ de Subversion en Java, y espero hacer integración con Ant y Apache Ivy.
  • Adicto a probar mi código buscando fallas: Este año le agregué nueva funcionalidad a la aplicación con la que mi grupo hace dinero, comprando y vendiendo opciones. En el proceso me volví más familiar con ‘Java remote debugging‘, el nuevo (para mí al menos) JUnit 4.0, entonando las opciones de manejo de memoria de la máquina virtual de Java en aplicaciones críticas. No me gusta llamarlo ‘agile programming’ pero trabaje mucho más cerca de otros de los programadores con los que comparto la oficina resolviendo problemas. El año que viene va a ser mucho más agitado ya que estamos creciendo (omito los detalles) así que no queda otra que ser más eficientes con lo que se tiene a la mano :D (entre otras cosas voy a trabajar con instrumentación en tiempo real)

La lista en sencilla, corta y creo que se deben mantener así. Sino, ¿de que otra forma se cumplen los objetivos?

2010 Oyster Festival
A quienes vistan este blog, les deseo muchas ‘Super felicidades’ en estas fechas, que la pasen bien con sus familias y el año que viene les ofreceré mis opiniones sobre el mundo ‘Geek’ que nos rodea :)

–José

kodegeek, programación

Book reviews: JavaFX 1.2 Application Development Cookbook

Miércoles, 17 de noviembre de 2010

JavaFX 1.2 Application Development Cookbook is a really nice book; The cookbook title is a little bit misleading as the book is a quick progression over the features of the language and how it can be used to write applications, all done in a very professional y concise manner.

Then why it is difficult to wrote about this book? Well, the first issue is than the latest API (with significant changes) for JavaFX is 1.3 while the book is written for 1.2; There are several performance and stability improvements, new graphic controls so this was definitely an mandatory upgrade for anyone thinking seriously into using the language. But the real deal breaker here is than JavaFX script is being discontinued and instead is being made a proper Java API that can be used by your regular Java developers.

All this will happen on the ‘JavaFX 2.0′ version of the language, sometime next year. Also JavaFX script is not really dead … is reincarnated as an open source platform called Visage.

So if I were you I would wait to see how JavaFX 2.0 looks like instead, no investment in books or coding for the time being. As for Visage, I would rather go for a head to head comparison with other tools like Apache Pivot which is more mature at this point.

The good: The book is a good one, easy to read and with good concrete examples. The price tag is also good.

The bad: Not a problem with the book itself, but the technology is changing to fast and too much, so it doesn’t make sense to invest on this book. Wait until Oracle delivers JavaFX 2.0.

The ugly: Oracle should have pull the plug sooner. JavaFX has lost a lot of momentum and makes you wonder if now it’s real purpose will be to replace an aging Swing on the desktop.

There are great things scheduled for JavaFX, but we will have to wait some more to see them. Perhaps a new version of this book will be more than welcome once the new version is out.

–Jose

java, javafx, oracle, programación , , , ,

JavaFX Script ha muerto, Swing aún sigue en pie

Martes, 21 de septiembre de 2010

Bueno, es un cambio de tono que no esperaba. En JavaOne de este año anunciaron que JavaFX Script está muerto y en va a tener integración desde Swing y otros lenguajes dinámicos.

Las mentadas de madre no se hicieron esperar en Twitter y otros lados el día de hoy. Después de todo son 3 años en los cuales un producto se vuelve a reiniciar (yo me cuento entre quienes perdieron el tiempo leyendo sobre JavaFX). Por otro lado, Java Swing necesita mejoras pronto y quizas esta es la mejor decisión.

Como que alguien en Oracle se dio cuenta que la inversión en Swing de tantos años no se puede botar a la basura, sin embargo queda por verse si vale la pena invertir el tiempo en JavaFX antes de la versión 2.0 (apenas estamos en 1.3, la cual tiene todavía muchos huecos).

¿Quiere más detalles (código)? Aquí tienen una muestra de lo que viene…

java , , , ,

And the winner of the JavaFXpert RIA Exemplar Challenge

Lunes, 20 de septiembre de 2010

La aplicación es una belleza, además de que el código y el problema que resuelve son interesantes. Si agregar más nada
And the winner [of the JavaFXpert RIA Exemplar Challenge]

¡Ah, y tiene código abierto!

java, kodegeek, opensource, oracle, programación ,

Opciones útiles de la máquina virtual de Java

Miércoles, 15 de septiembre de 2010

Bueno, está página es super conocida para quienes usan la máquina virtual de Java por parte de Oracle.

Yo en particular corro procesos los cuales pasan largo tiempo haciendo cosas durante el día. Una de las cosas que quiero que hagan es que si se mueren me digan porqué. En especial uno de los errores más difíciles de capturar son los de “OutOfMemory” (quedarse sin memoria) ya que en muchos casos la aplicación queda en un estado inconsistente; La recomendación dice que si se queda sin memoria es mejor matar a la aplicación, aunque muchas veces es imposible cambiar el código para hacerlo de manera limpia, por lo que este truco seguro le vendrá a la mano.

Pero primero, nuestro programa el cual se va a quedar sin memoria:

1
2
3
4
5
6
7
package com.kodegeek.blog;
public class RunOutOfMemory {
        public static void main(String [] args) {
                long [] array = new long[Integer.MAX_VALUE];
                System.out.println("Mi arreglo tiene un tamaño de: " + array.length);
        }
}

El programa es un poco artificial, en especial si podemos pedir suficiente memoria con parámetros como ‘-XmsXXXXm -XmxXXXXm’, pero ilustra un caso en que no podemos reservar suficiente memoria:

1
2
3
4
5
6
7
8
9
auyan:~ josevnz$ java -classpath . com.kodegeek.blog.RunOutOfMemory
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
	at com.kodegeek.blog.RunOutOfMemory.main(RunOutOfMemory.java:7)
auyan:~ josevnz$ echo $?
1
if [ $? != 0 ]; then
    echo "Mi programa se quedó sin memoria en $HOSTNAME"|mail kodegeek@kodegeek.com
fi
auyan:~ josevnz$

Un poco complicado, además de que si el programa se queda guindado (es decir la máquina virtual nunca termina) entonces nunca sabremos que fué lo que paso :(

¿Y como nos enteramos de que murió, por ejemplo recibiendo un correo electrónico? Bueno, es sólo cuestión de agregar unos cuantos parámetros:

1
2
3
4
5
6
7
8
9
auyan:~ josevnz$ java -classpath . -XX:OnOutOfMemoryError="echo 'Me quede sin memoria en $HOSTNAME'|mail jose.nunez@gmail.com; kill -9 %p" com.kodegeek.blog.RunOutOfMemory
#
# java.lang.OutOfMemoryError: Requested array size exceeds VM limit
# -XX:OnOutOfMemoryError="echo 'Me quede sin memoria en auyan.local'|mail kodegeek@kodegeek.com; kill -9 %p"
#   Executing "echo 'Me quede sin memoria en auyan.local'|mail jose.nunez@gmail.com"...
#   Executing "kill -9 254"...
Killed
auyan:~ josevnz$ echo $?
137

Hay muchos recipes en Internet, pero este es uno de mis favoritos :)

java, kodegeek, oracle, programación , ,

Book review: HTML5 up and running, by Mark Pilgrim

Jueves, 2 de septiembre de 2010

HTML5 up and running

Thanks to O’Reilly I got the chance to review the book ‘HTML5 up and running‘, by Mark Pilgrim. Please read below to get an idea on what to expect about this new title from O’Reilly ($34.99).

Synopsis:

HTML5 is a set of technologies that came together as HTML, JavaScript and the Internet in general evolved. The author tries to explain how all the pieces fit together along with some important history lessons.

This is a practical and fun book, so keep your computer on all the times while you read it.

How is it organized:

  1. How did we get there?: History of some web standards, where they succeeded and where they failed because of being impractical. If you want to learn more about the history of software usability and common pitfalls then this is a must.
  2. Detecting HTML5 features: How to deal with different HTML5 compatibility levels (oh yeah, you thought the nightmares are over, think again!). Lots of boilerplate code, but still a foundation of things to come.
  3. What does it all mean?: Explains the structure of an HTML document, along changes that are mean to make it easier to maintain and create.
  4. Let’s call it a draw(ing surface): In my opinion the best chapter of the book. This is where HTML5 (with JavaScript) overlaps and competes with other technologies like JavaFx and Flash. There are examples, but I was left wanting more code to show how some features work. Also, I got the impression than mouse events are a pain in the neck to handle in HTML5, something than is easily accomplished in JavaFX or Flash.
  5. Video on the web: Very detailed explanation of most popular formats, how they ‘embedded’ video magic works, how royalties licenses can break your pocket. Pay attention to the upcoming WebM format
  6. You are here (and so everybody else): Describes the Geolocation API. This is a tricky subject and the author shows how the different browser API complexity can be handled with third party libraries and also how to deal with important issues like permissions (the user doesn’t want to tell where it is), precision, timeouts and others. Code is simple enough to understand the basics and move forward.
  7. The past, present, and future of local storage for web applications: The author tries to explain the new local storage API, which is a great improvement over cookies. Quickly explains several important limitations (storage size, everything is saved as strings) and suggest how to use Google Gears instead, which is not a bad thing.
  8. Let’s take this offline: Caching website contents for offline use. Can improve the user experience a lot, but as the author says the developer work here is a tough one as debugging is very primitive. Offline mode requires careful thinking of what server side and client side settings to change, plus not all the browsers support this feature (like IE8). Google Gears comes to the rescue
  9. A form of madness: New form elements and how to use them so even users of old browsers can have a ‘degraded’ experience. You will be probably changing ALL your form pages after reading this chapter, very useful :)
  10. “Distributed”, “Extensibility”, and other fancy words: This is all about how to use ‘microdata’ to decorate existing HTML and embed extra information without breaking your documents. Very interesting indeed as this information can easily end up displayed on the search engine or consumed by other applications that interact with your web application.
  11. Missing things:

    Sometimes I felt than there were too many mentions of Open Source frameworks to do repetitive tasks, one has to wonder if HTML5 is mature enough or if you just rather use tools like Modernize and Google Gears and forget about the browser madness (there is still plenty). Also more complex programming examples feel missing, specially for the canvas chapter (still the code shown is simple and good to the point so you can say this is a minor fault).

    Conclusion:

    The book is easy to read, well written and does a very good job explaining what is the set of technologies that made HTML5. It is not a book for beginners as it assumes you know how to code a little in JavaScript and at least you wrote an page in HTML4 before. It is not an advanced book either on the topics covered but will definitely will give you a good head start if you want to go deep on this new set of technologies.

    Kodegeek stars: 4 of 5.

internet, kodegeek, programación

Más fotos del Java Road Trip

Jueves, 26 de agosto de 2010

Bueno, Oracle publicó más fotos del Java road trip en Flickr, del cual les habia hablado ya dos meses atrás en New York. Como pueden ver por cada conjunto, el “Java bus” se ha movido por varias ciudades, incluso tienen un avión :)

No sé, pero yo no he visto el primer RubyBus o C#Bus (Esta bien, está bien sólo estoy bromeando aquí :) )

java, javafx, oracle, programación , , ,

Trucos unix: Herramientas de Java poco conocidas

Jueves, 5 de agosto de 2010

No puedo creer que estas las utilizo a diario y nunca las habia mencionado en el blog; En fin, el kit de desarrollador de Oracle (JDK) cuenta con unas cuentas joyas que usted puede llamar de la línea de comandos.

Por ejemplo, para ver la lista de procesos de Java, en vez de hacer esto:

1
2
auyan:~ josevnz$ ps aux|grep -i java|grep -v grep
josevnz    176   0.0  1.5   717716  62436   ??  S     5:49AM   0:02.52 /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/bin/java -Djava.library.path=/Library/Frameworks/JavaFX.framework/Versions/1.2/lib/desktop -Dfile.encoding=MacRoman -classpath /Library/Frameworks/JavaFX.framework/Versions/1.2/lib/shared/javafxrt.jar:/Users/josevnz/Documents/workspace/mytests/dist/Main.jar com.sun.javafx.runtime.main.Main MainJavaFXScript=com.kodegeek.blog.totalbodyweight.app.Main

Utilice a jps:

1
2
3
4
auyan:~ josevnz$ jps -lm|grep -v 'sun.tools'
112 
176 com.sun.javafx.runtime.main.Main MainJavaFXScript=com.kodegeek.blog.totalbodyweight.app.Main
148

Ambas muestran que el PID de mi programa es el 176, pero ¿cual es más fácil?

¡Amor a primera vista! :)

Hay muchas otras, pero les dejo con este articulo de IBM el cual hace un mejor trabajo describiendo las herramientas.

–José

java, oracle , , ,

NetBeans 6.9 ya está afuera, JUnit no incluido en JavaFX

Viernes, 18 de junio de 2010

Para quienes han seguido el asunto de NetBeans (el cual ya salió en su versión final 6.9) y la cucaracha de JUnit, este es el resultado: JUnit no es soportado en proyectos de JavaFX.

Uno de los desarrolladores de NetBeans me mostró en el reporte de la cucaracha en donde está desactivado.

¿Entonces, cual es la solución? Bueno, algo inconveniente pero que funciona, simplemente cree un proyecto de Java (no JavaFX) y entonces desde allí incluya sus pruebas de unidad.

Pero como una foto dice más que mil palabras les dejo el ejemplo abajo, creado con uno de los ‘magos de código’ (wizzards) de NetBeans:


¡Misterio resuelto!

java, javafx, opensource, oracle, programación , ,