Corregir error “invalid command-line parameter” en Eclipse y SDK Android

Hace poco instalando Eclipse y el SDK de Android en Windows 7 (si lo se, un lapsus xD), siguiendo estas indicaciones, se me presento un pequeño inconveniente luego de instalar el SDK desde un ejecutable el cual recomiendan, resulta que luego de tener todo instalado y luego de crear un aplicacion simple, al ejecutarla tenia el siguiente error en la consola:

invalid command-line parameter: C:\Program Files\Android\android-sdk\tools/emulator-arm.exe

Y bueno, vaya sorpresa que me lleve, resulta que este error se da porque dentro de la configuracion en Eclipse en el SDK location, se tiene que especificar la ruta en donde tienes instalado el SDK, tal como se muesta en la imagen:

Pero por un posible bug, este no acepta espacios en blanco dentro de la ruta que se especifica. Entonces buscando algo de información vi que para esto existen alguna posibles soluciones:

  1. La primera, es bajarte el SDK en zip y colocarlo en una ruta que tu desees considerando lo antes mencionado
  2. O tambien puedes aplicar el siguiente comando para crearle una especie de link en un directorio especifico como por ejemplo en “C:\Android”, de la ruta del SDK instalado, de la siguiente manera:
MKLINK /J C:\Android "C:\Program Files\Android\android-sdk\"
Y bueno con esto ya colocaríamos la ruta del link creado en el “SDK Location”.

TIP: Añadiendo subtitulos a un video avi

Existen muchas herramientas para realizar este tipo de proceso, pero si gustas real izarlo de manera rápida y simple, basta con instalar Mencoder, que nos es mas que un codificador de video libre. Entonces sin mas vuelta que darle supongamos que tenemos el video “MiVideo.avi” y los subtitulos “subtitulos_es.srt”, haremos lo siguiente:

$ mencoder MiVideo.avi -sub subtitulos_es.srt -oac copy -ovc lavc -o MiVideo_SubES.avi -subcp latin1 -subfont-text-scale 2.8

Y ya esta, eso seria lo mas rapido y accesible con lo cual podrias realizar este proceso. Cabe aclarar que en -subcp he colocado latin1 porque al colocar utf-8 tuve algunos inconveniente con algunos caracteres, pero eso dependera de como tu lo dispongas

Crear servicio para Socket Java

Hace poco desarrollando una pequeña aplicación en Java, el cual consistía en el manejo de un Socket me vi en la necesidad de ver la forma de como asociar este Socket a un servicio ya que iba a manejar “n” servicios, y todo esto sobre un servidor Linux.

Como sabemos cada vez que se crea un proceso o servicio en Linux, este recae o se asocia a un PID el cual es guardado en un archivo en una ruta especifica, entonces veremos como asociar este Socket a un PID y dado el panorama al tener varios Sockets tendremos varios PID’s. Entonces para esto asumimos que ya tenemos nuestra aplicación compilada, en mi caso tendré la clase (compilada) del servicio en la ruta “/home/nachxs/bin/classes” y ademas manejaremos un JDK el cual lo tengo instalado en “/opt/jdk_1.6.0”, una vez definido esto solo creamos un script el cual contiene lo siguiente:

#! /bin/bash
. /etc/init.d/functions

RETVAL=$?
PATH_SERVICE=/home/nachxs/bin/classes
PATH=.:/opt/jdk1.6.0/bin:/usr/bin
export PATH_SERVICE
export PATH

start(){
   echo -n $"Iniciando servicios"
   exec java -Xrs -cp $PATH_SERVICE org.servicio.Servidor01 /dev/null 2>&1 &
   echo $! > /var/run/Servicio01.pid
   RETVAL=$?
   [ $RETVAL -eq 0 ] && success || failure
   echo
   return $RETVAL
}

stop(){
    echo -n "Deteniendo servicios"
    kill -15  `cat /var/run/Servicio01.pid`
    rm -rf /var/run/Servicio01.pid
    RETVAL=$?	[ $RETVAL -eq 0 ] && success || failure
    echo
    return $RETVAL
}

case "$1" in
   start)
          start
          ;;
   stop)
          stop
          ;;
   restart|reload)
          stop
          start
;;
   *)
   echo $"Usage: $0 {start|stop|restart|reload}"
   exit 1
;;
esac

exit 0
exit $RETVAL

Entonces como se podran dar cuenta, tenemos “seteado” el PATH_SERVICE y el PATH con las ruta indicada anteriormente, ahora solo nos quedaria dar permiso de ejecucion al script y listo. Al ejecutar el script este creara el Socket al puerto que hayan definido en su clase y este asociado a un PID. Ahora si queremos tener varios servicios asociados a diferentes Sockets solo tendriamos que adaptar el script para cada servicio.

 

Postfix Recipient BCC Maps

Hace poco revisando y retomando algo de configuración de un servidor de correo (con postfix), estaba probando la forma de poder realizar un forward de un correo pero dejado una copia del correo al usuario origen.  Todos sabemos que para realizar este proceso se necesita de un usuario origen y un destino básicamente. Actualmente se trabaja con mysql para almacenar a los usuarios y dominios; ademas de una tabla en donde se configura el forward, pero resulta que cuando se realiza este proceso (forward) nunca queda el correo para el usuario origen o por lo menos no he logrado configurar eso hasta el día de hoy en donde estuve revisando información acerca de la propiedad recipient_bcc_maps que provee postfix.

Básicamente tiene la misma estructura que para un forward; para eso crearemos un archivo al cual llamaremos recipient_bcc dentro de la ruta /etc/postfix (esto dependera de casa uno) y dentro de este colocaremos lo siguiente:

# recipient_bcc - nachxs
usuario_01@dominio01.com  usuario_02@dominio02.com
...

En donde usuario_01 seria el origen y usuario_02 el destino, es decir que cada vez que le llegue un correo al usuario usuario_01, automáticamente se enviara un copia al usuario usuario_02.

Una vez creado el archivo con el contenido que ustedes definan utilizaremos el siguiente comando para poder generar un archivo que pueda ser leido por postfix:

postmap /etc/postfix/recipient_bcc

Este comando debería devolver el archivo recipient_bcc.db, entonces ahora solo nos quedaria leerlo desde postfix y para esto agregaremos lo siguiente en el archivo de configuración main.cf, en mi caso en la ruta /etc/postfix/main.cf

...
recipient_bcc_maps = hash:/etc/postfix/recipient_bcc
...

y listo, ahora solo nos quedaría reiniciar el servicio y probar. Si alguien puede compartir alguna otra manera de poder realizar un forward dejando una copia en el origen seria genial.

MPD + Sonata + Conky en Archlinux

Hace poco revisando por la web me tope con este post en ubuntulife, sobre unos scripts que hace uso de conky para mostrar el cover en tu escritorio de tu cancion que en ese momento estas reproduciendo, pero adaptado para el reproductor DeadBeef. Bueno en vista que yo utilizo MPD y Sonata como reproductor, decidi adaptar estos scripts, haciendo solo unas pequeñas modificaciones. Ya en el link que indico te dice como hay que configurarlo, yo solo pondre los dos archivos que modifique para este caso:

Archivo db.conky

# An album art conky for MPD + Sonata
background no
update_interval 1
cpu_avg_samples 2
net_avg_samples 2
double_buffer yes
no_buffers yes
text_buffer_size 1024
imlib_cache_size 0

own_window yes
own_window_type override
own_window_transparent yes
own_window_hints undecorate,sticky,skip_taskbar,skip_pager,below

border_inner_margin 1
border_outer_margin 0

minimum_size 400 100
maximum_width 1000

alignment bl
gap_x 4
gap_y 30

draw_shades no
draw_outline no
draw_borders no
draw_graph_borders no
default_shade_color 181818

use_xft yes
xftfont Droid Sans:size=9
xftalpha 1.0
uppercase no
override_utf8_locale yes
default_color 0b0b0b

color1 606060

TEXT
${voffset 7}${goto 140}${font Droid Sans:size=9:bold}$mpd_artist$font
${goto 140}$mpd_title
${goto 140}$mpd_album
${goto 140}${font Droid Sans:size=8}$mpd_elapsed/$mpd_length$font
${texeci 10 ~/.config/conky/db-cover.sh}${image ~/.config/conky/conkyCover.png}

Archivo db-cover.sh

#! /bin/bash
# An album art script for MPD + Sonata

ARTCACHE=$HOME/.covers
ARTIST="`sonata info | grep 'Artista' | cut -d":" -f2 | sed 's/^[[:space:]]//g'`"
ALBUM="`sonata info | grep 'Álbum' | cut -d":" -f2 | sed 's/^[[:space:]]//g'`"
CURCOVER="$ARTCACHE/$ARTIST-$ALBUM.jpg"
CONKYDIR="$HOME/.config/conky"
COVER="$CONKYDIR/conkyCover.png"

if [ ! -f "$CURCOVER" ]; then
 convert $CONKYDIR/Vinyl/base.png $CONKYDIR/Vinyl/top.png \
 -geometry +0+0 -composite "$COVER"
else
 cp "$CURCOVER" "$COVER"

 ASPECT=$(($(identify -format %w "$COVER") - $(identify -format %h "$COVER")))

 if [ "$ASPECT" = "0" ]; then
 convert "$COVER"  -thumbnail 300x86 "$COVER"
 convert "$COVER" -crop 86x86+$(( ($(identify -format %w "$COVER") - 86) / 2))+0 +repage "$COVER"
 else
 convert "$COVER"  -thumbnail 86x500 "$COVER"
 convert "$COVER" -crop 86x86+0+$(( ($(identify -format %h "$COVER") - 86) / 2)) +repage "$COVER"
 fi
 convert $CONKYDIR/Vinyl/base.png "$COVER" -geometry +4+3 \
 -composite $CONKYDIR/Vinyl/top.png -geometry +0+0 -composite "$COVER"
fi

Y bueno eso seria todo, definitivamente esto se podria mejorar. Aqui un ScreenShoot

Actualizar certificados de Glassfish V2

Hace poco revisando información con respecto a los certificados que utiliza Glassfish para el tema de seguridad, me entero que los mecanismos de seguridad para la transmisión de mensajes requieren de los certificados con el estándar X.509 en su versión 3 y Glassfish trae por defecto dichos certificados pero en su versión 1, hago la aclaración que estoy trabajando con Glassfish V2. Entonces veremos una forma rápida y práctica de actualizar dichos certificados; para esto descargaremos este paquete que contiene dichos certificados y el script correspondiente para su actualización.

Entonces desempaquetamos el archivo y nos ubicamos dentro de ese directorio, en este caso tiene por nombre copyv3 y luego debemos tener en cuenta que si nosotros hemos cambiado la clave del keyStore anteriormente en algun momento configurando Glassfish, debemos modificar el archivo build.xml en la opción AS_KEYSTORE_PASSWORD y colocar dicha clave, si no en todo caso dejar todo por defecto (clave por defecto: changeit). Y luego hacemos lo siguiente tal como se muestra en la imagen:

Como pueden observar el primer comando que utilizo es export AS_HOME=/opt/glassfish esto por que el script busca esa variable de entorno seteada con la ruta de instalación de Glassfish, como pueden observar en mi caso yo lo tengo en /opt/glassfish. Luego el comando /opt/glassfish/lib/ant/bin/ant, esperamos unos segundos mientras se configura, luego lo que tenemos que hacer es iniciar el servicio y listo. Lo que ahora queda es verificar si se actualizo correctamente, para esto haremos lo siguiente:

Y listo eso seria todo. Espero les sea de utilidad, por el momento estoy trabajando esto como paso inicial para poder configurar webservices seguros.

Deshabilitar el TRACE/TRACK de Apache2 en openSuse 11.1

Como sabran los admisitradores de servidores linux, uno de los principales ataques que regularmente se dan, son por vulnerabilidades que se podrian encontrar tanto en aplicaciones web o por una mala configuracion (configuracion por default) en el mismo servidor web. Regularmente los sistemas que tienen habilitado el TRACE pueden ser propensos a robo de crendenciales (XSS), como se explica en este documento.  Por defecto cuando configuramos apache esta  propiedad (TRACE) esta habilitada, por seguridad se deberia deshabilitar, para esto haremos lo siguiente.

Yo uso openSuse 11.1 como server, y primero lo que tendriamos que cargar seria el modulo encargado de esta propiedad (rewrite), aplicando el siguiente comando:

# a2enmod rewrite

Luego de aplicar este comando,verficamos que en el archivo loadmodule.conf ubicado en /etc/apache2/sysconfig.d, este la linea

LoadModule rewrite_module /usr/lib64/apache2-prefork mod_rewrite.so

De esta manera sabemos que el modulo se cargo y ahora, debido a que yo manejo dominios virtuales, dentro del directorio /etc/apache2/vhost.d ubicamos el archivo de configuracion de nuestro dominio y agregamos lo siguiente al final:

RewriteEngine On

RewriteCond %{REQUEST_METHOD} ^TRAC(E|K)

RewriteRule .* – [F]

Reiniciamos apache y listo. De esta manera estariamos deshabilitando el TRACE, dandole un poco mas de seguridad de nuestro server.

Que quede claro que para tener un servidor algo mas seguro, no basta con esto, se tiene que ir planteando politicas de seguridad, ya sea para actualizaciones se software, revision de log, tener firewall debidamente configurado, etc.