Author: Oriol Rius

La història del Pol

Reading time: 11 – 18 minutes

Versión castellano: La historia de Pol

El projecte

Després d’uns anys de convivència varem decidir crear la família Rius Barberà; no ens agraden les coses típiques per això finalment varem aconseguir crear el nostre casament a mida. Tot plegat una excusa perfecte per compartir amb els amics i familiars més propers quelcom molt especial que anavem a començar.

Cada un dels passos del procés va ser molt intens i els varem anar concluint amb èxit, la cerimònia, el convit, el viatge de noces i fins hi tot la resta de viatges com a matrimoni han acabat sent records fantàstics. Tot plegat sabiem que eren experiències que hauriem d’aparcar durant uns anys perquè el objectiu més important és crear la nostre família.

Així que un cop la natura es va posar en marxar varem aparcar els viatges i varem començar a invertir en el nostre niu. Obres al Jardí i a l’habitació del primer fruit del nostre projecte. Tot plegat una forma de viure l’arribada del nostre primer fill, el Pol.

Els fets

Després de 37 setmanes d’embaràs tocava el moment de coneixer l’hospital on havia de neixer el Pol, la clínica del Pilar. O sigui, que el dissabte 26 d’abril a les 12h allà estavem apunt per coneixer la llevadora. Un passeig per les instal·lacions, moltes explicacions i detalls sobre com seria el part. Quan tot plegat ja estava enllestit l’Estefania fa un comentari innocent: “Fa un parell de dies que em sento poc al nen”. Aprofitant que erem a l’hospital es planteja fer un registre per veure si el nen esta bé i aquí comença la història. El cor responia bé però el nen no es movia, ni menjant xocolata ni forçant-lo amb les mans.

Arribats en aquest punt el que havia de ser una simple visita es converteix en un part. La llevadora trenca la bossa i les aigües surten netes i tot fa pensar que podriem acabar tenint un part natural però de seguida l’activitat del cor del nen es para i els fets es precipiten. Ràpidament traslladen l’Estefania a quiròfan mentre jo estava deixant la roba a l’habitació. Així que quan torno l’Estefania ja no hi és i m’acaben enviant a la sala d’espera. A quiròfan els fets van molt ràpid i en qüestió de minuts s’ha practicat la cesària.

El Pol ja és aquí, ha nascut el nostre primer fill a les 16:35 pesant 2.980gr. Tothom esta molt nerviós perquè el Pol no plora i esta molt aturdit. Alguna cosa ha passat a la panxa de la mare, no se sap quan ni perquè però l’han de reanimar i fins al cap de 15min no aconsegueixen fer-ho. El cor comença a funcionar però els organs estan molt tocats i se sap que hi ha alguna afectació neurològica però no el seu abast. Ràpidament el traslladen a la UCI i allà l’equip de pediatres pren la decisió de traslladar-lo a un hospital més equipat on li puguin fer totes les proves pertinents.

Durant tot aquest procés l’Estefania no ha parat de reclamar la meva presència i a mi els minuts se’m feien eterns, al cap de menys de dues hores ens retrobem i som informats de tot plegat per part dels metges. Amb l’Estefania a l’habitació jo me’n vaig a la UCI on coneixo el meu fill. El primer impacte és un xoc important perquè esta completament plè de tubs i més tubs. Tot l’entorn és plè de màquines que no paren de pitar. Els metges i infermeres s’acumulen sobre d’ell fent-li proves sense parar.

Aquest situació només s’allarga unes poques hores perquè ràpidament es decideix traslladar el Pol a la UCI de Sant Joan de Deu. Per sort en aquest moment ja tenim el Xavi i la Sabina amb nosaltres perquè ens havien portat les primeres coses de casa. Així que el Xavi i jo ens traslladem a l’hospital de Sant Joan de Déu i la Sabina es queda al Pilar amb l’Estefania. Les hores han anat passant i ja és ben fosc, per molt que miri el rellotge no sóc capaç de saber quina hora és.

Mentre acaben d’acomodar al Pol a la UCI i envien a tots els pares a la sala d’espera aprofitem per menjar alguna coseta. Els pares ens expliquen les seves històries i la història del Pol encara és molt inserta. Una manca d’oxigen ha provocat molts d’anys als organs però el més perillós és que no sabem fins a quin punt pot haver afectat el cervell. Finalment puc tornar a veure el Pol esta inmers en un munt de màquines que no paren d’aplicar-li tractaments. Una reunió amb els metges de guardia em reitera l’estat d’incertesa en el que ens trobem i em prepara pel pitjor. Les properes 48h-72h seran vitals.

Torno a l’hospital del Pilar després d’acomidar-me del Pol i em retrobo amb l’Estefania. La família de València ja són aquí i els posem al dia dels fets. Ja és molt tard i el dia s’ha fet infinit el cansament pot amb nosaltres i aconseguim dormir algunes hores tot i les interrupcions de les infermeres que van aplicant-li els tractaments de la cesària a l’Estefania. El matí següent els ginecòlegs que han portat l’embaràs aconsegueixen que Sant Joan de Déu accepti l’ingrés de l’Estefania perquè poguem estar prop del Pol.

Abans de dinar ja som tota la família a l’hospital amb el Pol. No em feu dir com però amb menys de 24h l’Estefania treu forces per aixecar-se de la cadira de rodes i poder saludar al seu fill. L’evolució del Pol és simplement constant, no hi ha millores que ens fassin ser optimistes i els metges cada cop ens han d’anar recordant i ens van preparant pel pitjor. Una persona amb els organs malmesos té possibilitats de viure però si les funcions neurològiques no es recuperen només pot ser un vegetal completament depenent de les màquines.

Els dies es fan eterns i les hores passen al costat del Pol mentre les mostres de suport no paren d’arribar. La relació amb els pares d’altres nens, infermeres i metges és el que més hores ocupa el meu temps i l’Estefania fa l’impossible per reduir els seus impediements físics per poder estar amb el Pol. Les 48h arriben i no hi ha res que ens fassi pensar que el Pol es podrà salvar. Els metges insisteixen en que pot arribar el moment on haguem de decidir.

Finalment arriben les 72h i no hi ha millores. La recomanació és clara, els metges ens deixen clar que poden allargar l’agonia però que la cura no arribarà. Així que finalment hem de prendre la decisió. No és senzill parlar d’això però per sort tan l’Estefania com jo tenim les coses clares. Si no pots disfrutar la vida, si no pots omplir el seu temps d’experiències això no és vida. Per tant, la decisió estava clara per nosaltres. Això no ho feia més senzill però almenys marcava el camí.

Tocava preparar el comiat. Crec que és una gran sort poder decidir com t’acomiades d’algú que has arribat a estimar tan en tan poc temps. Fins aquell moment no haviem pogut abraçar al Pol degut a la gran quantitat de tubs i cables que portava per tot arreu. Així que decidim vestir-lo i portar-lo a la nostre habitació, allà la família s’acomiada d’ell i finalment li diem adéu mentre el seu cor s’apaga entre els nostres braços.

Decidir què s’ha de fer amb el cos del teu fill és molt dur i sobretot adonar-se de fins a quin punt esta pervertit el sistema encara més. Una vegada acceptades les possibilitats la decisió que varem prendre va ser fer-li una necropcia i incinerar-lo. Per sort les persones que ens van atendre van ser sensibles i ens varen facilitar el camí.

Pol Rius Barberà

L’aprenentatge

Quan a un li toca viure episodis tan durs es pot preguntar moltes coses però si algo he après durant el camí de la meva vida és que hem d’estar agraïts per tot el que se’ns envia. És evident que les nostres perspectives i els nostres plans eren uns altres i que ningú volia que els fets anéssin així. Però som uns afortuntats perquè se’ns ha enviat un regal en forma de nen preciós i amb ell venia una lliço de vida que ens fa creixer i ens permet veure les coses des d’un altre nivell.

Acceptar el que se’ns envia, descobrir l’amor incondicional i estar agraïts per cada segon de salut i de vida són només uns petits exemples de fins a quin punt som afortunats. No oblidaré mai fins a quin punt sentia amor per aquella vida que sabia que li quedaven instants per marxar. A partir d’aquell instant un enllaç infinitament poderós es creava dins el meu cor. El Pol seria dins meu on viuria fins l’últim dels meus dies.

En el dia a dia els temes importants van quedant dil·luits per moltes altres situacions, és senzill adonar-se que hem omplert la nostre vida de coses materials o que els nostres valors han estat confosos per desitjos banals; el realment complicat és canviar això. Som objectes d’un regal fantàstic que és la vida i aquesta té un temps finit omplir-la d’experiències meravelloses i d’amor només depèn de nosaltres. Entendre fins a quin punt són especials els moments que vivim és una decisió que hem de prendre. Sovint veig com les persones que m’envolten confonen l’alegria amb la felicitat. És evident que és molt agradable disfrutar de l’alegria però cada dia tinc més clar que la felicitat també viu en els moments durs perquè aquests estan creant coses realment poderoses dintre nostre.

A secundaria em van explicar per primer cop que els humans som éssers socials, en aquell moment em va costar molt d’acceptar això. Per sort, la vida m’ha anat ensenyant que no només som éssers socials sinó que aquest fet ens omple d’emocions que són la base sobre la que es construeixen les il·lusions i al cap i a la fi la societat és la pedra angular sobre la que s’articula la nostre vida. La família és una forma d’organitzar-se amb petits grups dins de la societat, però aquest grup no el podem escollir encanvi sabem que sempre seran allà per recolzar-nos passi el que passi. El que si que escollim són els amics que quan arriben circumstàncies difícils estan al nostre costat recolzant-nos i donant-nos el millor que tenen dintre per ajudar.

On vull arribar amb totes aquestes idees, doncs a quelcom tan senzill com la companyia. Al final a aquest món arribem sols i marxem sols. Ningú ens pot acompanyar en aquest camí i l’hem de fer en solitari. Per això mentre estem vius poder disfrutar de la companyia de les persones que més ens estimem és fonamental.

El futur

Mirar endavant i pensar en el futur en moments com aquests diria que és el que més costa. De sobte els projectes que omplien el dia a dia perden força i et qüestiones si tenen sentit. És evident que encara som joves i que estem convensuts que podrem tenir més fills. Aquests mai ompliran l’espai del Pol però si que li faran companyia. Per nosaltres el Pol mai morirà perquè és una emoció que tenim instal·lada al cor.

Al llarg de la vida he hagut de passar per altres moments en que he hagut de reconstruir el meu futur després d’un canvi imprevist molt important. Sovint en aquests moments ens fem preguntes que semblen molt importants: per què jo? què he fet malament? i d’altres similars. Però si he après alguna cosa d’aquests moments que he viscut és que fer-se les preguntes adequades és fonamental. No ens ha de fer por adonar-nos que estem buscant la solució a un problema que no cal resoldre per canviar l’enunciat i adequar-lo a la resposta que servirà per construir el nostre futur.

Els nostre valors i les creences fonamenten les nostres decisions. Però aquests no són estàtics ni inmobils, així que quan ens passa quelcom tan important com el que estem vivint en aquests moments és interessant qüestionar-se certs canvis de valors i crear noves creences que deixaran enrera el que fins ara ens havia estat útil.

Per mi el més difícil quan estic trist és connectar amb la il·lusió. Les passions queden apagades i tot es fa una muntanya. Arribats en aquest punt el que faig és confiar en que tot és un procés i que el canvi no vindrà de cop. Així doncs sabent el que m’agrada vaig forçant-me en omplir certs moments d’aquests ingredients. D’aquesta forma poc a poc faig creixer el dessig per allò que m’apassiona i mica en mica veig com la flama de la il·lusió crema cada cop amb més força. Aquests moments encara els veig lluny però el procés ha començat.

El perquè d’aquestes lletres

La finalitat d’aquesta entrada al blog és diversa. En primer lloc em calia posar ordre. La següent motivació és compartir. Sovint veiem quelcom natural el compartir els bons moments però ens amaguem dels dolents. Doncs bé, ara toca compartir aquest moment de creixement tan important. A més no sempre tens les ganes de repetir una i altre vegada la història que t’ha portat fins aquí amb totes les persones que t’agradaria fer-ho. A través d’aquest mitjà puc fer-ho.

Agraïments

Durant el procés que avui fa una setmana que es va descadenar hem estat amb contacte amb moltíssimes persones. Algunes ja les coneixiem des de fa uns mesos i d’altres simplement hem pogut compartir minuts amb elles. Però totes tenien quelcom en comú són éssers humans excepcionals.

Infinites gràcies i agraïments a les persones del Milenium de Vilafranca, l’equip de l’hospital clínic del Pilar, de Sant Joan de Déu i a la gent del SEM. No donaré cap nom perquè quan coneixes a tantíssima gent fantàstica en tan poc temps ets incapaç de recordar tots els noms i crec que seria injust deixar-me’n algún. El que si tinc clar és que per fer la seva feina i com la fan has de ser un fora de serie.

Jo sempre he treballat en quelcom que és la meva passió i per tant sempre he valorat moltíssim la gent que treballa en la seva vocació. Doncs bé, diria que en una setmana he conegut més gent vocacional que en la resta de la meva vida. Veure com cuidaven el Pol amb aquell amor i delicadesa que només pot neixer d’algú que desenvolupa la seva professió més enllà de la recompensa econòmica sinó perquè és algo que li surt de dins. Tot aquest equip de vocacionals et fa sentir especial, et fa sentir estimat i recolzat. No hem puc oblidar tampoc de la família, els amics i els coneguts que han estat i estan en tot moment donant-nos el seu carinyo i la seva ajuda.

MOLTÍSSIMES GRÀCIES A TOTS I A TOTHOM, SOU FANTÀSTICS I ÚS ESTIMEM MOLT!

POL: Petit Ocellet Lluitador

USB 2.0 VGA from DealExtreme

Reading time: 1 – 2 minutes

Several months ago I bought a video graphics adapter for USB 2.0 port. It’s compatible with Linux, Mac and Windows but for a while I’ve only used it with Windows where it works as a extended screen for my HDMI main display. It works very good with 1920×1080 pixels resolution and it can play videos fast enough using a standalone video player or HTML5 video streaming from the internet.

The chipset used by this product is DISPLAYLINK DL-165 with DVI, HDMI and VGA adapters. It is powered by USB port with 5V DC and 450mA about 2,25W of consumption; but after installing the display driver I lost 2GB of RAM, which in my case it isn’t a problem but sometimes it could be a handicap.

USB 2.0 VGA
USB 2.0 VGA

If you are interested in this product I bought it in DealExtreme webpage, the product page is here and costs 34,28€ with free shipping.

Routerboard CRS125-24G-1S-2HnD-IN (Mikrotik) Cloud Switch

Reading time: 1 – 2 minutes

I bought this product a few weeks ago and finally I can enjoy it at home. With this product you have a firewall, gateway, switch and wireless box with:

  • 25x Gigabit Ethernet ports
  • 1x Fiber channel
  • 3G, 4G or any optional USB modem
  • With RouterOS inside you can manage: gateway, firewall, VPN and ad-hoc switching and routing configurations
  • 1000mW high power 2.4GHz 11n wireless AP
CRS125-24G-1S-2HnD-IN
CRS125-24G-1S-2HnD-IN

The official product page is here where you can find brochure in PDF and other useful information.

If you are looking for a powerful product for your SOHO network this is the solution as I like to say ‘this is one of the best communications servers’. It will be very difficult to find some feature or functionality that you can not get from this product. The product is robust and stable with the flexibility of RouterOS.

Conferència: La revolució dels mini-PC: Raspberry PI, Arduino i més

Reading time: 1 – 2 minutes

Ahir al vespre vaig fer una conferència a la FIB (Facultat d’Informàtica de Barcelona) dins de la UPC (Universitat Politècnica de Catalunya). En aquesta xerra vaig estar explicant què és i en que es diferència Arduino i Raspberry PI. A més de presentar tot un conjunt de solucions alternatives i experiències en el tema.

En aquest enllaç podeu trobar les transparències de:  La revolució dels mini-PC: Raspberry PI, Arduino i més. i el video el teniu disponible al servidor de la FIB.

Ara també teniu disponible el video a youtube:

i podeu veure les transparències des d’aquest mateix post:

Espero els vostres feedbacks als comentaris, desitjo que ús sigui útil.

Qué es para mi la felicidad?

Reading time: 5 – 8 minutes

Entrar en estos conceptos es muy difícil y cada uno puede tener su propia forma de describirlo. Pero en mi caso, me quiero atrever a definir lo que es para mi la felicidad; eso no quiere decir que vaya mañana y lo cambie. Así pues lo más importante que quiero aportar es que para mi la felicidad no es un objetivo sinó un estado, una decisión que un día tome: voy a pasar mi vida en un estado de felicidad. La felicidad nace en mi y la siento dentro de mi. Obviamente hay mil agentes externos que hacen presión para afectar a esa deicisión y ahí es donde entra el trabajo de cultivar la paz interior y el equilibrio entre las cuatro partes que según mi forma de entender la vida forman a todos las personas.

Cuando planteo esto a otra persona a menudo insiste una y otra vez con entender como gestiono la influencia de mil y un elementos externos sobre mi felicidad. No soy ningún gurú, maestro budista, ni siquiera un filósofo. Sólo soy alguien que se atreve a seguir sus creencias día tras dia. Una vez tomada la decisión de vivir en un estado de felicidad lo que hago para que esta no me abanadone es seguir mi vida integrando los siquientes elementos.

És fundamental cultivar la autoestima, hablarse con amor a uno mismo. Yo tengo la tendencia a ser muy perfeccionista y eso desencadena en un lenguaje muy duro y a menudo autodestructivo sobre mi mismo. Pues bien, en mi trabajo para corregir esto de momento ya he conseguido darme cuenta casi el 100% de las veces cuando lo hago y tomar medidas. Lo primero es tomar prespectiva sobre los temas que han provocado ese mensaje tan agresivo sobre mi mismo. Después de este ejercicio me fuerzo a empezar a hablarme con amor y a saber valorar cuales son mis fortalezas, para poder centrarme en mejorar las debilidades y seguir potenciando las cualidades que tengo.

Esta descripción me lleva a hablar de fluir con las emociones, es muy importante no engancharse en los estados de ánimo. Cosa que sabemos hacer todos. Para trabajar este aspecto trabajo mucho la observación de los niños. Observar la capacidad de reir y llorar con todo el sentimiento en segundos de diferencia no esta al habasto de todos. Cuando eres capaz de sentir las emociones con una profundidad extrema pero sin estar enganchado a ellas puedes sumergirte en cada uno de los instantes de la vida sin miedo.

Una de las mejores cosas que tiene la vida es la relación con las otras personas. No puedo hablar por el resto de las personas pero si puedo decir que cuando me pasa algo bueno no puedo evitar tener la necesidad de compartirlo. Para mi la empatia empieza en este punto. Es decir para la mi la empatia es parte de nuestro ser social. Cuando empiezas a relacionarte en los demas y a ver lo importante que es su presencia para nosotros mismos empatizar con ellos es parte del proceso de la relación. Saber fluir a la misma frecuencia que nos estan transmitiendo hace más fácil el disfrute de cada instante. Es evidente que no todos los momentos son alegres, pero también lo es que cuando reflexionas sobre esos momentos te das cuenta de hasta que punto eran necesarios.

El siguiente punto en este trabajo se mezcla con el que le sucede. Es decir no sabría decir con total convicción si primero va el perdón o después la aceptación. Hay instantes en los que estoy convencido de que primero tengo que perdonarme a mi mismo para poder aceptar ciertas partes de mi pero también me ha sucedido que he aceptado alguna acción sin haberla perdonado y después me ha sido muy sencillo perdonarme. Eso me lleva a pensar que quizá ya me había perdonado antes y no me había dado cuenta. En cualquier paso para poder vivir con plenitud cada instante debemos permitirnoslo y a menudo no somos capaces de hacer tal cosa. Cuantas veces hemos estado en un sitio haciendo algo y al mismo tiempo tenemos la cabeza en otra parte. ¿En ese momento nos estamos permitiendo vivir ese instante?

Muchas veces me preguntan como puedes leer un libro sabiendo que tienes otros tantos pendientes. ¿Como sabes que no te has equivocado priorizando ese libro? pues la verdad, no lo sé. Pero tampoco no me importante acepto mi elección y disfruto de ella y si en algún momento me doy cuenta que el resultado que he obtenido no era el que esperaba me perdono. Porqué se que en ese momento lo que hice era lo mejor que podía hacer. Esto me lleva a hablar de la intención positiva, cuando estuié PNL una de las cosas más interioricé es el hecho de buscar donde esta la intención positiva en cada una de las acciones que hago o que se realizan a mi alrededor. Cuando estas totalmente convencido de que detrás de cualquier acción hay una intención positiva, que no siempre tienes porqué compartir, aceptar la acción y perdonar a través de la compasión se hace un acto natural.

Como en cualquier fórmula siempre hay un elemento más escaso que el resto, en mi caso es la asertividad este modelo de conducta no es sencillo de practicar en todos los instantes. Pero es un desafio que acepto y disfruto a diario. La asertividad es una linia de conducta muy fina y sutil situada entre dos extremos muy claros por un lado la agresividad y por el otro la pasividad. Saber defender tus ideas, sentimientos o derechos sin la intención de herir o perjudicar desde la autoconfianza usando una expresión consciente, congruente, clara, directa y equilibrada. Diría que todo esto es un reto difícil de sostener en el tiempo y por eso me emociona y me motiva trabajar para interiorizarlo.

Todos estos puntos cuando los convertimos en tema de una charla con otras personas, siempre me acaban diciendo que no entienden como puedo hablar de todos estos temas y dedicarme a un mundo aparentemente tan frio como el de la tecnología. Pues bien, para mi esto esta relacionado con los objetivos. Vivir el momento y desde en una opción de felicidad es una tarea que para mi sólo tiene sentido en el marco de los objetivos. Cuando hablo de objetivos los aplico a cada una de las areas de mi vida, no sólo a la parte personal y profesional. Sinó a todas. Tener claro cuales son los objetivos y los meta-objetivos de cada uno de los proyectos que desarrollo en las areas de mi vida me ayuda a reforzar la pasión, la motiviació, el compromiso y con el corazón en la mano os puedo decir que sentir la felicidad en cada instante se hace algo natural.

Para cerrar esta reflexión podríamos resumir que vivir los momentos desde una opción de felicidad es la suma de:

Felicidad = autoestima + fluir con las emociones + empatizar + perdonarte + aceptación + intención positiva + asertvidad + objetivos

Recording linux desktop and audio

Reading time: 5 – 8 minutes

I have two full-HD displays as a desktop and I want to record the second one of them while I record mic too. The output format of the record has to be MKV with h264 as video codec and AAC as audio codec.

After some tests with VLC and FFMPEG finally I get the solution with this command:

ffmpeg -f alsa -ac 2 -i default -f x11grab -r 15 -s 1920x1080+0+0 -i :0.0+1920,0 \
       -acodec pcm_s16le -vcodec libx264  -preset ultrafast  -threads 0 -y Test.mkv

when I finish recording the clip I have to convert the audio channel because if I try to convert the audio format while I’m recording the audio channel I have delays or sync problems with video channel.

ffmpeg -i Test.mkv -map 0:0 -map 0:1 \
       -c:v copy \
       -c:a:1 libfdk_aac -profile:a aac_he_v2 -b:a:1 96k \
       output.mkv

Hello World using ‘kombu’ library and python

Reading time: 62 – 103 minutes

Some times schemas and snippets don’t need large descriptions. If you think this is not enough in this case tell me and I’m going to add explanations.

Using a python library called kombu as an abstraction to talk with AMQP broker we are going to develop different message routes setting each type of Exchange. As a backend I used RabbitMQ with default configuration.

AMQP schema using an exchange of type direct

kombu-direct

Queue definition:

from kombu import Exchange, Queue

task_exchange = Exchange("msgs", type="direct")
queue_msg_1 = Queue("messages_1", task_exchange, routing_key = 'message_1')
queue_msg_2 = Queue("messages_2", task_exchange, routing_key = 'message_2')

The producer:

from __future__ import with_statement
from queues import task_exchange

from kombu.common import maybe_declare
from kombu.pools import producers


if __name__ == "__main__":
    from kombu import BrokerConnection

    connection = BrokerConnection("amqp://guest:guest@localhost:5672//")

    with producers[connection].acquire(block=True) as producer:
        maybe_declare(task_exchange, producer.channel)
        
        payload = {"type": "handshake", "content": "hello #1"}
        producer.publish(payload, exchange = 'msgs', serializer="pickle", routing_key = 'message_1')
        
        payload = {"type": "handshake", "content": "hello #2"}
        producer.publish(payload, exchange = 'msgs', serializer="pickle", routing_key = 'message_2')

One consumer:

from queues import queue_msg_1
from kombu.mixins import ConsumerMixin

class C(ConsumerMixin):
    def __init__(self, connection):
        self.connection = connection
        return
    
    def get_consumers(self, Consumer, channel):
        return [Consumer( queue_msg_1, callbacks = [ self.on_message ])]
    
    def on_message(self, body, message):
        print ("RECEIVED MSG - body: %r" % (body,))
        print ("RECEIVED MSG - message: %r" % (message,))
        message.ack()
        return
    

if __name__ == "__main__":
    from kombu import BrokerConnection
    from kombu.utils.debug import setup_logging
    
    setup_logging(loglevel="DEBUG")

    with BrokerConnection("amqp://guest:guest@localhost:5672//") as connection:
        try:
            C(connection).run()
        except KeyboardInterrupt:
            print("bye bye")


AMQP schema using an exchange of type fanout

kombu-fanout

Queue definition:

from kombu import Exchange, Queue

task_exchange = Exchange("ce", type="fanout")
queue_events_db = Queue("events.db", task_exchange)
queue_events_notify = Queue("events.notify", task_exchange)


The producer:

from __future__ import with_statement
from queues import task_exchange

from kombu.common import maybe_declare
from kombu.pools import producers


if __name__ == "__main__":
    from kombu import BrokerConnection

    connection = BrokerConnection("amqp://guest:guest@localhost:5672//")

    with producers[connection].acquire(block=True) as producer:
        maybe_declare(task_exchange, producer.channel)
        
        payload = {"operation": "create", "content": "the object"}
        producer.publish(payload, exchange = 'ce', serializer="pickle", routing_key = 'user.write')

        payload = {"operation": "update", "content": "updated fields", "id": "id of the object"}
        producer.publish(payload, exchange = 'ce', serializer="pickle", routing_key = 'user.write')

One consumer:

from queues import queue_events_db
from kombu.mixins import ConsumerMixin

class C(ConsumerMixin):
    def __init__(self, connection):
        self.connection = connection
        return
    
    def get_consumers(self, Consumer, channel):
        return [Consumer( queue_events_db, callbacks = [self.on_message])]
    
    def on_message(self, body, message):
        print ("save_db: RECEIVED MSG - body: %r" % (body,))
        print ("save_db: RECEIVED MSG - message: %r" % (message,))
        message.ack()
        return


if __name__ == "__main__":
    from kombu import BrokerConnection
    from kombu.utils.debug import setup_logging
    
    setup_logging(loglevel="DEBUG")

    with BrokerConnection("amqp://guest:guest@localhost:5672//") as connection:
        try:
            C(connection).run()
        except KeyboardInterrupt:
            print("bye bye")


AMQP schema using an exchange of type topic

kombu-topic

Queue definition:

from kombu import Exchange, Queue

task_exchange = Exchange("user", type="topic")
queue_user_write = Queue("user.write", task_exchange, routing_key = 'user.write')
queue_user_read = Queue("user.read", task_exchange, routing_key = 'user.read')
queue_notify = Queue("notify", task_exchange, routing_key = 'user.#')


The producer:

from __future__ import with_statement
from queues import task_exchange

from kombu.common import maybe_declare
from kombu.pools import producers


if __name__ == "__main__":
    from kombu import BrokerConnection

    connection = BrokerConnection("amqp://guest:guest@localhost:5672//")

    with producers[connection].acquire(block=True) as producer:
        maybe_declare(task_exchange, producer.channel)
        
        payload = {"operation": "create", "content": "the object"}
        producer.publish(payload, exchange = 'user', serializer="pickle", routing_key = 'user.write')

        payload = {"operation": "update", "content": "updated fields", "id": "id of the object"}
        producer.publish(payload, exchange = 'user', serializer="pickle", routing_key = 'user.write')

        payload = {"operation": "delete", "id": "id of the object"}
        producer.publish(payload, exchange = 'user', serializer="pickle", routing_key = 'user.write')

        payload = {"operation": "read", "id": "id of the object"}
        producer.publish(payload, exchange = 'user', serializer="pickle", routing_key = 'user.read')

One consumer:

from queues import queue_events_db
from kombu.mixins import ConsumerMixin

class C(ConsumerMixin):
    def __init__(self, connection):
        self.connection = connection
        return
    
    def get_consumers(self, Consumer, channel):
        return [Consumer( queue_events_db, callbacks = [self.on_message])]
    
    def on_message(self, body, message):
        print ("save_db: RECEIVED MSG - body: %r" % (body,))
        print ("save_db: RECEIVED MSG - message: %r" % (message,))
        message.ack()
        return


if __name__ == "__main__":
    from kombu import BrokerConnection
    from kombu.utils.debug import setup_logging
    
    setup_logging(loglevel="DEBUG")

    with BrokerConnection("amqp://guest:guest@localhost:5672//") as connection:
        try:
            C(connection).run()
        except KeyboardInterrupt:
            print("bye bye")


Simple queues

Kombu implements SimpleQueue and SimpleBuffer as simple solution for queues with exchange of type ‘direct’, with the same exchange name, routing key and queue name.

Pusher:

from kombu import BrokerConnection

connection = BrokerConnection("amqp://guest:guest@localhost:5672//")
queue = connection.SimpleQueue("logs")

payload = { "severity":"info", "message":"this is just a log", "ts":"2013/09/30T15:10:23" }
queue.put(payload, serializer='pickle')

queue.close()

Getter:

from kombu import BrokerConnection
from Queue import  Empty

connection = BrokerConnection("amqp://guest:guest@localhost:5672//")

queue = connection.SimpleQueue("logs")

while 1:
    try:
        message = queue.get(block=True, timeout=1)
        print message.payload
        message.ack()
    except Empty:
        pass
    except KeyboardInterrupt:
        break
    print message

queue.close()

The files

Download all example files: kombu-tests.tar.gz

Server send push notifications to client browser without polling

Reading time: 35 – 58 minutes

Nowadays last version of browsers support websockets and it’s a good a idea to use them to connect to server a permanent channel and receive push notifications from server. In this case I’m going to use Mosquitto (MQTT) server behind lighttpd with mod_websocket as notifications server. Mosquitto is a lightweight MQTT server programmed in C and very easy to set up. The best advantage to use MQTT is the possibility to create publish/subscriber queues and it’s very useful when you want to have more than one notification channel. As is usual in pub/sub services we can subscribe the client to a well-defined topic or we can use a pattern to subscribe to more than one topic. If you’re not familiarized with MQTT now it’s the best moment to read a little bit about because that interesting protocol. It’s not the purpose of this post to explain MQTT basics.

A few weeks ago I set up the next architecture just for testing that idea:

mqtt_schema
weboscket gateway to mosquitto mqtt server with javascrit mqtt client

The browser

Now it’s time to explain this proof of concept. HTML page will contain a simple Javascript code which calls mqttws31.js library from Paho. This Javascript code will connect to the server using secure websockets. It doesn’t have any other security measure for a while may be in next posts I’ll explain some interesting ideas to authenticate the websocket. At the end of the post you can download all source code and configuration files. But now it’s time to understand the most important parts of the client code.

client = new Messaging.Client("ns.example.tld", 443, "unique_client_id");
client.onConnectionLost = onConnectionLost;
client.onMessageArrived = onMessageArrived;
client.connect({onSuccess:onConnect, onFailure:onFailure, useSSL:true});

Last part is very simple, the client connects to the server and links some callbacks to defined functions. Pay attention to ‘useSSL’ connect option is used to force SSL connection with the server.

There are two specially interesting functions linked to callbacks, the first one is:

function onConnect() {
  client.subscribe("/news/+/sport", {qos:1,onSuccess:onSubscribe,onFailure:onSubscribeFailure});
}

As you can imagine this callback will be called when the connections is established, when it happens the client subscribes to all channels called ‘/news/+/sports’, for example, ‘/news/europe/sports/’ or ‘/news/usa/sports/’, etc. We can also use, something like ‘/news/#’ and it will say we want to subscribe to all channels which starts with ‘/news/’. If only want to subscribe to one channel put the full name of the channel on that parameter. Next parameter are dictionary with quality of service which is going to use and links two more callbacks.

The second interesting function to understand is:

function onMessageArrived(message) {
  console.log("onMessageArrived:"+message.payloadString);
};

It’s called when new message is received from the server and in this example, the message is printed in console with log method.

The server

I used an Ubuntu 12.04 server with next extra repositories:

# lighttpd + mod_webserver
deb http://ppa.launchpad.net/roger.light/ppa/ubuntu precise main
deb-src http://ppa.launchpad.net/roger.light/ppa/ubuntu precise main

# mosquitto
deb http://ppa.launchpad.net/mosquitto-dev/mosquitto-ppa/ubuntu precise main
deb-src http://ppa.launchpad.net/mosquitto-dev/mosquitto-ppa/ubuntu precise main

With these new repositories you can install required packages:

apt-get install lighttpd lighttpd-mod-websocket mosquitto mosquitto-clients

After installation it’s very easy to run mosquitto in test mode, use a console for that and write the command: mosquitto, we have to see something like this:

# mosquitto
1379873664: mosquitto version 1.2.1 (build date 2013-09-19 22:18:02+0000) starting
1379873664: Using default config.
1379873664: Opening ipv4 listen socket on port 1883.
1379873664: Opening ipv6 listen socket on port 1883.

The configuration file for lighttpd in testing is:

server.modules = (
        "mod_websocket",
)

websocket.server = (
        "/mqtt" => ( 
                "host" => "127.0.0.1",
                "port" => "1883",
                "type" => "bin",
                "subproto" => "mqttv3.1"
        ),
)

server.document-root        = "/var/www"
server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
server.errorlog             = "/var/log/lighttpd/error.log"
server.pid-file             = "/var/run/lighttpd.pid"
server.username             = "www-data"
server.groupname            = "www-data"
server.port                 = 80

$SERVER["socket"] == ":443" {
    ssl.engine = "enable" 
    ssl.pemfile = "/etc/lighttpd/certs/sample-certificate.pem" 
    server.name = "ns.example.tld"
}

Remember to change ‘ssl.pemfile’ for your real certificate file and ‘server.name’ for your real server name. Then restart the lighttpd and validate SSL configuration using something like:

openssl s_client -host ns.example.tld -port 443

You have to see SSL negotiation and then you can try to send HTTP commands, for example: “GET / HTTP/1.0” or something like this. Now the server is ready.

The Test

Now you have to load the HTML test page in your browser and validate how the connections is getting the server and then how the mosquitto console says how it receives the connection. Of course, you can modify the Javascript code to print more log information and follow how the client is connected to MQTT server and how it is subscribed to the topic pattern.

If you want to publish something in MQTT server we could use the CLI, with a command mosquitto_pub:

mosquitto_pub -h ns.example.tld -t '/news/europe/sport' -m 'this is the message about european sports'

Take a look in your browser Javascript consle you have to see how the client prints the message on it. If it fails, review the steps and debug each one to solve the problem. If you need help leave me a message. Of course, you can use many different ways to publish messages, for example, you could use python code to publish messages in MQTT server. In the same way you could subscribe not only browsers to topics, for example, you could subscribe a python code:

import mosquitto

def on_connect(mosq, obj, rc):
    print("rc: "+str(rc))

def on_message(mosq, obj, msg):
    print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))

def on_publish(mosq, obj, mid):
    print("mid: "+str(mid))

def on_subscribe(mosq, obj, mid, granted_qos):
    print("Subscribed: "+str(mid)+" "+str(granted_qos))

def on_log(mosq, obj, level, string):
    print(string)

mqttc = mosquitto.Mosquitto("the_client_id")
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_subscribe = on_subscribe

mqttc.connect("ns.example.tld", 1883, 60)
mqttc.subscribe("/news/+/sport", 0)

rc = 0
while rc == 0:
    rc = mqttc.loop()

Pay attention to server port, it isn’t the ‘https’ port (443/tcp) because now the code is using a real MQTT client. The websocket gateway isn’t needed.

The files

  • mqtt.tar.gz – inside this tar.gz you can find all referenced files

Home heating using Panstamp (Arduino + TI C1101) and SSR

Reading time: 3 – 5 minutes

Last weekend I worked on setting up home heaters using Panstamp. Panstamp is an Arduino board with Texas Instruments radio. Next winter we’re going to control our home heater using connected internet devices like the laptop, tablet o mobile phones. In this post I only want to share some pictures about the process to install the electronics inside the heaters changing the old electronic boards with new custom ones.

The parts:

  • AC/DC transformer, outputs 5V. It’s really cheap, in this case free because I have more than 20 of them from old projects.

acdc5v_

  • A small custom PCB designed and made by Daniel Berenguer, the owner of Panstamp. Thanks again Daniel. I bought the PCBs and parts for around 10€ each one.

IMG_20130923_114830

  • TMP36 temperature sensor. It costs about 1,5€ each one.

IMG_20130923_114814

  • Solid state relay (SSR) bought in Alied Express web site for less than 5€.

ssr

The process:

I used a lot of tools, because DIY aren’t my strong hability.

IMG_20130921_141640

Double-head tape and hot-blue gun are need…

IMG_20130921_133746

because I want to use a cork base under the PSU and PCB

IMG_20130921_133723Parallelization of the last process
IMG_20130921_143116Using a cutter I got the units
IMG_20130921_143434SSR setup
IMG_20130921_164651connecting SSR, PCB and PSU
IMG_20130921_170711assembling everything on heater side panel
IMG_20130921_173937finally, mounting side panel on the heater
IMG_20130921_133547

Next weeks, I’ll come back with this subject to talk about the software part.

How to get MP3 file from a WebM video

Reading time: 6 – 10 minutes

Another title for this post could be: “Getting audio from video clips”. Because you could do it with MP4 (Mpeg4), WebM, Mov, FLV, etc. We are going to use ffmpeg to that:

ffmpeg -i input_file.webm -ab 128k -ar 44100 out_file.mp3

The meaning of the parameters:

  • ab: the audio bitrate in bps
  • ar: the audio sample rate in hz

And if you have a directory with a lot of files to convert you could use:

find . -name "*.webm" -print0 |while read -d

Pay attention to “find” and “while read” commands combinations because we want to support files with spaces.

I hope this is as useful for you as for me.

\0' file; do ffmpeg -i "$file" -ab 128k -ar 44100 -y "${file%.webm}.mp3";done

Pay attention to “find” and “while read” commands combinations because we want to support files with spaces.

I hope this is as useful for you as for me.

Scroll to Top