Archive for the ‘informática’ Category

Checking automatically your server status from Android device

marzo 6, 2013

After a while without writing anything related to computer/scripting stuff I am back presenting a script for Android devices that will help you notifying when your personal server is down.

I have a personal server running in a virtual machine that during some weeks was a bit buggy, as my personal webpage is hosted there and I needed it to be up 24/7 when system failed the host was no longer available but it took me some days to realize as I wasn’t checking it everyday. As I wanted to apply some Python knowledge under Android I came out with the idea: I have a phone that is always connected so let’s create a script that periodically (using already-available tools) check the status of the server and in case of problem notifies it, thus, I don ‘t have to worry about checking the availability of my server.

The concept is quite simple and will work as follows:

  • Small script in Python that will run under SL4A.
  • A tool (TaskBomb) that will run the script periodically.
  • A server to be checked, in this case.

So, according to that steps, the process for creating the automatic check was:
First I installed TaskBomb (the scheduler), SL4A (scripting layer), the Python interpreter and SL4A Script Launcher which allows TaskBomb to run scripts as it can’t handle them directly. All these tools can be downloaded for free in the Android Market.

Second, I created the following script in Python:

import android
import urllib2

# Web page to check
web_page = ''

	# print 'Page was found!'
	# Ok, nothing to do
except (urllib2.HTTPError,urllib2.URLError) as e:
	# Error? Notifiy!
	droid = android.Android()
	droid.notify("Server seems down!", web_page)

Third, and finally, I configured the TaskBomb to run the script (through ScriptLauncher) everyday at 6.15:

And that is it! Now, every morning your phone will try to connect to the server, if everything is ok nothing will happen but if anything fails, it will display a small notification on the status bar (I established the rule on IPTABLES to make it fail).

Notification when failure

Notification when failure

In SL4A page you can find examples and a book to start developing some powerful scripts. Enjoy!

Good bye MLDonkey, hello Transmission!

marzo 27, 2012

Ok, I’ve been a while without updating and althoguh I have some post almost written I wanted to share with you my last piece of code.

As you may remember four years ago I writed about an script which was in charge of setting automatically your MLDonkey rates in order to not overload your bandwith according to the number of clients in your local area network. This script has been running for almost four years and has been a really helpful in achieving the following stats:

more than 3 year sharing; 1.6 T shared!!

more than 3 year sharing; 1.6 T shared!!

Well, after this past years I’ve been using MLDonkey as my bittorrent client but as it doesn’t support magnet links I’ve decided to move on and give Tranmission a try. Installing it has been a piece of cake and as I was really glad with its web-ui I’ve decided to make it my default client and therefore, remake that script in order to work with this new client!

The code its a port from the past one, but you can see it here:

# A Transmission ( script that 
# will vary the download and upload speed limits based on the
# number of hosts currently active on the LAN.
# Very usefull when installed in a mediabox that when being the
# only host will set no up/down limits but when a shared connection
# will limit to not overload the network
# Author:
# Jaime Bosque jaboto(at)gmail(dot)com
# This script is based in a previous work from the author plus
# - Miguel Mtz (aka) Xarmaz
# - aRDi
# - tazok de
# Requirements:
# transmission-remote, transmission, grep, nmap, cron 

# Transmission and network vars.
# -hosts should be 2 if you are using typical network config (router + mediabox) 
#  but may  vary if is in the same box or you have an always-active host
# Specific rate settins according to the lan usage
# -solo_(up|donw) settings for when just this machine is in lan
# -shared_(up|down) settings for when more that this machine are in lan

# Detect if transmission is running
running=`pidof transmission-daemon | wc -l`
pid=`pidof transmission-daemon`

if [ "$running" == "1" ]; then
    # Use nmap to retrieve the number of hosts in lan 
    hosts_up=`nmap -sP $lan.* | grep $lan | wc -l`
    last_read=`tail -n1 $log`
    hosts_up_before=`tail -n1 $log | grep -o -E "H[0-9]+" | grep -o -E [0-9]+`
    if [ -z "$hosts_up_before" ]; then hosts_up_before=0; fi

    # If something has changed in the lan update limits
    # echo "Hosts up $hosts_up  vs $hosts_up_before"
    if [ "$hosts_up" -ne "$hosts_up_before" ]; then
        if [ "$hosts_up" -gt "$hosts" ]; then
        #echo "Setting limits $down_limit and $up_limit "
        $t_remote $server:$port -n $user:$pass -d $down_limit
        $t_remote $server:$port -n $user:$pass -u $up_limit

        #Log that changes were done!
        echo `date +"%d/%m/%y -- %H:%M"` "S$running H$hosts_up U$up_limit D$down_limit P$pid" >> $log
    # Log that daemon is not running :_(
    echo `date +"%d/%m/%y -- %H:%M"` "Transmission-daemon is not running!" >> $log	

    # Start transmission daemon with the specified config file
    `$transmission -g $config_file`
    echo `date +"%d/%m/%y -- %H:%M"` "Transmission-daemon was lunched!" >> $log
exit 0

I’ve also created a github repository that you might like to follow for further changes or to know a bit more about the script and settings.

Hope it helps!

Basic WordPress crawler in Python

enero 29, 2012

I’m developing a new personal web where I will probably include some links to this, my blog, I thought it would be a good idea to have an automatic way to extract them from this site. As I was a bit bored last Monday and wanted to remember my Python skills, I thought “Let’s do a really simple WP crawler to make that work for me!”.

The next Python crawler it’s a really simple script. I know it could have been coded showing a beautiful menu with options and some methods having default params and all that, but just wanted to code it quickly. Every tricky part it’s commented but I will explain it in a few lines.

  1. WordPress blogs show only the last entries and at the bottom, there’s a link which allows you to go to older entries (linking to something like …/page/number)
  2. The crawler will start seeking for every link in the webpage indicated as source
  3. For every link found, if it’s an ‘h2’ type, will consider it as a blog entry so will store it in the list wp_entries
  4. If it’s an internal link will crawl it as long as it contains the word ‘page’
  5. There’s a depth limit so it doesn’t crawl through every page if desire
  6. When it has finished crawling, it will show every entry found

Here is the code:

import urllib2
import urlparse
import re

class Crawler:
    _source = ''
    _depth = 0
    _links = []
    _wp_entries = []
    _debug = False

    def __init__(self, source, depth):
        self._source = source
        self._depth = depth
        self._links = [] 
        self._wp_entries = []
    def get_childs(self, url, level):
        if (level <= self._depth):
            if self._debug : print 'Crawling ', url
                page = urllib2.urlopen(url)

                # Discard non html files
                page_info =['content-type']
                if not('text\/html', page_info)):
                    if self._debug: print 'Found a non-html file ', url, ' :',['content-type']

                    for line in page:
                        # Find every link in source code
                        if (('a href=', line) != None)):
                            # If several links in a line -->  Iterate through all
                            links_in_line = re.findall('a href="(.*?)"', line)
                            for link in links_in_line:
                                # For each link found
                                #   0 - Check the link its internal (regex source or a page in same dir)
                                #   1 - Create the new page (only if it's without source in link)
                                #   2 - Check it doesnt been crawled (check self._links)
                                #   3 - Add to the list (self._links)
                                #   4 - Crawl the new one according to the rules (match 'page' in this case)
                                new_link = ''
                                crawl_link = False
                                if (re.match(self._source, link)):
                                    # Subpage sharing source (source/sthing) -> use that link
                                    if self._debug: print 'Found internal link ', link
                                    new_link = link
                                    crawl_link = True

                                elif (re.match('http:\/\/', link)):
                                    # External link -> do nothing
                                    if self._debug: print 'Found external link ', link

                                elif (re.match('\w|\_|\.', link)):
                                    # Internal link -> construct full url
                                    if self._debug: print 'Found internal link', link
                                    new_link = urlparse.urljoin(url, link)
                                    crawl_link = True

                                    # Weird link
                                    if self._debug: print  'Found weird link ', link

                                if ((self._links.count(new_link) == 0) & crawl_link):
                                    # Found a new link, store & crawl it

                                    # WP specific actions
                                    # Store only h2 links (meaning entries)
                                    # Just crawl whenever link contains 'page' 
                                    if('h2', line)): 
                                        if self._debug: print 'WP entry ', new_link

                                    level += 1
                                    if('page', new_link)): self.get_childs(new_link, level)
                                    level -= 1

            except urllib2.HTTPError as e:
                if self._debug: print 'Found error while crawling ', url, e

            except urllib2.URLError as e:
                if self._debug: print 'Found error while crawling ', url, e
            if self._debug: print 'Maximum depth level reached, skipping'
    def show_childs(self):
        print len(self._links),' links were found, listing:'
        for link in self._links:
            print link

    def show_wp_entries(self):
        print len(self._wp_entries),' WP entries were found, listing:'
        for head in self._wp_entries:
            print head

# Create a new crawler with page and maximu depth level
crawler = Crawler('', 5)

# Get childs for that page (could have used defaults params in method)
crawler.get_childs('', 0)

# Show me what you found

And now, let’s check the output where I’m asking the crawler to list this blog 6 pages of entries:

kets@ExoduS:~/programacion/sources/python$ python 
30  WP entries were found, listing:

It works!! As you can see, with just a hundred lines of Python where typed to achieve that, and much more could be done just modifying some parameters. Hope it helps!

Mitos y verdades sobre las becas ICEX en Informática

enero 24, 2012

Se supone que como becario IC3X tengo prohibido utilizar dicha “marca” pero con ánimo de subir en los buscadores y que los posibles interesados de la beca puedan llegar hasta aquí, voy a saltarme la regla y afrontar las posibles consecuencias (que espero, no se den).

Lo primero, una breve introducción: el Instituto de Comercio Exterior “ICEX”, es una división del Ministerio de Industria, Turismo y Comercio Ministerio de Economía y Competitividad encargado, a grandes rasgos, de promocionar productos y servicios de empresas españolas en el extranjero. Digamos que tú tienes una empresa española, te sientes con ganas de exportar pero quizás te encuentras algo perdido, pues bien, puedes ponerte en contacto con el ICEX, seleccionar un país y por un precio reducidísimo, o incluso gratis, se encargaría de estudiar la viabilidad de tu negocio en dicho país, competencia, alternativas, prepararte una agenda con empresas interesadas… Además, promociona encuentros emrpesariales tanto en España como en distintos países para que empresas del sector elegido puedan entablar relaciones.

Bueno, pues tras la pequeña introducción, voy al grano. Has oído hablar de las becas para informática del ICEX, te han dicho que son las mejor pagadas, que te permiten vivir un año en el extranjero y que encima vas a poder empezar, o continuar tu vida laboral, en una embajada u oficina comercial que viste muchísimo el curriculum vitae. Pues bien, todo lo anterior es cierto, pero vayamos por partes.

El inicio
Para ver más información acerca de las becas que proporciona la entidad, puedes acudir a su Página web en el apartado “Todos nuestros servicios” y “Becas”. No introduzco el enlace directo porque es algo complejo y creo que va cambiando con el tiempo.

Por lo general, la inscripción suele ser entre febrero y marzo, tienes que rellenar un formulario web (que, como informático, a lo mejor te crispe saber que solo funciona bien desde Internet Explorer) e ingresar 50 euros para poder optar a la candidatura. Una vez hecho, tienes que guardar ese resguardo porque se te pedirá en la primera prueba.

Quizás te encuentres trambién con un foro que es el referente para casi todos los becarios tanto nuevos como ya en destino, ahí puede que conozcas a tus futuros compañeros, a gente bastante dada a ayudarte con apuntes, consejos para las entrevistas…

El proceso de selección
Llegar hasta aquí ha sido fácil, ahora empieza lo más complicado, saber destacar entre muchas personas; no recuerdo muy bien el número pero en mi año creo que el ratio era 1 puesto por cada 12 candidatos.

La primera prueba será un examen de conocimientos generales, y no tan generales, de informática. Por lo general, la gente que viene de módulos de informática creo que tiene ventaja porque son conocimientos mucho más prácticos y que en la carrera no es que se vean mucho. Bastantes preguntas de administración en sistemas Windows, MsOffice, algunas generales de redes, preguntas sobre qué es el ICEX y a qué se dedica… En el foro te echaran un cable con los posibles apuntes y preguntas de otros años, pero vamos, se puede ir a las bravas y quizás pases el corte; de aquí, tienen que salir unos 500 seleccionados.

La segunda prueba es un examen de inglés y de un segundo idioma, si es que lo pediste. El de inglés escrito es de rellenar huequitos, tipo Cambridge y según dicen, nivel advance, aunque yo lo vi algo más fácil. En el oral te darán un papelito con un tema de actualidad y te tocará leerlo y comentarlo. Aquí juega demasiado la suerte, porque, literalmente, al que estaba delante de mí le tocó hablar sobre “el adulteramiento de ginebra con banana en Uganda” ¡flipa!, además, el profesor/a puede ser más o menos extricto y permitirte que te salgas del tema o no; la cuestión es ver como te desenvuelves en una conversación con un tema algo controvertido (sé que hubo otros donde preguntaron sobre la tauromaquia, los extraterrestres, políticas de desempleo…).

Además, es posible que hayas cogido o pienes hacer un segundo idioma para subir algo de puntos. En mi año no restaba hacerlo mal pero si te apuntas y luego no te presentas sí. A lo mejor, como me pasó a mí, tengas conocimientos de un segundo idioma algo olvidados y no sepas si presentarte o no. Mi recomendación es que, de primeras, te apuntes, y luego ya dirás que al final no vas en función de lo arriba o abajo que estés en la clasificación. Si estás abajo te preparas el idioma, si estás por arriba y te da pereza pues no. Ir a hacerlo por hacerlo me parece un poco tontería y yo preferí defender en la entrevista que tenía un segundo idioma algo olvidado a no ir con una nota bajísima a decir que había ido a probar suerte. Pero allá cada cual. De aquí salen unos 200 candidatos.

Un pequeño inciso; durante estas dos pruebas ya conocerás a gente, posibles futuros compañeros de clase y de trabajo (aunque separados por muchos kilómetros). Suelen organizarse quedadas para tomar algo antes o después, intenta ser social que no está reñido con ser informático. Conocerás gente que te puede dar su punto de vista, algunos veteranos, sus opciones de destino, gente que tiene disponible un piso en Madrid por si al final consigues superar todas las pruebas…

La tercera y última prueba será una entrevista. Aquí ya no se hace todos el mismo día, se te citará en una fecha para que acudas a la sede del ICEX en el centro de Madrid. Coincidirás con tres o cuatro becarios más y tendrás que demostrar que eres el candidato adecuado. También juega un papel importante el factor suerte porque los entrevistadores van rotando y te puede tocar una entrevista de colegueo o totalmente destructiva. Mi recomendación, sea la que sea, es que vayas con las ideas claras. Hay gente que se ve abajo en la tabla y decide pedir un país poco solicitado para convencer a los entrevistadores, hay gente que va muy arriba y pide un destino específico diciendo que rechazaría cualquier otro, hay gente que dice que le da igual el destino… Yo fui de los últimos y creo que fue un error. Si estás convencido de que te quieres ir a un sitio ¡dilo! Defiende tu candidatura. Di que te encantaría descubrir la cultura X o el país Y, que llevas tiempo queriéndote ir y nunca has tenido una oportunidad mejor, lo que creas oportuno. Supongo que la inscripción marcarías unos destinos pero si cambias de opinión no pasa nada, comenta que lo has estado mirando o estudiando mejor y que lo que más te gustaría irte a ese sitio que tanto has soñado. También creo que es bueno ser algo flexible, decir que o te vas a tal sitio o si no, vas a rechazar no es la mejor jugada; después de comentar la pasión por tu destino elegido suelta la típica coletilla, y máxima de los becarios ICEX, “no hay destino malo si no actitud equivocada“. Que no te importaría irte a otro sitio, porque al fin y al cabo lo que buscas es una experiencia internacional y blablabla pero que te encantaría vivir un año en X.

También te harán preguntas sobre tu curriculum, supongo que ya lo sabrás pero siempre que se va a una entrevista hay que ir con un CV actualizado por si acaso. Te preguntarán sobre los idiomas, por qué no fuiste al examen de francés si en el CV pone que sabes, dónde has aprendido inglés… También es posible que te sorprendan con alguna pregunta técnica; de nuevo, yo te recomendaría que fueses honesto. Si como a mí, te preguntan que si las comunicaciones por Skype son seguras o no, y no lo sabes, se sincero, di que no lo tienes muy claro.

Como he dicho antes, va a depender mucho del tipo de entrevista que te toque, a mí, me toco destructiva y no lo pasé muy bien. Ten confianza en ti mismo, quizás vayan a por ti pero piensa que si has llegado hasta aquí entre tantísima gente es porque algo bueno tienes, ¿no? ¡Ánimo, campeón/a¡ En el fondo solo están viendo cómo respondes a situaciones adversas, confianza en uno mismo, tranquilidad y sinceridad.

Por último, respecto al aspecto visual a la hora de ir a la entrevista. Tendrás muchas dudas de cómo hay que ir, ¿traje?¿informal?¿bermudas? La verdad es que vi, y me contaron, que había de todo; yo fui un poco informal (camisa y chinos), pero algunos de mis compañeros iban con traje. Es una decisión muy personal, yo creo que ir con traje y corbata es algo excesivo pero depende de cada uno, tampoco iría con bermudas y sandalias, claro… Ah, y comentar que yo fui con coleta y pendientes y en ningún momento se me miró mal por ello; me comentaron que alguien de año anterior había ido con rastas así que me envalentoné. Creo que una cosa no quita la otra, pero si te apetece ir con pendientes y ves alguna mala mirada, puedes comentar que no tienes ningún problema en quitártelos si en el lugar de trabajo así se requiere, aunque entonces igual te pregunten que por qué no te lo has quitado para la entrevista… en fin, se tú mismo y responde con sinceridad.

Los seleccionados
Pasado un mes de angusta, se publicará un listado con los seleccionados y el destino. Ese día estarás histérico, al fin y al cabo se va decidir tu futuro… Si has salido elegido, no diremos que has tenido suerte, porque al fin y al cabo los mejores preparados siempre son los que más suerte tienen, ¡enhorabuena!

Quizás te haya tocado un país que ni siquiera sabes donde cae, coge un mapamundi y ¡averígüalo! no serás el primero al que le pasa. A lo mejor estés triste porque te ha tocado un destino que ni se te pasaba por la cabeza “¡joder, con lo bien que me salió la entrevista!” o quizás te haya tocado lo que habías pedido “¡TOMA!”. En cualquier caso, tienes muy pocos días para confirmar que qiueres la beca o no. Te recomendaría que pienes muchísimo el rechazo, no sé la situación que puedes tener aquí: pareja, trabajo, estudios… sé que hay gente que rechaza destinazos y, probablemente, la gente se le tire al cuello diciéndo que cómo puede rechazar el mejor destino, pero piénsalo bien. Es tú decisión, en tus manos está irte un año fuera o no. También te diré que no conozco a ningún becario que se haya ido y haya vuelto porque el destino era malo. Como decía por arriba, “no hay destino malo, si no actitid equivocada”, cualquier destino va a suponer unas experiencias y unas aventuras difíciles de repetir en otra situación, si vas a rechazar porque no te han dado lo que querías, piénsalo bien, si al final aceptas es posible que te lleves una grata sopresa.

El curso
Y por fin, en verano, empezará ya la beca. Has superado todas las pruebas anteriores y por fin, eres becario con un destino asignado. Tendrás que buscar sitio en Madrid (de nuevo, el foro es una buena opción para encontrar gente con habitaciones libres).

Te tocará estar en Madrid un mes y medio, irás a clase todos los dás de mañana o de tarde y por las noches, probablemente de fiesta. Conocerás gente maravillosa que quizás habías visto o conocido en las pruebas anteriores, también gente que no entenderás como le han podido dar la beca cuando conociste gente mucho mejor preparada… Da igual, haz amistades porque puede que mucha gente de ahí se conviertan en amigos para toda la vida. También intenta relacionarte con los becarios de países vecinos; suele haber muy buen rollo y todo el mundo acoge en su casa a otros becarios, pero mejor si encima es un amigo al que luego irás tu a visitar.

Las clases serán aburridas, las resacas las harán insoportables y encima, tienes que ir con pantalón largo y zapatos a 40°. La verdad es que muchas cosas no te van a servir de nada, pero otras tienen su utilidad, presta atención si puedes o, por lo menos, entérate de lo básico y dónde acudir en caso de que necesites ayuda. Se supone que vas a trabajar y una embajada u oficina comercial va a depender de ti, tampoco te lo tomes muy a cachondeo que al fin y al cabo, estás para eso. Además, dependiendo del destino, es posible que se te exija un poco más que al resto, no te lo tomes a mal, en el fondo, te vendrá bien. Además hay exámenes donde se evaluará si estás enterándote de algo o pasando totalmente del curso, te confesaré un secreto, son bastante fáciles y, que yo sepa, nunca le han quitado a nadie la beca por suspenderlos.

Si eres suplente quizás estés pasándolo mal, oirás a la gente hablar de que han estado mirando sobre el destino, de que vaya viajazos se van a pegar y todo eso. ¡Ánimo! Quizás nadie rechace pero siempre puedes entablar una amistad y luego tener sitios a los que viajar barato.

Una vez en destino
Y por fin, tras esos meses de duras pruebas, ese curso en Madrid que ha terminado con la mitad de tus neuronas, tocará viajar al destino y encima, muy probablemente, acompañado por ese grupo de becarios llamados COMEX.

Aparte del destino, que va a depender mucho de la actidud con la que vayas para que se convierta en un destino cualquiera o en un destinazo, vas a tener un factor muy importante, el lugar de trabajo. En tu embajada u oficina se van a hacer las cosas de una manera u otra y no vas a poder quejarte argumentando que otros están mejor o peor que tú. Tu horario quizás sea una mierda o tengas la suerte de tener intensivo todo el año, el trabajo que desempeñas no tienen nada que ver con lo que has estudiado y encima te cargan con labores del resto de becarios, tus jefes quizás sean majísimos o unos diplomáticos a los que se les sube la “fama” a al cabeza, tus compañeros locales unas arpías o gente maravillosa encantada de conocer becarios nuevos cada año… En fin, va a depender de muchos factores pero si has tenido la mala suerte de tener una embajada u oficina horrorosa, intenta que no pueda contigo; piensa que estás viviendo un año fuera e intenta exprimirlo al máximo.

Los amados/odiados COMEX. Mucho habrás oído o comentado de que te va a tocar convivir, probablemente, con los COMEX, ese grupo de becarios pijos que viene de empresariales, ADE, económicas… Está en tus manos que se conviertan en meros compañeros de trabajo, o en los mejores amigos que vas a poder tener. Piensa que van como tú, a la aventura y sin conocer a nadie, posiblemente necesiten, como tú, un apoyo en momentos de bajón y soledad en el extranjero, o un compañero de viajes, o un cómplice para sus secretos… déjate los prejuicios en casa, si nosotros no somos todos unos frikis antisociales ellos tampoco tienen porqué ser unos pijos aprovechados.

Si estás en esta beca es porque, posiblemente, te encante vivir experiencias en el extranjero, aprovéchate de ello y viaja todo lo que puedas. Tienes la suerte de tener amigos/compañeros en casi cualquier parte del mundo, visita ese país que siempre has querido, conoce nuevas costumbres y sitios. Además, tendrás la suerte de contar con un guía “local” que sepa enseñarte lo mejor y lo peor de cada sitio. Por supuesto, haz tú lo mismo y acoge con cariño a todo aquel que quiera visitarte.

La beca, proablemente, consiga que ese año te parezca el más corto de tu vida, ¡no desaproveches ni un momento!.

La vuelta
Tras doce meses, te pararás a pensar lo rápido que ha pasado todo, parece que fue ayer cuando ibas Madrid a hacer un examen de inglés y ahora, 15 meses después, toca de nuevo volver a empezar.

Existe la posibilidad de que el destino te haya encantado, de que hayas conocido a alguien por allí y de que te quieras quedar. Si es tu opción intenta echarle un ojo al listado que recibirán los COMEX para saber qué empresas operan por allí y busca gente, pregúntale a tu consejero/a, aprovecha las agendas que se han ido haciendo durante el año…

Si vuelves a “casa”, probablemente, se te haga muy duro. Intenta no dejar todo para última hora y echar curricula desde allí, pídele al consejero/a una carta de recomendación, investiga un poco el mercado internacional…

Hagas lo que hagas, el recuerdo de ese maravilloso año y todo lo vivido estará siempre contigo. ¡Enhorabuena!

XFCE display switching (dual & single monitor)

enero 18, 2012

It’s been a long time since I don’t write neither in English nor about computer related stuff. It’s not that I stopped doing things but was a bit lazy about posting them here.

Anyway, a few days ago I bout a new monitor tired of working in a 12” screen. I connected it and nothing happened, i mean, there was no signal output so, as usual, I prompted out a terminal and used that wonderful tool called xrandr. Perfect! I worked like a charm until I disconnected it and realized I have no output trough my laptop screen, dammit! and as my key-combination wasn’t working I had to restart it.

I found that xfce4-settins-manager -> keyboard -> application shortcuts were supposed to launch xfce4-display-settings –minimal which did nothing so, instead of that, based on a script I found in the web (see below) I coded a small script, gave it execution permissions and asigned it to my preferred shortcut (XF86Display – Fn+F7 in my Thinkpad X61s).

Keyboard shortcuts

Keyboard shortcuts

Here is the script, working perfectly:

# Based on the script from

# Will do a cycling output from state 0 to 2 and use a sound as feedback
# State VGA LVDS Beeps
#   0    0   1      1
#   1    1   0      2   
#   2    1   1      3
#   (back to state 0)   

#For identifying our monitors use xrandr tool and view output
LVDS=LVDS1      # could be another one like: LVDS, LVDS-1, etc
VGA=VGA1        # could be another one like: VGA, VGA-1, etc
EXTRA="--right-of $LVDS" # addtional info while dual display

# Lets check both LVDS and VGA state from the string "$display connected (" 
xrandr | grep -q "$LVDS connected (" && LVDS_IS_ON=0 || LVDS_IS_ON=1
xrandr | grep -q "$VGA connected (" && VGA_IS_ON=0 || VGA_IS_ON=1

# Output switch cycle
if [ $LVDS_IS_ON -eq 1 ] && [ $VGA_IS_ON -eq 1 ]; then
    #Go to state 0 -&gt; just LVDS
    xrandr --output $LVDS --auto 
    xrandr --output $VGA --off
elif [ $LVDS_IS_ON -eq 1 ]; then
    #Go to state 1 -&gt; just VGA
    xrandr --output $LVDS --off
    xrandr --output $VGA --auto 
    beep && beep
elif [ $VGA_IS_ON -eq 1 ]; then
    #Go to state 2 -&gt; both outputs
    xrandr --output $LVDS --auto
    xrandr --output $VGA --auto $EXTRA
    beep && beep && beep
    #This should never be reached but just in case..
    xrandr --output $LVDS --auto 
    beep && beep && beep && beep

As you might already guessed, that script will only work as long as you are logged in a Desktop System (XFCE, Gnome, KDE…) and running the daemon listening to your shortcuts. But there’s no problem, you could also use it from a terminal if you assign it to your acpi event (see this) if you previously know which event is being launched on your combination (use acpid_listen).

Hope it helps!