<body>

Sitios web relacionados: PingBlog | Fotos

martes, septiembre 12, 2006

Trucos UNIX: Jugando con Fedora Core 5

Linux
Al fin (y después de mucho pensarlo) instalé Fedora Core 5 en mi laptop de 5 años, una HP Pavilion N5495. Hasta ahora se ha portado bien y aunque hay algunas cosas rotas, debo decir que es más rápido que la versión anterior y que además el upgrade al fin funciona :)

Buscando en Internet me conseguí con una página excelente la cual tiene algunos trucos para Fedora 5, les recomiendo que le den un vistazo. Los trucos son más que todo del lado del cliente, así como tampoco les recomiendo que hagan todo lo que aparece allí. Como siempre, sean críticos y piensen antes de escribir en el teclado :D

Buscar en Technorati: ,
Buscar en Blogalaxia: ,

lunes, septiembre 11, 2006

Trucos UNIX: Optimizando el acceso al disco duro en una laptop

Linux
Le tengo dos trucos los cuales quizas quiera probar en su laptop; El primero tiene que ver en la forma en como el kernel organiza las lecturas y escrituras en el disco duro. Sin entrar en mucho detalle podemos decirle al sistema operativo que queremos usar el modo 'anticipatory' el cual según el manual:

"The anticipatory scheduler tries to predict the future workload delaying the I/O in order to merge request and number of seeks",
Por ejemplo, Fedora utiliza por omisión 'cfq' el cual es una tecnica de round robin la cual trata de ser justa en la asignación de I/O. En fin, el comando es:

# use the anticipatory scheduler that merges requests and decrease number of seeks
echo anticipatory > /sys/block/hda/queue/scheduler

El segundo tiene que ver como Linux maneja ciertos atributos de cada archivo; Usted puede desactivar un atributo en UNIX llamado 'atime'. Cada vez que leemos un archivo este atributo se actualiza (se escribe de nuevo) con el último tiempo de accesso al archivo, lo cual en muchos casos no nos importa (sólo nos importa el tiempo de modificación). Así que le pasamos el atributo 'noatime' al comando mount (en este caso si la partición ya está montada con anterioridad):
[root@localhost ~]# mount -o remount /
O lo colocamos como un atributo en el /etc/fstab (mejor, ya que es permanente):
/dev/VolGroup00/LogVol00 / ext3 defaults,noatime 1 1
Si tiene otros trucos que quiera compartir solamente escribanlos por acá :)

Buscar en Technorati: , ,
Buscar en Blogalaxia: , ,

domingo, septiembre 10, 2006

Opinión de comic: The 9/11 Report, A graphic Adaptation

9/11 Report
5 años del 11 de Septiembre, ahora en comics


Este viernes 8 de Septiembre me compré un comic muy particular: "The 9/11 Report: A graphic Adaptation", de Sid Jackson y Ernie Colón. Es particular poque muestra los mismos contenidos del reporte de Septiembre 11 que se puede comprar o bajar por Internet, el cual entre otras cosas trató de explicar (además de proponer medidas para evitar que algo similar ocurriera otra vez) lo sucedido ese fatidico día hace ya 5 años, pero de manera gráfica.

Según sus autores, la idea es ampliar el espectro de personas que puedan leer y entender el reporte, sin importar su edad o nivel academico. Según sus autores este podría ser el comienzo de una nueva era en como cierta información de valor historico es difundida de ahora en adelante a las futuras generaciones.

El comic no es sensacionalista, de hecho ofrece una forma sencilla de explicar lo ocurrido y las fallas de logistica del gobierno de Bush y Clinton en la prevención de este hecho. Tampoco es el unico escrito de este tipo y estando tan cerca de la mencionada fecha ya hemos visto al menos dos peliculas, varios libros e inumerables documentales.

Aún recuerdo claramente ese día; Yo estaba aún en el apartamento en Caracas y la compañia con la que trabajaría eventualmente en los Estados Unidos aún estaba procesando mi visa (el día anterior yo ya había tenido una segunda entrevista telefónica), cuando Veronica me llamó por telefono:

- Pon Venevisión o CNN, rápido!
- ¿Porqué? ¿que pasó?
- Un avión se estrelló en el World Trade Center y el edificio está en llamas
Y justo en ese momento, cuando estaban enfocando las dos torres se ve que un avión se estrella contra la segunda. Yo le pregunte a Veronica que si lo habia visto, si la escena era en vivo y ella asombrada me dijo que si. En ese momento me pasaron varias cosas por la cabeza, ¿como era posible que dos aviones se estrellaran contra los edificios?, ¿como estaban mis amigos que vivian en relativamente cerca de allí?, y varias otras cosas más...

No todo el mundo piensa que este lamentable incidente fué el resultado de la mente retorcida de un grupo de fundamentalistas Islamicos. Por ejemplo el humorista Carlos Sicilia se dedicó a traducir una serie de videos en los cuales se sostiene que fué el mismisimo gobierno Americano quien derribó los edificios por medio de explosiones controladas, mientras que el ataque al pentagono fué llevado a cabo usando un misil guiado. Si bien los argumentos del señor David Griffin son provocadores (no Carlos Sicilia quien solamente se limitó a ponerle subtitulos a los videos y un enlace a su sitio web), estos no invitan a pensar que son solamente especulaciones por diversas razones, entre ellas lo increiblemente dificil que debe ser enmascarar una operación tan grande de detonación controlada la cual seguro requeriria montones de cables y aparatos, personal entrenado (que alguien seguro habría visto alrededor del sitio) y sobre todo las complicaciones de instalación de los famosos explosivos dentro de los edificios.

Después de ver los innumerables videos y los aún más numersos reportes de quienes estuvieron dentro de las torres llevan a pesar que la opción de las explosiones controladas es demasiado complicada como para ser factible. Sin embargo siempre habrán conspiradores dispuestos a llamar la atención o a demostrar lo contrario (como aquellos que aún sostienen que la caminata espacial en la luna fué un fraude).

Creo que todas las personas sensatas esperan que algo así no se repita en Los Estados Unidos ni en ningún lugar del mundo (¿alguien recuerda los atentados terroristas en Madrid, India y Londres?. El terrorismo es el arma de los cobardes y de quienes no les importa lograr un objetivo sin importar los medios.

Yo mientras tanto continuare leyendo el comic, pensando que triste es vivir en un mundo en donde hay gente capaz de dar la vida para quitarsela a otros.

Buscar en Technorati: ,
Buscar en Blogalaxia: ,

martes, septiembre 05, 2006

Como obtener el UNIX UID desde Java: Jugando con JNI

Java

Este es uno de esos experimientos que sale por la necesidad, ya que recientemente alguien en mi compañia me preguntó como hacer algo parecido y le dije que usando JNI. Sin embargo cuando me preguntó si alguna vez lo había hecho y respondí que no, y no quedó muy impresionado.

Así que me decidí a tomar cartas en el asunto, y decidí escribir un pequeño programa que obtiene el UNIX PID y el PPID de un programa en Java, para ver como es el asunto. Como ustedes recordarán, el PID (Program Id) de un programa en UNIX no es más que un identificador único que una aplicación tiene en la tabla de procesos del sistema operativo cuando es ejecutada. El Parent Program Id no es más que el PID del programa que llamó a la aplicación actual.

Java no sabe nada de eso ya que es una caracteristica propia del sistema operativo en donde corre el programa, por lo cual usamos un poco de JNI para obtener el valor.

Para más detalles de como funciona la llamada nativa, solamente hagan lo siguiente:
[josevnz@localhost test]$ man getpid
Existen muy buenos tutoriales en la red, entre ellos un libro completo y otro procedimiento que detalla pasos especificos con el sistema operativo Linux. Mi intención no es escribir un tutorial sino mostrarles algunas piezas de código que considero interesantes.

Terminado este preambulo, vamos a escribir el código; lo primero es declarar una clase en Java la cual define dos métodos nativos, los cuales tendrán una implementación en C:
   1:package com.kodegeek.blog.unix;
2:
3:/**
4: * Native access to pid and ppid process information under UNIX.
5: * @author josevnz
6: * @version 0.1 - 09/04/2006
7: */
8:public final class UnixPid {
9:
10: static {
11: System.loadLibrary("unix");
12: }
13:
14: /**
15: * Class constructor
16: */
17: public UnixPid() {
18: super();
19: }
20:
21: /**
22: * Get the program UNIX id
23: * @return int
24: */
25: public native int getPid();
26:
27: /**
28: * get the program parent id
29: * @return int
30: */
31: public native int getPpId();
32:
33: /**
34: * Run the class from the command line. Test case
35: * @param args
36: * @throws Exception If the thread is interrupted
37: */
38: public static void main(String[] args) throws Exception {
39: UnixPid instance = new UnixPid();
40: System.out.println("PID: " + instance.getPid());
41: System.out.println("PPID: " + instance.getPpId());
42: Thread.sleep(300);
43: }
44:}
Nada complicado, cargamos la librería compartida (Linea 11, .so) en una declaración estática para garantizar que esta lista antes que cualquiera de los métodos sea llamado. Los métodos nativos (lineas 25 y 31) se declaran aqui.

Después vienen un par de pasos más o menos automaticos:
  • Compilar el código en Java
  • Crear el archivo .h de nuestra librería, usando javah en base al código compilado de Java
  • Implementar los métodos en C
  • Compilar el código en C, creando una librería compartida
  • Poner la librería en la ruta del LD_LIBRARY_PATH
  • Correr el programa y celebrar
Dado que soy muy perezoso, me decidí a escribir una tarea en Ant que hace todo el trabajo. Les coloco el archivo con sólo los pedazos importantes:

   1:<?xml version="1.0" encoding="ISO-8859-1"?>
2:<project
3: name="Unix"
4: default="build"
5: basedir=".">
6: <description>Access to native facilities using Java and
JNI</description>
7: <property description="Global properties" file="build.properties"/>
8:
9: <property description="Load any environment variables into Ant"
environment="env"/>
10:.......
48:
49: <target
50: name="build"
51: depends="init"
52: description="Compile the Java and native source code">
53: <javac
54: srcdir="${src.java}/main"
55: destdir="${build}"
56: deprecation="true"
57: optimize="false"
58: debug="true">
59: <include name="com/kodegeek/blog/unix/**/*.java"/>
60: <classpath refid="path.classpath"/>
61: </javac>
62:
63: <copy
64: todir="${build}" overwrite="true">
65: <fileset dir="${properties}/main">
66: <include
name
="com/kodegeek/blog/unix/**/*.properties"/>
67: </fileset>
68: </copy>
69:
70: <javah
71: class="com.kodegeek.blog.unix.UnixPid"
72: force="yes"
73: outputfile="${build}/include/UnixPid.h">
74: <classpath refid="path.classpath"/>
75: </javah>
76:
77: <exec
78: executable="make"
79: failonerror="true">
80: <arg value="-f"/>
81: <arg file="Makefile"/>
82: <arg value="INCLUDES=${native.include}"/>
83: <arg value="JAVA_HOME=${java.home}"/>
84: <arg value="SHARED_UNIX=${native.shared}"/>
85: <arg value="SRC=${src.cpp}/${ant.project.name}"/>
86: <arg value="DIST=${dist}"/>
87: <arg value="all"/>
88: </exec>
89:
90: </target>
91:
92: ....
110:
111: <target
112: name="jar"
113: depends="build"
114: description="Pack the project sources for distribution">
115:
116: <manifest file="${jar.file.manifest}">
117: <section name="${ant.project.name}/">
118: <attribute name="Built-By" value="${user.name}"/>
119: <attribute name="Sealed" value="true"/>
120: </section>
121: <attribute name="Main-Class"
value
="com.kodegeek.blog.unix.UnixPid"/>
122: </manifest>
123:
124: <jar
125: jarfile="${jar.file}"
126: basedir="${build}"
127: description="build the jar file"
128: excludes="**/include/**"
129: manifest="${jar.file.manifest}">
130: </jar>
131:
132: <delete file="${jar.file.manifest}" quiet="true"/>
133: </target>
134:
135:...
174:
175:</project>
Cuando generamos los encabezados en C (UnixPid.h), obtenemos algo como esto, a partir de la clase de Java:
   1:/* DO NOT EDIT THIS FILE - it is machine generated */
2:#include <jni.h>
3:/* Header for class com_kodegeek_blog_unix_UnixPid */
4:
5:#ifndef _Included_com_kodegeek_blog_unix_UnixPid
6:#define _Included_com_kodegeek_blog_unix_UnixPid
7:#ifdef __cplusplus
8:extern "C" {
9:#endif
10:/*
11: * Class: com_kodegeek_blog_unix_UnixPid
12: * Method: getPid
13: * Signature: ()I
14: */
15:JNIEXPORT jint JNICALL Java_com_kodegeek_blog_unix_UnixPid_getPid
16: (JNIEnv *, jobject);
17:
18:/*
19: * Class: com_kodegeek_blog_unix_UnixPid
20: * Method: getPpId
21: * Signature: ()I
22: */
23:JNIEXPORT jint JNICALL Java_com_kodegeek_blog_unix_UnixPid_getPpId
24: (JNIEnv *, jobject);
25:
26:#ifdef __cplusplus
27:}
28:#endif
29:#endif
Sin embargo la parte realmente interesante es la conexión del código nativo con Java. Eso lo hacemos en el archivo .C en donde vamos a implementar las declaraciones de los metodos nativos (copiados del archivo UnixPid.h):
   1:#include <jni.h>
2:#include <unistd.h>
3:#include <sys/types.h>
4:#include "UnixPid.h"
5:
6:/**
7: * Provides native access to the PID access of the current
8: * Java process.
9: * man getpid, getppid - get process identification
10: * @author josevnz@kodegeek.com
11: */
12:
13:/*
14: * Class: com_kodegeek_blog_unix_UnixPid
15: * Method: getPid
16: * Signature: ()I
17: */
18:JNIEXPORT jint JNICALL Java_com_kodegeek_blog_unix_UnixPid_getPid
19: (JNIEnv *, jobject) {
20: jint pid = getpid();
21: return pid;
22:}
23:
24:/*
25: * Class: com_kodegeek_blog_unix_UnixPid
26: * Method: getPpId
27: * Signature: ()I
28: */
29:JNIEXPORT jint JNICALL Java_com_kodegeek_blog_unix_UnixPid_getPpId
30: (JNIEnv *, jobject) {
31: jint ppid = getppid();
32: return ppid;
33:}
34:
La parte complicada es el manejo de los tipos de java versus los tipos de C. Sin embargo como estas rutinas lo que retornan son enteros entonces no hay mucho rollo (son tipos primitivos, no apuntadores).

Me decidí escribir un archivo GNU Make para controlar la compilación del código nativo en C, ya que Make esta mucho mejor dotado que Ant para estas tareas. Lo único que hice fué pasarle parametros desde Ant (cosas obvias como la ubicación de los archivos ya que eso se controla desde allí):
   1:# Native portion of the FileType, UnixPid classes
2:#
3:# Author: josevnz@kodegeek.com
4:#
5:# The following variables are defined from Ant:
6:# - SHARED_UNIX
7:# - INCLUDES
8:#
9:# Also this makefile is tailored to run on Linux
10:#
11:
12:CFLAGS=-c -I$(INCLUDES) -I$(JAVA_HOME)/../include
-I$(JAVA_HOME)/../include/linux -Wall -fPIC
13:LDFLAGS=-shared -static -lc
14:
15:all:
16: g++ $(CFLAGS) $(SRC)/UnixPid.C -o $(DIST)/UnixPid.o
17: g++ $(LDFLAGS) -o $(SHARED_UNIX) $(DIST)/*.o
18: rm -f $(DIST)/*.o
Una vez compilado el programa (todo lo hacemos desde Ant), lo corremos:
[josevnz@localhost kodegeek]$ export LD_LIBRARY_PATH=/home/josevnz/sf/kodegeek/dist/Unix
[josevnz@localhost kodegeek]$ java -jar /home/josevnz/sf/kodegeek/dist/Unix/Unix.jar
PID: 5737
PPID: 17896
[josevnz@localhost kodegeek]$
Ya para finalizar los dejo con un enlace a el código fuente completo, así como los binarios.

Buscar en Technorati: , , ,
Buscar en Blogalaxia: , , ,

lunes, septiembre 04, 2006

¿Trabajando grátis para ciertas compañias de Internet?: No gracias

mvc-010s
¿Trabajar de grátis? quizas en el futuro lejano


Este es uno de esos articulos inútiles, producto de un tipico día feriado en el cual en vez de idiotizarme frente al televisor se me ocurre ponerme a navegar por varios sitios web. Hasta que encuentro un par de cosas que no me gustan, y allí empiezo a escribir...

El tópico tiene que ver con ¿es justo trabajarle de grátis a ciertas compañias en Internet?. Sigan leyendo, quizas este equivocado y salga algo útil de todo esto :)

No me malentiendan; Yo uso los servicios de estas compañias y definitivamente estaria dispuesto a pagar (de hecho lo hago por dos de ellas), pero una cosa es hacer click en anuncios y otra es ponerme a trabajar gratis por ellos.

La primera es Google; Un nuevo servicio le permite a sus usuarios etiquetar imagenes para ganar puntos como si fuera un juego. Entre más imagenes etiquetas e imagenes más puntos obtendrás (no, no hay incentivo monetario hasta donde pude leer).

Según Google:
You'll be randomly paired with a partner who's online and using the feature. Over a 90-second period, you and your partner will be shown the same set of images and asked to provide as many labels as possible to describe each image you see. When your label matches your partner's label, you'll earn some points and move on to the next image until time runs out. After time expires, you can explore the images you've seen and the websites where those images were found. And we'll show you the points you've earned throughout the session.
OK, quizas haya alguien que quiera jugar a etiquetar las imagenes (sino vean algunos usuarios compulsivos en la página web del servicio), sin embargo No es el único ejemplo, vamos a ver como Technorati, en este caso, juega con la lista de blogs favoritos.

Technorati nos dice:
You have not added tags to your Favorites yet. Tags are fun! Not only do they help you organize your favorite blogs, but other people can see what tags you are using on your Favorites. Go to "Blogs from Favorites" and click the "Add Tag" link next to a Favorite to add your own tag to it.
O sea, la idea es que yo categorize la información en vez de hacerlo ellos. No, en el caso de Technorati yo no acumulo puntos sino que ¡es divertido y así otros podrán ver como etiqueto las cosas!. No es el mismo caso de las fotos en Flickr, por ejemplo, ya que allí el uso de las etiquetas es más profundo (yo por ejemplo puedo controlar quienes ven las fotos y quienes no) mientras que los favoritos de Technorati son todos publicos.

No joda, se los va a llevar por delante un carrito de helados...
¿Qué es lo malo de todo esto?

Bueno, es una queja y no muy grande: No traten a sus usuarios como retrazados mentales. Todo el mundo entiende que este tipo de cosas puede ayudar a mejorar el servicio y alguien puede estar interesado en hacerlo en su tiempo libre, sin embargo (y es allí en donde viene mi crítica) si quieren venderselo a la gente, ofrezcan algo a cambio y no lo disfracen como un juego o como algo divertido (que no lo es).

¿No me creen?. Les ofrezco un ejemplo de una compañia que si entendió el concepto bien: Sun Microsystems con sus Duke Dollars. No solamente fomenta a la cooperación en los foros, sino que además recibes algo a cambio a la final (el incentivo es recompensado). Si, no hay engaños y las reglas están bien definidas. Otro ejemplo es Wikipedia, en la cual todos colaboran para ofrecer información gratuita sobre un tópico (aunque la calidad y profundidad de los tópicos no es mejor que una enciclopedia de verdad, pero ese es otro asunto). Finalmente Flickr te permite etiquetar las fotos como quieras, pero puedes mantenerlas privadas (si, ellos se benefician cada vez que usted etiqueta las fotos pero el factor de privacidad le da algo de vuelta al usuario).

Asi que Google y Technorati: Yo seguiré usando sus servicios porque son buenos, haré click en sus anuncios pero no me traten como un tonto, el día que quiera jugar juegos entonces lo haré en mi XBOX...

¿Tiene usted algún otro ejemplo de otra compañia a las que les gusta que sus usuarios trabajen de grátis?
¿O por el contrario, creen que este tipo de estrategias son legitimas y ellos están en todo su derecho?


Buscar en Technorati: , , ,
Buscar en Blogalaxia: , , ,

sábado, septiembre 02, 2006

Reconocimiento al talento: Radioaficionados en Mérida

Racimo de ideas
Un racimo de ideas, por pequeño que parezca, sigue siendo un racimo de ideas


Mi papá (José Vicente viejo) y Nestor (un amigo muy querido quien ya no está por desgracia con nosotros) siempre estuvieron experimentando, tratando de probar nuevos limites; Hoy en día todo el mundo habla de conexiones por inalambricas como cualquier cosa, pero hace sólo unos 15 años atrás era asunto de gente dedicada, la cual gastaba su dinero en repetidoras (una de ellas en el pico del aguila), compilando kernel especiales instalaciones Linux como Slackware y jugando con todo tipo de bandas de radio.

Yo he sido un radioaficionado de pacotilla, ya que si bien presenté miexamen cuando era mucho más joven (menor de edad y por si le interesa mis siglas son YV2-GEE), en cambio estos dos señores (y otros amigos más que mencionaré más adelante) si se dedicaron a esto mucho mas en serio, logrando resultados interesante.

Aqui les dejo un articulo por partes publicado en Mérida por mi papá hace unos años (no recuerdo el periodico), estoy seguro que despertará su interés y le dará una perspectiva de como un grupo de pioneros jugaron con la tecnología cuando nadie creia en ella, fué motivo del primer enlace Merida-Caracas, a traces de los nodos de La Aguada-El Aguila-Caracas (El Junquito):

Papá, si estas leyendo esto, ¿tienes por allí fotos de la aguada que quieras compartir? :)

Buscar en Technorati: , , ,
Buscar en Blogalaxia: , , ,