Mi problema es que no veo el problema

El otro día conversaba con varios amigos sobre un país que había tomado bajo su control territorio de un país vecino como represalia después que un ciudadano del país invadido había cruzado la frontera y asesinado a otro ciudadano del país invasor. Alguien condenó la incursión militar y alguien más dijo que no hay que olvidarse que el país “que ahora es la víctima” fue el que inició todo cuando produjo el primer muerto y que la violencia viene de los dos lados. Algunos más, al unísono de “no seas bestia”, apresuraron su explicación de la desproporción de las represalias y que cuando la dimensión es tan desmesurada como en estos casos, 1 muerto en un bando y 20 mil en el otro, no puedes decir que la violencia viene de ambos lados en el mismo contexto y es comparable.

Al siguiente día, alguien comentó sobre una mujer que le había pegado a un hombre y concluyó que la violencia de género va en los dos sentidos. Todos estuvimos de acuerdo, aunque a ninguno de nosotros nos había pegado nuestra novia o esposa.

Así mismo, otro día, un amigo preguntó si habíamos leído esa noticia en la que se presumía la posible inocencia de un dirigente del fútbol nacional en la red de corrupción de la FIFA. La primera respuesta fue que con solo leer el título uno ya se daba cuenta de que eso no tenía pies ni cabeza así que no había si quiera considerado la posibilidad de leer la nota periodística. Además, agregó, que el título era suficiente para suponer la complicidad del periodista con el presunto inocente dirigente deportivo.

Un poco más tarde alguien preguntó si habían leído esa noticia sobre un grupo que quiere legalizar el aborto para los hombres en otro país. Todos pedimos el enlace a la noticia porque parecía la promoción de un derecho justo aunque ninguno de nosotros había estado embarazado alguna vez.

Y hace poco, en la última conversación, un amigo se mostraba indignado porque notó que otro hombre de su trabajo le había visto de una forma que él sospechaba escondía un velo romántico. Luego advirtió, que si eso volvía a pasar, le “iba a moler a puñetes“, decisión que fue respaldada por varias y varios de los atentos interlocutores, porque uno puede ser lo que le de la gana en su metro cuadrado y ese metro cuadraro es el límite que todos debemos respetar.

En la misma conversación, una amiga contó que un hombre de su trabajo le había tocado la pierna mientras le celebraba una broma y que estaba pensando en poner una queja en recursos humanos. Casi todos nos quedamos en silencio porque no parecía para tanto e igual nosotros hacemos eso todos los días. El único que habló, dijo que le baje a esa nota del feminismo porque le está convirtiendo en una paranóica hipersensible“.

Estas conversaciones me hicieron preguntarme, ¿cómo es que podemos darnos cuenta de lo que está mal en el argumento de un problema al otro lado del mundo y no podemos distinguir la misma falla en un problema que afecta a la mitad de las personas con las que interactuamos todos los días?, ¿cómo nos es tan sencillo divisar una falacia a kilómetros de distancia en un evento externo a nuestras labores diarias y se nos pasa otra en algo que involucra procesos biológicos que los tenemos o no y son parte de nuestra vida? ¿cómo podemos ser solidarios con una sospecha e indiferentes, incluso prejuiciosos, de un hecho?

Mi respuesta es que soy un hombre que no conoce de los problemas que existen entorno al género y la discriminación sistemática que ejercemos día a día, pero que debería conocer. Y esto requiere que dedique tiempo para educarme en el tema, y no de una forma superficial, como la política internacional; si no al menos a un nivel intermedio que me permita reconocer que hay discriminación por el género en nuestra sociedad, siendo experto el nivel ideal, como en el fútbol; para que pueda escuchar con atención y empatizar con las mujeres, feministas o no, que hablan de los problemas generados por el sexismo en nuestro entorno y que ellas soportan día a día, y, llegar a ser un aliado en esta lucha que mantiene la otra mitad de la humanidad por entregarnos un mundo más justo y menos violento a TODOS.

Test driving Enigmail’s permanent decryption function

Last few weeks my teammates and I have been writing some code for the Enigmail project  and experienced first-hand perks and quirks of  the Mozilla Thunderbird platform. More on the work we did there is here: Lessons learned working on Enigmail.

During the time we spent doing this we found that a few basic things you would do with an email are not so obvious and finding an example to guide your way is not a trivial exercise. This post is to share with you a few things we learned after expending some time reading docs, source code and discussions threads which enabled us to test drive our code.

Decrypting permanently.

The EnigmailDecryptPermanently.jsm is file in charge of copying/moving an encrypted email message. The copied/moved email message will be decrypted and stored permanently in the target email folder while the original might remain in the source folder or might be deleted depending if it’s a copy or a move.

Arranging the test scenario.

To test an email message has been decrypted permanently we need the email message in an email folder, the Enigmail extension ready to take over the control of the moving and a PGP implementation to do the actual decrypting work.

We will begin by setting the path to PGP implementation, which in our case is the Gnu Privacy Gard set of tools. In order to run this test it is assumed you have this piece of software installed, something we provision as soon as the development machine starts.

After some directory and files work you configure pinentry and set a development GNUPGHOME so you don’t modify the real one when running the test. More details can be found in the withTestGpgHome function within this test helper.

var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"]
.createInstance(Components.interfaces.nsIConverterOutputStream);
converter.init(foStream, "UTF-8", 0, 0);
converter.writeString("pinentry-program "+do_get_cwd().path+"/pinentry-auto");
converter.close();

var environment = Components.classes["@mozilla.org/process/environment;1"]
.getService(Components.interfaces.nsIEnvironment);
environment.set("GNUPGHOME", workingDirectory.path);

Then the setup of the Enigmail extension consists of the initialization of the Enigmail service and making it available for the the test scope, which is done in the withEnigmail function in the same test helper.

const enigmail = Components.classes["@mozdev.org/enigmail/enigmail;1"]
.createInstance(Components.interfaces.nsIEnigmail);
const window = JSUnit.createStubWindow();
enigmail.initialize(window, "");

Finally, when you build an extension for Thunderbird an email message is something you’ll  see a lot. And to be able to test things your extension does on an email message you will need to be able to stub it.

Stub an email message.

An email message, within the Thunderbird space, is a record inside a nsIMsgDatabase. The way to access the message’s database is through a nsIMsgLocalMailFolder which is one of the many email folders you may have in your root messages folder. This root folder is associated to an account.

Let’s begin by creating the account and associating an identity to it, so we get ready the scaffolding for any work with messages.

let localAccount = MailServices.accounts
.FindAccountForServer(MailServices.accounts.localFoldersServer);
let identity = MailServices.accounts.createIdentity();
identity.email = "tester@enigmail.org";
localAccount.addIdentity(identity);
localAccount.defaultIdentity = identity;

MailServices is just an entry point to many services around accounts, messages, and more.

Next, we need to create an email folder in the root folder

MailHelper.incomingServer = MailServices.accounts.localFoldersServer;
MailHelper.rootFolder = MailHelper.incomingServer.rootMsgFolder;
let localRoot = MailHelper.rootFolder
.QueryInterface(Components.interfaces.nsIMsgLocalMailFolder);
let mailFolder = localRoot.createLocalSubfolder(name);
mailFolder.setFlag(Components.interfaces.nsMsgFolderFlags.Mail);

And were ready to copy a message from a file to the email folder. do_get_file is one of the utilities available in the Mozilla JSUnit extension.

let emailFile = do_get_file(emailFilePath, false);
MailServices.copy
.CopyFileMessage(emailFile, mailFolder, null, false, 0, null, null, null);

Then, you are ready to retrieve the email message and check your extension does what it’s meant to. When you retrieve the message, you don’t get the actual message but a nsIMsgDBHdr which contains basic information like headers and and id information. As you would expect, the message header is accessed through the messages database.

let msgDb = mailFolder.msgDatabase;
let enumerator = msgDb.EnumerateMessages();
let header = enumerator.getNext()
.QueryInterface(Components.interfaces.nsIMsgDBHdr);

Here are some utilities functions where you can see all this code in context.

Acting on the permanent decryption function.

The decrypt permanently function receives as parameters an array of the headers for the messages to move, the URI for the email folder you want the messages to end up, a boolean describing if you want to copy or move and a flag to specify if you want this function to behave synchronously or asynchronously.

const header = MailHelper.fetchFirstMessageHeaderIn(sourceFolder);
const targetFolder = MailHelper.createMailFolder("target-box");
const move = true;
const reqSync = true;
EnigmailDecryptPermanently.dispatchMessages([header], targetFolder.URI, move, reqSync);

Asserting on the content of the message header.

To verify the result produced by the permanent decryption function we need to access the message from the only information we have available: the header of the dispatched message. In order to do this we use the MsgHrdToMimeMessage and pass as the callback the assertion function. Also notice, that due to the callback function we need to use the do_test_pending and do test_finished pair of function to synchronize the assertion.

const dispatchedHeader = MailHelper.fetchFirstMessageHeaderIn(targetFolder);
do_test_pending();
msgHdrToMimeMessage(
dispatchedHeader,
null,
function(header, mime) {
Assert.ok(!mime.isEncrypted);
Assert.assertContains(mime.parts[0].body, "This is encrypted");
do_test_finished();
},
false
);

And this is it. You can see how this test looks by browsing to the messageIsMovedAndDecrypted() function in the decryptPermanently-test.js file.

 

El anonimato en la web

Hace pocos días el diario El Comercio en su versión en línea publicó una artículo sobre lo que se esconde en el “más del 90% de información a la cual los buscadores no acceden fácilmente” bajo el título “El usuario común solo accede al 4% de la web”. Y, a pesar de que el título hace una afirmación referente al porcentaje de contenido al que “el usuario común” puede acceder, la idea principal se basa en una hipótesis que “en los últimos años ha tomado fuerza” la cual afirma que “menos del 5% de lo que hay en el Internet está al alcance del usuario común” y relaciona a quien decide mantenerse anónimo mientras visita la web con miembros de “foros especializados para piratas informáticos, vendedores de drogas y de armas, sicarios profesion[al]es, pederastras y agencias gubernamentales”.
Relacionar el anonimato en la red con la actividad fuera de la ley es por decir lo menos una idea equivocada. Idea que muchas veces es motivada por la errónea impresión de que en la vida fuera de la red todos sabemos quienes son las personas que están a nuestro al rededor todo el tiempo. Pero no es así.
En el mundo material caminamos por la calle sin saber quienes, ocupados en sus asuntos, transitan cerca a nosotros. Solamente conocemos los nombres más ciertos datos y hechos personales de quienes frecuentan los mismos lugares que nosotros, como la escuela y el trabajo. Nadie porta un gafete para identificarse todo el tiempo y nadie lleva un registro de todos y cada uno de los sitios que visitamos. De la misma forma, en el mundo digital no conocemos la identidad de quienes nos rodean y nos son familiares solamente quienes frecuentan con nosotros los mismos grupos de discusión o son miembros de la misma red social. Y, solo cuando decidimos identificarnos, con un usuario y una contraseña generalmente, es cuando nos colocamos un gafete y permitimos que se registre cada paso que damos.
Una forma, entonces, para evitar el apresurarse en establecer relaciones comprometedoras de una forma tan ligera es asegurarse que realmente comprendemos el paralelo que trazamos entre el mundo material y el mundo digital. Otra, es identificar e investigar los conceptos a los que nos referimos ya que después de todo el 4% del contenido al que tenemos acceso está lleno de referencias, como por ejemplo al anonimato en la web.
Dicho sea de paso, el entender que es nuestra decisión el entregar nuestros datos informativos y de contacto , que tenemos el derecho a preguntar cual es el fin que persigue el destinatario de tan preciosa información y demandar ciertas garantías (como que no vendan nuestro correo electrónico a empresas de publicidad), no es prueba de nuestra dudosa integridad ética y moral. Por el contrario es mostrar que estamos concientes de que el mundo digital es también un mundo peligroso y no debe ser tomado a la ligera.
Pero no todo es malo en el artículo escrito por “Redacción Tendencias (I)”. La mención al navegador Tor, desarrollado “específicamente para mantener el anonimato del usuario”, que tiene la capacidad de recorrer el internet sin que nuestra visita sea registrada y analizada exhaustivamente por quien provee servicios de búsqueda o de acceso a la red.
Pero no solo el anonimato está comprometido en la red. La privacidad, de nuestras conversaciones por cualquier canal, también son potenciales blancos para ataques que vienen de todos los flancos. Afortunadamente Tor no está solo en su esfuerzo por defender el anonimato del usuario común y también exiten otras herramientas para proteger nuestra privacidad. Los fines de estas herramientas son varios pero las más comunes nos permiten enviar mensajes por correo electrónico de manera que se pueda leer solamente por el destinatario del mensaje, opciones con similares características existen para mensajería instantánea, mensajería por el teléfono celular[5] e incluso video conferencias[6].
En conclusión, existen las herramientas para defender nuestro derecho a permitir el acceso a nuestra identidad y privacidad, en la cantidad que consideramos adecuada y a quien confiamos dará el uso correcto de la misma. Queda pendiente para cada individuo decidir ejercerlo.

Securing agile

Long ago, we thought quality should be controlled at the end of a process. Then agile came along and showed us quality needs to be assured at every step we take in the way to reach a goal. Today security, as it faces the same challenges, will try to follow the same path.

Following this path means a couple of things. First, security is one of the forces, together with user design, systems design, evolutive architecture, quality assurance and more, that pushes the agile process to achieve business value for our customers that will perdure.

Second, as a consequence of the first, security should be part of every part of the value delivery process. Inceptions should identify security concerns which might be threatening what the stakeholders have agreed on as business value. Iteration planning and “tres amigos” sessions should identify the stories and points in the stories where we might be dealing with sensitive information and include acceptance criteria accordingly. Developers should use a minimum of techniques to make sure code does not have naive cracks which could have been caught with static analyzes tools, and, implement security measures to validate back doors have not been planted by other developers. Tests to automate what’s possible should be mostly welcome.

Learning objectives
Security basics.
Threat model.
Apply a threat model to the agile process.

Decoding the role of coach

A year ago I was asked to coach someone in the office. My first reaction was to run away! I was overwhelmed at the thought of being responsible for someone’s development and career even though I was promised the support needed and that it was going to be a great learning opportunity for me too. I eventually accepted the challenge and today I’m delighted with that decision.

The first round of support came a few months ago when Jennifer Mounce visited the ThoughtWorks Quito office and  ran a great coaching workshop along with Marcelo Oliveira. The goal of the workshop was to introduce us to “coaching” and to provide some guidelines on how to become a good coach. The workshop attendees were current and as well as potential coaches.

It wouldn’t be fair if I didn’t share  a bit of my experience after one year of coaching a fantastic developer.

Coaching and mentoring – what’s in a name?

Coaching is helping a person explore what they want experience on. It’s their path, not yours. Coaching, when done right, should feel very close to the rubber duck problem solving technique. As a coach, your role is to ask questions but not necessarily to give answers. If you don’t talk at all and the coachee herself is asking the questions, providing those answers and discovering the path to master whatever she set to master, then you are doing fantastic!

Mentoring is when you share your experience and provide guidance. A mentor narrates his journey and explains the choices he made along the way and provides insight on the lessons learned from mistakes. The mentoree should be comfortable enough with the subject to understand why that path could be ideal for the mentoree’s journey and where to tweak it if at all; or maybe even understand why that’s not the path he should take. Book recommendations are welcome from a mentor.

This is an important difference to understand when you are looking for someone to help you to reach your goal. There are other roles – like when you want someone to help you navigate a tool or technique, what you have in mind is a trainer; and if you want someone to advocate for you, well, that’s a sponsor.

Differentiating across these roles doesn’t mean, you must choose to be only one of these people. You could be a coach who knows about the tools your coachee needs to learn. You might switch hats from coach to trainer and back, as needed by your coachee. Ensure that you both understand which hat you’re wearing at any given time. Just make sure you can perform both roles at the same time and still get high fives.

Making the differentiation as a coachee side, is not to say you must choose only one of them or you should have one of each kind. You may train on the new shiny tool with your trainer in the morning and discuss your way to the top with your mentor that very afternoon. All you need to do is to make sure you make enough time for all the commitments.

I remember once my coachee, while we were exploring the basics of programming, mentioned the hard time she was having with an API design book she had been recommended by her teammates. At that point it was hard for me to go from for loops to RESTful API design just using questions so I switched hats and explained the steps we had left before we jumped into API design.

Becoming a coach.

You don’t need to be an expert on the subject to become a coach but you need to be a good listener. Coaching has a lot more to do with having the skills to let someone make a mistake and help them realize what are the lessons to be learnt than it has to do with sharing your experience and the lessons you’ve learned to help someone avoid mistakes.

When I started coaching I didn’t realise that I should be aware of the weakness and strengths of my coaching skills. I wasn’t asking many questions and suggesting solutions; this is actually training. At the end, it all worked out fine because my coachee is awesome. Prior to  engaging in a coaching relationship, I strongly recommend doing a self assessment. I’ve tried Gallup’s strengthsfinder and worked very well for me, but you can find many others on the web.

Once you’ve assessed yourself, you should identify your starting point and determine what you need to work on. This does not mean you can’t begin coaching until you have developed your skills to a point you feel comfortable with; you can improve as you coach.coaching-life-cycle

Coaching, like many things in life, has a cycle: first, you start coaching otherwise you can never call yourself a coach. Right after that you extend yourself – you read, you practice new things you learn and improve them a little by little. Then you help others grow and develop, which is fantastic. I bet you would like to do that forever but you must go back to growing yourself. You learn with every experience, your horizons grow and you further develop your skills. This in turn helps you coach more effectively the next time around. Finally you become a coaching guru and the cycle is complete!

Getting started.

A basic requirement as a coach is to be able to have an interpersonal relationship with the person you are coaching. An environment of trust is also essential so that you can talk about with ease.

Something that helps a lot and should be done during the first session to build trust and protect confidentiality is to arrive at rules or guidelines and set expectations.  The duration of the coaching relationship should be established so that you can track success.

Extending yourself and growing others.

Extending yourself is quite difficult: it means listening to people without interruption and judgment. It means listening not so that you can respond but listening so you understand the problem. Do you remember the rubber duck? Recall how much he listens and how much he talks? His secret is that he isn’t afraid of silence. If the coachee stops talking, you should not try to fill in the void and wait for her to resume talking.

If you must speak, be curious about the root cause of the problem. Ask as many questions as you need to get to the root of the problem. Exploring is a precious skill. Remember a coach doesn’t give solutions or pass judgements. You may see your coachee walking down a death path and you will have to resist the urge to save her. Ask questions to help the coachee see where this is heading and as a last resource you can ask for permission to wear the advisor or mentor hat so that you can intervene.

Asking many questions provides a foundation to build on. Keeping track of a lot of information is hard. A simple thing I do is to keep notes as the conversation develops. Doodling as the discussion progresses is a nice record of the conversation. I always like to have some breadcrumbs to follow so that we can change track as necessary.

All this listening is so you can set your coachee into motion. This ability to convert thoughts into  actions makes your coachee grow. Progress is a crucial aspect to maintaining enthusiasm and motivation. We all like the things we are good at and we are good at the things we practice. To keep the coachee on track, you should be able to set SMART goals which have intermediate goals along the way so the coachee can see accomplishments every now and then.

And when those goals are reached: celebrate! Encourage your coachee regularly. Acknowledge the coachee’s effort and wins. Again, celebrate them. Not all goals will be achieved at first attempt and not all challenges will be overcome. Identify the right time to say “you can do it” but also make defeat a teacher for both the coach and the coachee. Retrospect on mistakes and retry. Walk the walk side by side.

A coaching guru.

As I write this, I have no idea how many times it is necessary to oscillate between extending yourself and growing others before you are able to break the loop and be promoted to a coaching guru. If I ever do, I will let you know. Meanwhile keep improving!

 

Three tips for easier remoting

After a few months now working from a remote location these three  things we have come up with might be worth sharing.

At design time.

Engaging into a design session with the BAs, customers or whoever is the subject matter expert is vital. Those sessions are the ones that will set the tone and common vocabulary for the feature in development. But this activity proves itself difficult when each side is in different locations and drawing over a board is not an option.

Here a tool that allows you to work collaboratively on real time with a learning curve no more than a couple of minutes is crucial. For us this tool end up being http://yuml.me/diagram/scruffy/class/draw as it made possible to write the UML we needed to convey our model by having each side to access the same URL with edit privileges.

At pair-coding time.

Another vital activity is to have successful pairing sessions with your coding peer. This is even harder as you will need to code over the same base at the same time through a video conference or a remote-coding IDE. Because of some restrictions in our project we were left with the first option.

As a first approach we took time boxed turns (begun with 5’ and then increased to 10’), which revealed connections and rendering delays to be our most fierceful foes. We ended with a half coded idea which never materialized as code because we were waiting for stuff to be ready so we could type again.

Moving to a “strict” ping – pong was a great relief. By each solving the pair’s just written test and talking about it, and then, writing another test while explaining what the point of it is catalysed a higher quality communication throughput that reduced the amount of code needed to grow the feature.

At stand up time.

All the equipments and tools your team is provided with so you can work remotely have one goal: trick your brain that we are all in the same room. This is so you can ease the  growing of a relationship with the people you work all day every and build a safe environment where team members feel encouraged to make and ask questions, ask and provide help, discuss problems, etc., so you reduce the problems due to miscommunication.

So, next time you are sitting in your chair in a remote location and join the stand up conference, turn the camera on! So your peers can put a face to your voice.

La tecnología toma y la ciudad devuelve.

En la ciudad de Quito en los últimos años el municipio ha luchado por ejercer su poder regulatorio en el ámbito del transporte, sobre los gremios y asociaciones de taxis irregulares, de forma que el impacto en las asociaciones legalmente establecidas sea reducido. Este esfuerzo podría ser vano e inútil con la adhesión de la sociedad, que utiliza este servicio de transporte en la ciudad, a sistemas de localización de taxis mediante pequeñas aplicaciones instaladas en los teléfonos con acceso a la internet.

El poder de regular.

Originalmente, es el municipio el ente con la facultad de regular los gremios y asociaciones de automotores que prestan su servicio como taxis en Quito. Este ente determina que cooperativas están autorizadas a operar, y además, intenta llevar control sobre el número de unidades que recorren las calles de la ciudad.

Cuando el número de automotores que ofrecían el servicio, sin pertenecer a las asociaciones autorizadas, casi igualó al número de “taxis legales”, se puso en marcha un proceso masivo de regularización que permitiría retomar el control regulatorio sobre la actividad y actualizar el catastro de unidades.

Este proceso tuvo más de un incidente debido a que atacaba directamente los intereses de las asociaciones regulares que requieren del pago de una membresía a los nuevos integrantes con la promesa de que existe un mercado suficiente para recuperar la inversión inicial.

El traslado silencioso del poder.

Desde hace pocos meses, cuando parecía consolidarse el poder en la autoridad pertinente, apareció una tecnología que permite solicitar un taxi desde cualquier teléfono con acceso a la internet. El único requisito para el usuario es descargar la aplicación e instalarla en el dispositivo móvil. Con estos simples pasos uno está listo para utilizar un servicio que, por medio del sistema de posicionamiento global del dispositivo, está en la capacidad de determinar las unidades que se encuentran en el sector y estimar el tiempo en que estarían disponibles para brindar su servicio.

Por otra parte, el requerimiento para el conductor de la unidad que aspira brindar el servicio de taxis es presentarse con la matrícula del auto y su cédula de identidad en las oficinas de quienes ofrecen las aplicaciones para descarga. Para ejercer el oficio no es necesario un registro o autorización emitido por ninguna entidad adicional, solamente presentarse con la intención de servir.

Por este último punto, esta tecnología replicada en varias aplicaciones, comienza a competir con el gobierno municipal por el poder de decidir quien está habilitado y quien no para brindar el servicio de transporte privado en la ciudad; y así en el fondo regular la actividad sin que la sociedad comprenda del todo lo que ha implicado la descarga de esta aplicación.

El restablecimiento del poder.

Una vez que la sociedad adopte masivamente esta tecnología y la convierta en el procedimiento normal para solicitar un taxi, muy pocas de las nuevas unidades tendrán interés en participar del proceso de regulación si el único requisito para obtener parte del mercado disponible para la actividad requiere únicamente registrarse en la aplicación que cada uno considere tiene mayor cantidad de usuarios. O para el efecto podría simplemente registrarse en todas. Menos en el municipio, el ente con el poder regulatorio sobre la actividad.

Esto nos llevará a un punto en el que el gobierno local, nuevamente, se dará cuenta que no tiene el poder efectivo de regular la actividad y que su catastro de unidades es básicamente obsoleto. Y en esa situación lo más común es el intento de recuperar el campo perdido mediante medidas que en el mejor de los casos pueden ser calificadas como inadecuadas. Por ejemplo, una podría ser solicitar a los proveedores de internet el bloqueo de las aplicaciones relacionadas al servicio de taxis, que seguramente terminará incluyendo a los sistemas de navegación que utilizamos para encontrar una dirección. Otra, podría ser castigar con un impuesto la descarga de la aplicación con el perfil de conductor, costo que terminará siendo trasladado al servicio.

Pero, realmente la solución está en poner límites a esta tecnología. Es decir, establecer hasta que punto es conveniente utilizar esta tecnología sin que altere la forma en que, al menos por ahora, se regula en nuestra ciudad el servicio de taxis y se mantiene el listado de unidades habilitadas para brindar el servicio.

Esta es una tarea que puede no delegarse a nadie, más que a la sociedad que hace uso del servicio y es el mercado en disputa entre regulados e irregulares. La sociedad es la única que puede restablecer el poder a las instituciones que ella mismo ha elegido para que regulen una determinada actividad.

Entonces, es el usuario quien debe decidir de forma consciente si toma o no una unidad que no está regulada por el municipio; o en su defecto puede tomar la unidad no regulada y dejar una nota o comentario al emisor de la aplicación dejando ver su preocupación porque la unidad que ha brindado el servicio no cumple con las normas que actualmente rigen la actividad. La decisión por supuesto está sujeta a varios factores como el disponer del tiempo para esperar por otra unidad o la convicción de que esta no debería ser una actividad regulada porque todos tenemos derecho al trabajo.

Entonces, toda decisión es correcta en tanto y en cuanto estemos consientes de que nuestro proceder concede el poder de regular a la autoridad competente o a quienes luchan por un nicho en este mercado.