jueves, febrero 28, 2013

bash tip: get first and last arguments of last executed command


Let's say you execute the following command on bash:


# cp /long/source/path/file /long/destination/path/directory/


If in the next command you need to edit the file or change to the destination directory, then you can use:


 a.- "ctrl+alt+y" (simultaneously press ctrl and alt and y) which recovers the first argument of the previously executed command.

 b.- "ESC+." (simultaneously press ESC and dot), which recovers the last argument of the previously executed command.


So, you can do either:

# vim <ctrl+alt+y>

(becomes automatically "vim /long/source/path/file")

or:

# cd <ESC+.>


(becomes automatically "cd /long/destination/path/directory/")


Remember this and save lots of keystrokes!


EDIT: David Muriel shares with as the way of doing it without key combinations, just using the following direct arguments:

First argument of the previous command -->   !!^
Last argument of the previous command  -->   !!$
Nth argument of the previous command ---->   !!:n

So you can directly write:

# vim !!$

It's quite easy to remember, !! for "the argument" followed by a identifier similar to regular expressions (^ = start, $ = end) or :n = Nth ...

Thanks, David!

Reducir el tamaño de letra del UI en Eclipse bajo Linux


Si ejecutas Eclipse bajo Linux y lo haces (como yo) en un portátil con pantalla de 15", probablemente te encontrarás con el que tamaño de letra usado en el GUI es demasiado grande y se pierde espacio de todas las ventanas de trabajo (código, layout, propiedades, árbol de proyecto...).

No existe opción específica en Eclipse para cambiar de golpe el tipo o tamaño de letra utilizado, pero buscando información sobre ello he encontrado lo siguiente.

1.- Crea el fichero .gtkrc-eclipse en el directorio home de tu usuario, con este contenido:


style "eclipse" {
        font_name = "Sans Condensed 8"
}
class "GtkWidget" style "eclipse"



2.- Lanza eclipse con el siguiente comando:


GTK2_RC_FILES=/usr/share/themes/Clearlooks/gtk-2.0/gtkrc:/home/usuario/.gtkrc-eclipse /opt/android/adt-bundle-linux/eclipse/eclipse


Si lo estás lanzando desde un "launcher" de gestor de ventanas, añade "env" delante:


env GTK2_RC_FILES=/usr/share/themes/Clearlooks/gtk-2.0/gtkrc:/home/usuario/.gtkrc-eclipse /opt/android/adt-bundle-linux/eclipse/eclipse


De esta forma, se aplicará todo el estilo Clearlooks y tras él se aplicará el pequeño cambio de estilo definido en el fichero .gtkrc-eclipse.


Fuente: http://techtavern.wordpress.com/2008/09/24/smaller-font-sizes-for-eclipse-on-linux/


EDIT: He llegado a probar el tamaño "Sans Condensed 7" con éxito; todavía es legible y se gana algo más de espacio ... así que todavía podéis apurar un poco más si os lo permite la vista :-)


miércoles, febrero 27, 2013

bash tip: sleep until a given date/time and then execute a command



Imagine that you want to launch a "console" command or script in a terminal at 03:00AM, and being able to check the output at any time. But you don't want to use cron or at, because you need to control both stdin and stdout in any moment.

Yes, it seems a strange situation but it happens :P

Instead of waiting to 03:00AM to launch the command, you can use "sleep N && your-command", like this:


Add the following to your .bashrc file:


function sleep_until {
  NSECONDS=$(( $(date -d "$1" +%s) - $(date +%s) ))
    if [ $NSECONDS -lt 0 ];
    then
        NSECONDS=$(( $(date -d "tomorrow $1" +%s) - $(date +%s) ))
    fi
  echo "Sleeping for $NSECONDS seconds..."
  sleep $NSECONDS
}


Reload it (source .bashrc) and then you can write:


sromero@compiler ~ $ sleep_until 12:16 && echo "TEST"
Sleeping for 16 seconds...
TEST

sromero@compiler ~ $ sleep_until "tomorrow 12:16" && echo "TEST"
Sleeping for 86369 seconds...
(...)

sromero@compiler ~ $ sleep_until "tomorrow 03:00" && ./your_script.py
Sleeping for 52777 seconds...


If you don't specify a date (only hour) and given(hour:minute) < current(hour:minute), the script will use the date for the next day:



sromero@compiler ~ $ date
mié feb 27 12:28:11 CET 2013

sromero@compiler ~ $ sleep_until 12:25
Sleeping for 86207 seconds...



Now you can leave the computer on and go to sleep.

Wake up at 04:00AM, check that everything's went fine and that you don't need to relaunch the command, and go again to sleep :-).

For remote systems, don't forget to run this under screen or tmux :)


PD: Adapted from http://superuser.com/questions/222301/unix-sleep-until-the-specified-time .

viernes, febrero 15, 2013

Code Simplicity (Summary / Resumen)


Después de leer el libro "Code Simplicity - The Science of Software Development" (Ed. O'Reilly - Max Kanat-Alexander), me decidí a crear en formato PDF un pequeño resumen del libro directamente de las propias palabras del autor (copia literal de párrafos o frases entre párrafos).

Subrayé una "copia" del libro con un rotulador fluorescente amarillo e hice una suerte de resumen rápido que reproduzco a continuación. El 95% de las palabras, insisto, son literales tal y como aparecen en el libro. He eliminado texto, ejemplos y explicaciones que deberían ser obvias para muchos de los interesados en este tema. No obstante, os recomiendo leer el libro completo si os resulta un tema de interés.


No es un libro técnico en sí mismo, es más alrededor de la filosofía de la simplicidad en la programación. Espero que el resumen os resulte de interés.

lunes, febrero 04, 2013

Problemas de batería en Android y solución con BetterBatteryStats


Tengo un estupendo tablet de Motorola Xoom de 10" con Android 4.1.2 cuya batería me duraba sin dificultades hasta una semana con un uso ocasional diario.

Como cualquier otro dispositivo que se precie de gestionar bien la batería, cuando lo dejabas con la pantalla apagada, entraba en modo "Deep Sleep" y apenas consumía entre un 3 y un 5% diario, ya que realiza conexiones esporádicas para actualizar datos o programas, y para las notificaciones.

Hace cosa de un mes, el tablet comenzó a perder un 30% de batería cada noche, por lo que por primera vez en mi uso de Android tuve que bucear en la información sobre la batería y comprar una app de unos 2 EUR que me permitió encontrar dónde estaba el problema.

Veamos primero unas capturas que muestran la naturaleza del problema. La primera es el consumo de batería, tal cual aparece en "Settings" -> "Battery":




Si os fijáis, el "proceso" Android OS está consumiendo un anormal 59% de la batería.

Si pulsamos encima de la gráfica de batería (arriba, donde pone la duración restante, aparece esto):



En esta imagen hay que fijarse en la parte inferior de la pantalla, esas pequeñas "barritas azules" que muestran la actividad de ciertos estados. Si os fijáis, la barra del "Wi-Fi activo" ocupa toda la pantalla porque el Wifi ha estado activo desde que lo encendí, sin haberlo apagado en ningún momento.

El estado "Pantalla encendida" apenas tiene una rayita (a la derecha del todo) que es el instante actual en que estoy tomando estas capturas, ya que he encendido la pantalla para interactuar con el tablet.

Pero el interesante es el estado "Activa", que indica cuándo el tablet está activo. Como podéis ver, prácticamente cada pocos segundos o minutos el tablet está haciendo algo, motivo por el cual nunca entra en modo Deep Sleep y la batería "vuela".

La aplicación Better Battery Stats de Google Play (de pago, unos 2 EUR aprox.) te permite encontrar cuál es la aplicación que está causando este mal funcionamiento. En mi caso, después de comprarla, hice una carga completa, abrí la aplicación y en las opciones configuré las alarmas de proceso y de red (requieren root), en Settings -> Advanced.

Después, indiqué que comenzara a tomar datos "Since Unplugged" (desde que se desconecte el cargador). Apagué la pantalla, desconecté el cargador, y dejé la tablet durante toda la noche en funcionamiento, apagada.

Y esto es lo que me indicó el Better Battery Stats al día siguiente:




Como podéis ver, el dispositivo está "Awake" (despierto) casi 11 horas, es decir, no entra en modo Deep Sleep, con lo cual (salvo por la pantalla apagada) es como estar usándolo.

¿Y la CPU? ¿Cuánto tiempo está activa y cuánto en Deep Sleep?




Deep Sleep (la última de las barras) = 0.0%.

¿Y qué aplicación puede estar provocando esto? Pues en la sección de Partial Wakelocks tenemos la clave (en otros casos el problema podría detectarse en otras secciones):




AppLock, una pequeña aplicación que instalé hace un mes para proteger con "password" el acceso a algunas aplicaciones (Settings, Google Play, etc) de forma que mis hijas no pudieran estropear nada de la configuración del tablet, resulta que se come la batería brutalmente. Encima de la barra podemos ver que la aplicación ha consumido el 23% de batería (100% to 77%), ella sóla, y con el tablet en reposo...

Para verificar mi hipótesis, desinstalo la aplicación, cargo la batería y vuelvo a lanzar el Better Battery Stats para dejarlo "inactivo" toda la noche. Y al día siguiente...





¡Zas! La batería pasa a durar de nuevo lo que antes y en la anterior captura podéis ver cómo "Tablet inactivo" ha reemplazado a "Android OS". Si vemos el detalle (pulsando en la gráfica):




Ahora la actividad es más normal, hay conexiones pero esporádicas, y sólo he perdido un 2% de batería durante toda la noche (como podéis ver en la gráfica, le desenchufé el cable al 95% de carga, por eso la gráfica no parte desde el 100%).

Veamos qué dice ahora el Better Battery Stats:




Deep Sleep = 8 horas. Lo correcto.




Nuestros dispositivos Android son verdaderos sistemas multitarea (no como en el caso de iOS) por lo que hay que tener mucho cuidado con las aplicaciones mal programadas (o no diseñadas para la versión de Android que usamos), las cuales pueden consumir toda nuestra batería y que achaquemos el problema a nuestro telefóno, a nuestra versión de Android, o al hardware de la batería en sí.

Ahora mismo tenemos sistemas dual o quad core con más RAM y potencia que muchos equipos de escritorio de hace un par de años, alimentados por escuálidas baterías de 1450 ó 1850 mA/h (como mucho, de 3000 mA/h, y eso aumentando el tamaño del teléfono) por lo que tenemos que tener mucho cuidado con qué instalamos y revisar regularmente si nuestro teléfono se comporta como debiera.

En mi caso, creo que Better Battery Stats ha cumplido con creces lo que esperaba de él, aunque me duele tener que pagar 2 EUR para encontrar que una aplicación mal programada o incompatible con mi versión de Android ha sido la causante del problema.

En cualquier caso, sin tener que comprar ninguna aplicación, la sección de "Batería" de la configuración de Android, y más concretamente las  gráficas de actividad, nos pueden permitir detectar si algo está funcionando de forma incorrecta en nuestro teléfono.

Espero que este pequeño análisis os resulte de utilidad para mejorar el rendimiento de vuestras baterías.