Compilar megatools en Debian 8.9

megatools es un paquete de herramientas para interactuar desde la línea de comandos con la página de descargas mega.nz. megatools está incluido en el repositorio de paquetes para Debian Stretch pero no está disponible para Debian Jessie por lo que si, como yo, sigues usando la versión 8.9 de Debian, tienes que compilarlo manualmente. Por suerte es un paquete fácil de compilar y sólo tiene unas cuantas dependencias que se pueden instalar desde el gestor de paquetes (la mayoría ya deberían estar instaladas si has seguido posts anteriores en el blog 😀 ):

  • libglib2.0-dev

  • libssl-dev

  • libcurl4-openssl-dev

  • libgirepository1.0-dev

También necesitamos el código de megatools que se puede descargar desde la página oficial o desde su repositorio de github. En este caso estoy compilando la versión de github, si bajas la versión de la página oficial puedes omitir ejecutar autoconf.sh en el primer paso y ejecutar directamente configure.sh:

monstruosoft@monstruosoft-PC:~/megatools-master$ ./autogen.sh 
monstruosoft@monstruosoft-PC:~/megatools-master$ ./configure --disable-docs --prefix=/home/monstruosoft/libs/
...
Configured features:

  docs build: no
  warnings: no

Run make now.

NOTE: On FreeBSD, you need to use GNU make (gmake)
monstruosoft@monstruosoft-PC:~/megatools-master$ make
monstruosoft@monstruosoft-PC:~/megatools-master$ make install

¡Eso es todo!. Ahora podemos usar las herramientas para verificar y descargar todos esos links de mega 😀 .

Advertisements

En corto No.4 – Tips de CMake

CMake incluye opciones predefinidas para habilitar/deshabilitar la información de depuración, de forma que no tienes que escribir estas reglas manualmente. Simplemente tienes que pasar al comando cmake la opción -DCMAKE_BUILD_TYPE con el valor de tu elección. Los posibles valores son Release, Debug, RelWithDebInfo, MinSizeRel. Por ejemplo:

monstruosoft@monstruosoft-PC:~$ cmake .. -DCMAKE_BUILD_TYPE=Debug

 

En corto No. 3 – Tips de NetBeans

Hay varias opciones si quieres agregar un identificador de versión automáticamente a tus programas de NetBeans pero la más sencilla de implementar es abrir el archivo build.xml en el directorio base de tu proyecto y editarlo de la siguiente siguiente manera:

...
  <tstamp>
    <format property="NOW" pattern="yyyy-MM-dd HH:mm:ss z" />
  </tstamp>
  <manifest file="manifest.mf">
    <attribute name="Implementation-Version" value="${NOW}"/>
  </manifest>

</project>

Esto pondrá un valor con la fecha de compilación en el archivo manifest.mf usado para crear el .jar de tu aplicación. Dentro de tu código puedes obtener ese valor con la siguiente instrucción:

String version = MiClase.class.getPackage().getImplementationVersion();
Fuentes:
http://www.javaxt.com/Tutorials/Netbeans/How_to_Add_Version_Information_to_a_Jar_File_with_Netbeans
https://stackoverflow.com/questions/5204297/put-version-to-my-java-application-netbeans

Usar los métodos del paquete java.util.logging puede ser útil para imprimir información de depuración que no quieres imprimir en la versión final de tu aplicación (definitivamente es una mejor opción que usar System.out.println()). Al igual que con el número de versión, hay varias formas de configurar el nivel de información de depuración que quieres imprimir pero una de las más sencillas es copiar el archivo de ejemplo logging.properties de ruta-de-instalación-del-JDK/jre/lib/logging.properties al directorio de tu proyecto y modificarlo para definir el nivel de información a imprimir por el logger que uses en tu código:

...
# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
...
# For example, set the com.xyz.foo logger to only log SEVERE
# messages:
# OFF - Deshabilita todos los mensajes
# ALL - Imprime todos los mensajes
# Nombre de nivel - limita los mensajes a ese nivel y superiores
nombre.logger = OFF

Una vez creado/modificado este archivo, sólo tienes que pasarlo como argumento al iniciar tu aplicación:

monstruosoft@monstruosoft-PC:~/ java -Djava.util.logging.config.file=ruta-del-archivo-logging.properties MiClase
Fuente:
https://stackoverflow.com/questions/6307648/change-global-setting-for-logger-instances/6307666#6307666

Control remoto de decodificador Master

Hace tiempo compré un decodificador de TV digital Master, funciona bien pero el control remoto parece estar hecho con el diseño y los materiales más baratos por lo que ya está fallando y si llega a fallar por completo me quedaría con un decodificador inutilizable, por lo que decidí respaldar la configuración del control remoto usando el Raspberry y el paquete lirc.

Read More

Compartir Wi-Fi con el Raspberry Pi

Compartir la conexión a internet Wi-Fi de nuestra PC con el Raspberry Pi es sencillo si has seguido este blog ya que básicamente requiere los mismos pasos que en el post sobre compartir Wi-Fi con un contenedor LXC. Aquí repetiré los pasos para el Raspberry usando la conexión DHCP que ya hemos preparado en el post anterior.

Read More

Desaventuras en la tierra de Linux, parte 11

En fechas recientes he tenido un renovado interés en volver a programar después de varios meses prácticamente sin escribir ni una línea de código. He estado usando Geany para programar y está bien para programas pequeños pero le faltan algunas características que lo hacen quedarse corto para programas más complejos, en particular extraño el completado inteligente que tiene VIM pero aún no me siento preparado para volver a utilizarlo 😛 . Así que, buscando una alternativa para programar, encontré en el gestor de paquetes un IDE de programación llamado CodeLite. Luce como un IDE completo e incluso parece tener algunas características interesantes como una opción para diseñar interfaces de usuario de forma visual.

Entonces, ¿cuál es el problema?. Esta es mi -corta- experiencia con CodeLite:

Al seleccionar la opción Nuevo Proyecto del menú, aparece un gran número de opciones dependiendo de qué clase de proyecto quieras desarrollar, eso suena como una buena opción. Así que voy a seleccionar la opción Console > CMake Executable para generar un programa basado en CMake.

A continuación hay que seleccionar un nombre y ruta para el proyecto. Hasta ahora todo bien.

De regreso a la ventana principal de CodeLite y con el proyecto “listo para usar” podemos ver que han sido creados automáticamente un par de archivos:

resources/CMakeLists.txt
src/main.cpp

Justo como era de esperarse para un proyecto de CMake, ha sido creado un archivo CMakeLists.txt e incluso CodeLite nos ha hecho el favor de crear nuestro archivo principal de código main.cpp con un código básico de Hello world a partir del cual podemos trabajar. ¡Todo esto es genial! ¿Por qué no probamos el código base que CodeLite tan amablemente ha escrito para nosotros?. Selecciones la opción del menú Build > Run.

El resultado:

make: *** No se especificó ningún objetivo y no se encontró ningún makefile.  Alto.
/usr/lib/codelite/codelite_exec: 22: /usr/lib/codelite/codelite_exec: ./build-debug/HelloWorld: not found
Press ENTER to continue...

¡Genial… CodeLite no puede compilar ni siquiera el Hello world que él mismo generó! ¡Este es el tipo de cosas que hacen que la gente no pueda tomar en serio a Linux! ¡Este es el tipo de cosas que hacen que la gente desinstale el programa y nunca vuelva a considerar usarlo! ¡Yo mismo no pienso volver a usarlo!.

OK… tal vez estoy siendo injusto con CodeLite… tal vez la opción de CMake no está correctamente programada por alguna razón. Al intentar con un proyecto básico de gcc en la opción de Console > Simple executable (gcc) en la selección de nuevos proyectos, una vez más, CodeLite genera un simple programa de Hello world, esta vez no usa CMake y el código es un simple archivo .c y no uno .cpp. Al seleccionar el menú Build > Run esta vez funciona correctamente.

Así que tal vez CodeLite no es tan malo después de todo. Aún así es imperdonable que falle al compilar una de sus opciones predeterminadas. ¡Cuando escribes algo como esto o te aseguras que funcione o no le das soporte! No puedes presentar tu código como un proyecto serio cuando tiene este tipo de errores y si, como en mi caso, un usuario tiene la mala suerte de que lo primero que intenta hacer con tu software es justo eso que no funciona, pueden imaginar la mala impresión que eso genera 😦 . No sé si seguiré usando CodeLite después de esta pésima primera impresión. Parece soportar algunas opciones que Geany no tiene, como lo que ya mencioné sobre el autocompletado así que tal vez le de una oportunidad más antes de volver a VIM.

Antes de cerrar este post sobre CodeLite, intentemos usar la integración con gdb para depurar el programa que acabamos de compilar… “No se pudo iniciar la ventana de GDB”.

¡No pienso batallar más con esta versión de CodeLite 😦 y la estoy desinstalando ahora!. Cabe mencionar que es posible que las versiones más recientes de CodeLite tal vez hayan arreglado este error pero, como lo he mencionado en otros posts, en Debian, debido a su filosofía, a veces puedes estar obligado a usar versiones antiguas del software 😦 lo que es por sí mismo material para otro post de desaventuras en la tierra de Linux.

En corto No. 2 – Tips de cmake

Si programas algo más complejo que un Hello World, es recomendable que tengas algún sistema para asistir en la compilación de tus programas; puede ser un makefile escrito a mano o, por ejemplo, un script de cmake.

En uno de mis proyectos recientes tengo algunos archivos de código fuente que son la base para un par de ejemplos. Mi script de cmake tenía las siguientes líneas:

ADD_EXECUTABLE (ejemplo-1 ${SOURCE_DIR}/ejemplo-1.c ${SOURCE_DIR}/base.c ${SOURCE_DIR}/extras.c)
ADD_EXECUTABLE (ejemplo-2 ${SOURCE_DIR}/ejemplo-2.c ${SOURCE_DIR}/base.c ${SOURCE_DIR}/extras.c)

Esto funciona pero noté que los archivos base.c y extras.c estaban siendo compilados dos veces cada que compilaba los programas, una vez para el ejecutable ejemplo-1 y otra vez para ejemplo-2. Normalmente esperaría que cada archivo sólo fuera compilado una vez pero al parecer eso no funciona así en cmake. En su lugar, para evitar compilar los archivos innecesariamente, se puede definir una librería temporal o de mentiras 😛 para que cada archivo sólo sea compilado una vez usando la instrucción ADD_LIBRARY con el modificador OBJECT. Por ejemplo:

ADD_LIBRARY(MI_LIBRERIA_DE_MENTIRAS OBJECT ${SOURCE_DIR}/base.c ${SOURCE_DIR}/extras.c)
ADD_EXECUTABLE (ejemplo-1 ${SOURCE_DIR}/ejemplo-1 $<TARGET_OBJECTS:MI_LIBRERIA_DE_MENTIRAS>)
ADD_EXECUTABLE (ejemplo-2 ${SOURCE_DIR}/ejemplo-2 $<TARGET_OBJECTS:MI_LIBRERIA_DE_MENTIRAS>)