Archive for the ‘código fuente’ Category

When you think everything is lost…

Miércoles, Marzo 6th, 2013

By fernape

I have seen people many times doing something like this:

$cat binary_file

The problem with the above is that usually you end up with a prompt that looks like this:

�g`�g���i`�i��k`�kX@l`(l  �

(más…)

Las estrategias de Oracle para el verano

Lunes, Agosto 16th, 2010

Mediados de agosto suele ser época tranquila para los medios, con los redactores de vacaciones, y los becarios encargándose de las noticias ligeras que ayudan a llenar los espacios. Parece que Oracle está dispuesto a dar movimiento al verano.

Hace algo más de un año de la compra de SUN por parte de Oracle, y ya estamos viendo las primeras consecuencias para el open source:

  • OpenSolaris cancelado: Oracle cancela la iniciativa open source tras OpenSolaris, y pretende reemplazarlo por Solaris 11 Express (gratuito, pero no open source), y finalmente no habrá OpenSolaris 2010.05.
  • Oracle lleva a juicio a Google: el motivo son distintas patentes relacionadas con Java y Android, su sistema operativo para móviles que usa la tecnología de (antes) SUN.

Cuando Oracle adquirió SUN sabíamos que habrían cambios, porque la estrategia de Oracle siempre ha sido muy distinta de la de SUN, mucho más cercano al open source y a una forma más limpia de hacer negocio.

Sin embargo lo que más preocupaba era MySQL, competidor en cierto modo de Oracle, y OpenOffice.org, que no encajaba claramente en el modelo de Oracle.

Parece que todos estábamos equivocados, y es en los productos en los que Oracle tiene realmente interés en los que estamos viendo cambios importantes.

Al menos podemos agradecer a Oracle esta fuente de noticias interesantes para la temporada baja del verano, algunas anotaciones interesantes:

Instalando clientes SVN para ubuntu

Miércoles, Junio 30th, 2010

Usando (aún) Gnome me he visto en la necesidad de trabajar colaborando con repositorios Subversion (SVN) y como actualmente no tengo instalado ningun IDE de desarrollo que siempre incluye las utilidades de SVN de control de versiones, me he instalado el paquete nautilus-script-collection-svn que me da justo lo que necesitaba, añadiéndome a los menus contextuales de nautilus las opciones estándar de Subversion.

Acompaño mis palabras de una imagen del nuevo menú contextual

Menú contextual de Nautilus SVN

Pero yendo un paso más allá, he encontrado otros paquetes llamados rabbitvcs* que para mi gusto ya si que me dan todas las opciones que necesito y es que me aparecen iconos asociados al estado de en subversion de cada fichero, indicándome si tengo ficheros modificados que actualizar en el servidor o si por el contrario están sin modificar.

También acompaño mis palabras de una nueva imagen para que se entienda mejor la idea que quiero trasmitir

Rabbit VCS

Me parece súper útil e intuitivo de utilizar, aún para aquellas personas que, no siendo informáticas, se sienten obligadas a usar estas herramientas de cooperación ;-)

Los paquetes instalados han sido

  • rabbitvcs-nautilus
  • rabbitvcs-cli
  • rabbitvcs-nautilus

catch (Exception e) {}

Martes, Mayo 4th, 2010

Hola, me gustaría compartir con vosotros un viejo truco de los programadores Java.

Cuando empezamos a hacer algo medio serio con el lenguaje, a la primera compilación nos encontramos con que el compilador nos molesta constantemente en lugares donde hemos invocado métodos de terceros, con mensajes como éste:
unreported exception java.io.IOException; must be caught or declared to be thrown

Esto es muy molesto, porque si se te ocurre lanzar la excepción hacia arriba, luego te encontrás con el mismo mensaje en otro punto del código. Y si la capturas, casi seguro que te molesta con otra excepción diferente, y así hasta no acabar nunca.

Pues aquí está el supertruco:

Cuando quiera que aparezca el molesto mensaje, rodeas la línea, el método entero o bien un conjunto aleatorio de líenas con la expresión
try {

}catch (Exception e) {}

y tus problemas se desvanecen por arte de magia.

Bueno, hasta aquí la ironía. El objeto de este artículo es llamar la atención de esta práctica que no por ser mala se encuentra poco extendida. Incluyendo una enorme cantidad, apostaría a que más del 50% de los códigos en producción.

El problema con el catch (Exception e) {}

¿A qué viene tanta inquina? Bien, el problema es que meter todo el código en este tipo de bloques es subvertir el sistema de excepciones, que, aunque no lo parezca, no se ha creado con objeto de fastidiar.

Lo que se pretende evitar es que, como sucedía con el manejo de errores tradiconal (generalmente a través de devolución de valores por una función), no te olvides de considerar los posibles percances en la ejecución.

Ya no estamos en la facultad, donde te pueden pasar la mano, ni en un programa chusco que te creas para una tarea cotidiana, que si peta lo ejecutas otra vez o ves qué le pasa tranquilamente. Estamos haciendo software que ha de comportarse de forma correcta siempre, y que ha de saber cómo reaccionar ante la más inusitada circunstancia, en vez de dar un batacazo cuando ocurra algo que no se nos haya ocurrido al programar.

El compilador de Java con las excepciones se comporta como una madre o un padre que a vece puede resultar pesado, pero lo hace por tu bien, diciéndote lo que necesitas aunque no quieras oírlo. Es muy difícil que mientras programamos se nos ocurran todas las cosas que pueden ir mal: ¿permisos? ¿espacio en disco? ¿no se pueden resolver nombres? ¿la codificación de caracters no está soportada? ¿el fichero comprimido está corrupto?

El compilador (con la ayuda del que programó la biblioteca que usas) es el amigo que te dice: “¡Eh! ¿Y si la cuenta del usuario ha expirado?”, cuando a ti no se te había ocurrido pensarlo. Lo más inteligente no es ponerse los auriculares e ignorar los avisos.

Manejo responsable de excepciones

Me gustaría daros un criterio mecánico sobre cómo tratar las excepciones. Desgraciadamente, es un arte y debe formar parte del diseño del programa. Dónde recoger y tratar una excepción va a depender íntimamente de la lógica del programa.

Os dejo unas pautas a tener en cuenta:

  • Lo principal es pensar en el problema que ha sucedido y cómo afecta al flujo del programa. Comprobar si se puede solucionar dentro del mismo método (catch), o si hay que dejar la excepción vaya hacia arriba (throws).
  • Hay que ver igualmente, las líneas de código que van invalidadas por la excepción, y asegurarnos de que estén todas dentro del bloque try. Esto puede suponer que reordenemos las líneas de código para que estén juntas las líneas que dependen unas de otras.
  • Hay que poner antención a qué se va a ejecutar tras la excepción, y si sigue teniendo sentido cuando se ha producido el fallo. Hay que mirar tanto las líneas posteriores dentro del mismo método, como las que pertenecen a los métodos donde se llama al que falla.
  • Considerar si hay que deshacer algún cambio ante el fallo (liberar un bloqueo, desconectar del servidor, hacer rollback de una transación, etc)
  • No hacer catchs ni throws genéricos (como recoger Exception), sino recoger las excepciones concretas que puedan producirse. Por mucho que poner 6 catch en un bucle pueda ser pesado.
  • Observar lo útiles que nos son las excepciones para afrontar imprevistos y de qué forma son más útiles, para nosotros a nuestra vez crear excepciones en nuestro código que sean útiles y manejables.
  • No dejar para mañana lo que podamos hacer hoy. Si colocas un try{…}catch (Exception e) {} en el código cuando estás empezando, pensando que ya tratarás los errores más tarde, te encontrarás que después es muy difícil gestionar correctamente las excepciones, pues tu código no estará organizado de una forma propicia.

Puede que tengamos la sensación de que estamos programando enfocados principalmente a las excepciones, pero eso no es malo. Si empezar a aplicar estos principios te causa muchos problemas, significa que estabas haciendo las cosas muy mal (ver último punto).

nullPointerException

Otro problema que puede ser peor son las “excepciones silenciosas”, término que invento sobre la marcha para referirme a aquellas de las que el compilador no se va a quejar. La más habitual es nullPointerException, y nos va a servir para enteder por qué existen. Tan sólo hay que pensar en que cada llamada a un método podría dar esta excepción si la variable sobre la que llama es null.

La nullPointerException no debería atraparse ni gestionarse nunca (o casi nunca). Siempre que ocurre, se debe a un error de la programación.

En vez de atrapar nullPointerException, lo que debemos hacer es pensar en todo momento si las variables tendrán un valor adecuado con seguridad. Si la variable puede ser null (por ejemplo, porque así la devuelve el API que usamos), entonces debemos comprobarlo antes de hacer algo con ella. El qué hagamos en caso de ser null, dependerá también de la lógica del programa, y, de nuevo. El asegurarnos en todo momento de que las variables van a tener un valor correcto, es otra de las cosas que vamos a tener que tener en mente mientras diseñamos y programamos.

Si se nos olvida la comprobación, ya que el compilador no avisa, nos enteraremos generalmente porque el programa cascará con una bonita traza de excepción que nos dirá dónde metimos el gambazo. Si se nos ocurrió rodear el bloque donde ocurre con un try {…} catch (Exception e), no nos enteraremos de que la ejecución se abortó en otro punto, y el problema explotará en otro lugar del código, haciendo difícil rastrear lo que ocurrió.

Ejemplos de mal uso

Supongamos un trozo de código:
Filostro f = null;

try {
Chumba ch = foo.getChumba(); // Llamada que provoca la excepción
f = ch.getFilostro();
} Exception (e) {}

Muy mal. Porque si hay resulta que foo no tiene “chumbas”, f se queda como null, la ejecución se aborta, y nosotros nos hemos quedado tan campantes.

Cuando vayamos a usar f, nos encontraremos un nullPointerException… si es que no hemos rodeado ese bloque con un try{…} catch Exception (e), momento en el cual nos podemos echar a temblar porque las consecuencias pueden ser imprevisibles.

Excepciones a las excepciones

En realidad hay algunos momentos, muy específicos, donde se puede justificar un try{…}catch(Exception e). Supón que vamos a entregar un programa final. Es muy feo que la ventana desaparezca de golpe porque ha ocurrido algún error no contemplado (ej: nullPointerException). Podemos incluir un catch (Exception e) en algún punto muy de alto nivel, que se encargue de loguear el error e informar al usuario de que ha ocurrido un error.

Lo mismo se puede aplicar a páginas webs. Una página tipo “ha ocurrido un error” es fea, pero no tanto como si es tomcat el que se encarga.

Eso sí, insisto en que es *un* punto a muy *alto nivel*, y siempre con mucho control de lo que estamos haciendo. Recuerda que un gatito muere en cada catch (Exception e), por lo que no queremos que ocurra más a menudo de lo necesario.

Terminando

Ha sido un poco árido, pero espero que a partir de ahora me ayudéis a erradicar es mala práctica que tanto nos da que llorar.

Liberado el proyecto SNMP para Zabbix

Jueves, Abril 22nd, 2010

Hace un par de días que liberamos el proyecto snmp4zabix: un interfaz SNMP para la aplicación de monitorización open source Zabbix.

Se trata de una solución al problema de integrar Zabbix con aplicaciones de monitorización de terceros, ya sean open source o privativas, empleando el estándard Simple Network Management Protocol.

Zabbix proporciona un API basado en JSON-RPC (en borrador todavía) desde la publicación de su versión 1.8, pero tiene un par de inconvenientes para la integración:

  • Requiere un esfuerzo específico en desarrollo para inegrar cada solución.
  • Las aplicaciones cerradas no siempre dan la posibilidad de integrar con otros sistemas.

En entornos heterogéneos en los que se plantea la introducción de Zabbix, o en los casos en los que los proveedores de nuestros clientes imponen sus herramientas de monitorización, es de vital importancia asegurar la interoperatividad, y ahí es donde SNMP juega un papel clave.

snmp4zabbix expone dos interfaces SNMP, uno mediante poll (con posibilidad de aceptar alarmas) y otro mediante traps, de forma que la información de monitorización de Zabbix (grupos, monitores, alarmas, etc) pueda ser accedida por casi cualquier herramienta de monitorización del mercado, ya que SNMP es el protocolo común a todas ellas.

En la página del proyecto se puede acceder al código fuente (bajo licencia GPL3), documentación, informes de error, y una lista de correo para soporte.

Consultar el espacio de disco usado por bases de datos mysql

Lunes, Diciembre 7th, 2009

Con la siguiente instrucción obtenemos en MB el tamaño de cada una de las bases de datos existentes en la instancia mysql

<span style="color: #333399">SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MB"</span>
<span style="color: #333399">FROM information_schema.TABLES GROUP BY table_schema;</span>

Una demostración de funcionamiento:

<span style="color: #333399">mysql&gt; SELECT table_schema "Data Base Name",
sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MB"
FROM information_schema.TABLES GROUP BY table_schema ;

+--------------------+----------------------+</span>
| Data Base Name     | Data Base Size in MB |
+--------------------+----------------------+
| 4001_88_PC_017_01  |          16.42155075 |
| information_schema |           0.00390625 |
| mysql              |           0.40110970 |
| opencms            |         211.23956680 |
| opencms_aux        |           0.00280380 |
+--------------------+----------------------+

Interesante movimiento de Redhat al comprar KVM

Viernes, Septiembre 5th, 2008

Para quien no lo sepa aún, Redhat ha comprado la empresa que desarrolla KVM, Qumranet. Recuerdo que KVM es en este momento el único sistema de virtualización soportado por Linux en su rama principal.

Teniendo en cuenta el bajo rendimiento de Entrada/Salida que proporciona Xen en algunos entornos (lo digo por experiencia) y las pocas posibilidades que tiene Xen de ser aceptado por completo en la línea principal del Kernel, me imagino que este movimiento va a recolocar algunas piezas del mapa de proveedores de Virtualización.

Por otro lado, Virtualbox acaba de sacar la versión 2.0. Virtualbox es otro sistema de virtualización recientemente adquirido por Sun Microsystems. Aunque desde el punto de vista de arquitectura Virtualbox es una maravilla y puede funcionar de forma confiable en entornos de servidor, su uso principal sigue siendo la virtualización en entorno de escritorio personal. Es el equivalente a VMWare Workstation, de hecho, la interfaz es muy parecida. Todavía tengo que probar la nueva versión, así que no comento nada de momento.

En general, es interesante volver a comentar la misma idea de siempre. Todo software horizontal / de infraestructura (sistemas operativos, bases de datos, virtualización, ofimática, navegadores, …) va a ser copado por el Software Libre tarde o temprano. No hay ninguna posibilidad de crear un modelo de negocio “sostenido” alrededor de este software si no es con Software Libre. A ver si le entra en la cabeza a algunos (Microsoft, Oracle, …).

¿He dicho alguna vez que me encanta Redhat? :D

GTD: Improve integration in ThinkingRock

Jueves, Septiembre 4th, 2008

This article is about the way I organize myself (I happily follow the “Getting Things Done” metodology). To help me manage tasks and projects, I use ThinkingRock.

I have finished the infrastructure for integrating of external apps into TR (by using some scripting magic and the Notes field). At the moment it is a quick hack, but “it works for me (TM)” Razz

This article complements the KMail integration post which can be found here: http://www.thinkingrock.com.au/forum/viewtopic.php?t=2321

At the moment, I have integrated:

  • Freemind: For mind mapping and many other tasks (it is a very important app for my daily work)
  • Openproj: A MSProject like app for managing complex projects
  • TiddlyWiki: A very interesting tool for structured documentation

Adding new apps (openoffice, gimp, …) is really easy, as everything is done outside TR and without programming. I will come on this topic later.

VISION
I have just created a project/action in TR, and now I want to:

  • Attach a mindmap from an existing template very easily without bothering with filenames and folders
  • Attach a complex project from an existing template very easily without bothering with filenames and folders
  • Attach a new spreadsheet from an existing template very easily without bothering with filenames and folders
  • Keep everything related to the main project/action
  • Have all the docs available with a single click in the link
  • Easily create templates (for example I have a mind-map template with all the things I have to ask to a customer interested in elearning).
  • If I want to add 4 different files to an action, I just have to: launch the script, select the templates and press enter (this is not completely achieved at the moment Razz )
  • Everything must be safe (no modifying or reading the xml file) and must survive between updates of TR

MAIN PICTURE

On the TR side, the magic is done by linking to files in the “notes” field. This links are opened by xdg-open, which in fact calls the default application for the file. Nothing new here.

On the Linux side, there is a script (I have created an icon in my panel) which:
1) shows the available templates (you can select one or more)

2) asks for -optional- base names (names and paths are not important as they will be correctly linked from within TR)

3) creates folders to store the new files (it ensures there will be no collisions, so you can have many “Brainstorming” base names for different projects Smile ). You can choose a folder if you want, but I see no reason for that. This is done through an option’s window, which in many cases you can just accept the defaults and press enter.

4) creates new files based on copies from templates (mm, sxw, pdf, …) and puts them in the new folders

5) Shows a popup with the text you have to paste into TR

THE TEMPLATES

To find the available templates, the application looks into the TEMPLATES folder (see below). There it finds a folder for every template.

Inside every folder, there is a single file named exactly as the folder plus the corresponding extension (NOTE: This will probably be improved in future versions to be able to put more than one file on each template). You can edit the file with the corresponding application to adapt the template to whatever you want:

Obviously, you can put there whatever you want. Any kind of file.

In the end, the template file will be copied to the destination and renamed to the base name you choose.

THE CODE (and install steps)

1) Select all the text and paste it to a text file, named “tr_integration.sh” and assign execution rights (chmod 755 tr_integration.sh).

2) In the code, you will need to change:
- PROYECTOS: which points to a folder where you want to store all files and folders created
- TEMPLATES: which points to the templates folder

3) Create a shortcut available easily Razz

Code:
#!/bin/bash
# Name: tr_integration v.0.1
# License: GPL v3
# Author: fmonera at opensistemas dot com

PROYECTOS=”/home/monera/temas/personal/proyectos”
TEMPLATES=”/home/monera/temas/personal/templates”

# List of items
for I in `ls $TEMPLATES`
do
WANTEDLIST=”$WANTEDLIST $I $I off ”
ITEMS=”$ITEMS $I”
done
WANTED=`kdialog –checklist “Select items to create:” $WANTEDLIST`
if [ "X$WANTED" == "X" ]
then
exit
fi

# OPTIONS
OPTIONLIST=”newfolder NEW_FOLDER on”
OPTIONS=`kdialog –checklist “Select options for this files:” $OPTIONLIST`
echo $OPTIONS
# Parse options
NEWFOLDER=`echo $OPTIONS | grep -c newfolder`
# end parse

# dir
if [ "X$NEWFOLDER" == "X1" ]
then
NOMBRE=`kdialog –inputbox “Base name for the folder (no special characters please):” temp_folder`
DIR=`mktemp -d –tmpdir=”$PROYECTOS/” “$NOMBRE.XXXX”`
if [ "X$NOMBRE" == "X" ]
then
exit
fi
else
DIR=`kdialog –getexistingdirectory $PROYECTOS`
if [ "X$DIR" == "X" ]
then
exit
fi
fi

for I in $WANTED
do
# Unquote
I=`echo $I | cut -b 2- | cut -d’”‘ -f1`
# Create documents
NOMBRE=`kdialog –inputbox “Base name for <b>$I</b> (no special characters please):” $NOMBRE`
echo “NOMBRE: $NOMBRE”
echo “DIR: $DIR”
SOURCE=`find $TEMPLATES/$I -type f`
EXT=${SOURCE##*.}
DEST=$DIR/$NOMBRE.$EXT
cp $SOURCE $DEST
done

# Format TR Text
for I in `ls $DIR`
do
EXT=${I##*.}
FORMAT=`basename $I “.$EXT” | sed ’s/_/ /g’`
TEXTO=”$TEXTO  · $EXT: [file:$DIR/$I|$FORMAT]”
done
TEXTO=”$TEXTO

kdialog –textinputbox “Paste into ThinkingRock:” “$TEXTO” &

You will need kdialog and mktemp. Both are available in every unix system I know.

It might work in Windows and/or MAC if you install KDE4 and adapt a bit the code. You will probably need Cygwin or, at least, mktemp for your environment. I don’t see major problems for that. Sorry, no support for Windows as I am a free software man since 1997 Smile