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 �
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 �
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:
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:
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

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

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
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:
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.
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:
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.
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> 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 | +--------------------+----------------------+
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? ![]()
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)” ![]()
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:
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:
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
). 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 ![]()
| Code: |
| #!/bin/bash # Name: tr_integration v.0.1 # License: GPL v3 # Author: fmonera at opensistemas dot com PROYECTOS=”/home/monera/temas/personal/proyectos” # List of items # OPTIONS # dir for I in $WANTED # Format TR Text |
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 ![]()