APIs públicas para tus proyectos

Año nuevo: proyecto nuevo. Estoy seguro de que sois muchos los que estáis empezando un sideproject como propósito para el nuevo año. A la hora de elegir la mejor idea, si no queréis picar un montón de código, os vendrá bien saber que APIs tenéis disponibles para juntarlas, remezclarlas y sacar alguna funcionalidad chula.

API photo
Photo by abraham.williams

Es muy importante saber qué herramientas tienes disponibles, y es un conocimiento que además os puede venir muy bien para enfocar mejor esos momentos de desorden en el que vienen un montón de ideas a la cabeza.

Pero, no corráis a poneros a buscar en Google «API pública», por favor. Hay maneras de optimizar el tiempo para que todo lo que dediquéis sea de experimentación y absorción de conocimiento. Además, si optáis por la primera opción, es muy posible que os encontréis que cada una está definida y documentada como su padre y su madre han creído oportuno: puede ser una auténtica locura.

Hay gente que ya se ha encargado de juntar un montón de definiciones de APIs públicas, de tal modo que tu las tengas a mano y ordenadas. Además, así puedes acceder a todas de una misma forma y tener la documentación de una forma más estandarizada.

Para cacharrear con ellas puedes hacerlo como prefieras: desde la web; con un sdk para tu plataforma preferida; o incluso desde la línea de comandos. Sin embargo, si me pedís la recomendación más cómoda (aunque por el momento es la que menos APIs tiene disponibles) yo optaría por una colección para el postman, que es una extensión de Chrome que me tiene enamoradito desde hace años.

Ánimo, elegid vuestro sabor preferido y dadle vida a ese nuevo proyecto.

Gmail Add-ons: How-to be on all desktops and mobiles with a simple app

Some weeks ago, Google opened the possibility of create Gmail add-ons for all developers. Let’s see what are the possibilities and how to create and distribute our own Gmail add-on.

This is not a very hard and abstract post, add-ons are something easy, so I hope my explanation to be simple too. It is based on an add-on created by myself that allows any user adding an email to Google Tasks (probably it is more useful than the add-on for MSN Messenger that I created years ago which read received messages with «real» voice). It is a functionality that has been always present on Gmail web client but that is not available on mobile clients.

In order to create a Gmail add-on you need to create a new Google Apps Script project. After that you can add as much scripts as you want to create an interface using Cards and the functionality to interact with other services, APIs and so.

For instance, in our example the functionality is very basic:



function getContextualAddOn(e) {
  var message = getMessage(e);
  var subject = message.getSubject();
  var permaLink = message.getThread().getPermalink();
  
  var card = CardService.newCardBuilder();
  card.setHeader(CardService.newCardHeader()
                 .setTitle('Save as task'));
  var section = CardService.newCardSection();
  
  var button = prepareSend(permaLink);
  section.addWidget(button);
  
  section.addWidget(prepareList());
  
  section.addWidget(prepareTitle(subject));
  
  section.addWidget(prepareDueDate());
  
  section.addWidget(button);
  
  section.addWidget(prepareSign());
  
  card.addSection(section);
  console.log("Open");
  return [card.build()];
}

function getMessage(e){
  var accessToken = e.messageMetadata.accessToken;
  GmailApp.setCurrentMessageAccessToken(accessToken);
  
  var messageId = e.messageMetadata.messageId;
  return GmailApp.getMessageById(messageId);
}

function prepareSend(permaLink){
   var action = CardService.newAction()
  .setFunctionName("saveTask")
  .setParameters({permaLink: permaLink});
  return CardService.newTextButton()
                    .setText("Save")
                    .setOnClickAction(action);
}

function saveTask(e){
  var res = e['formInput'];
  var task = Tasks.newTask();
  task.title = res["title"];
  task.notes = e['parameters'].permaLink;
  
  if(res["due-date"] && res["due-date"] != "")
    task.due = res["due-date"] + "T00:00:00Z"
  
  task = Tasks.Tasks.insert(task, res["list"]);
  console.log("Saved");
}

function prepareList() {
  var response = Tasks.Tasklists.list();
  var taskLists = response.items;
  var dropdown = CardService.newSelectionInput()
     .setType(CardService.SelectionInputType.DROPDOWN)
     .setTitle("List")
     .setFieldName("list");

  if (taskLists && taskLists.length > 0) {
    Logger.log('Task lists:');
    for (var i = 0; i < taskLists.length; i++) {
      var taskList = taskLists[i];
      Logger.log('%s (%s)', taskList.title, taskList.id);
      dropdown.addItem(taskList.title, taskList.id, i==0);
    }
  } else {
    Logger.log('No task lists found.');
  }
  return dropdown;
}

function prepareTitle(subject){
  return CardService.newTextInput()
                    .setFieldName("title")
                    .setTitle("Title")
                    .setValue(subject)
}

function prepareDueDate(){
  var d = new Date();
  var dd = new Date(d.setDate(d.getDate() + ( 7 - d.getDay()) % 7));
  return CardService.newTextInput()
                    .setFieldName("due-date")
                    .setTitle("Due date")
                    .setValue(dd.getYear() + "-" + (dd.getMonth() + 1) + "-" + dd.getDate())
                    .setHint("YYYY-MM-DD");
}

function prepareSign(){
  var button = CardService.newTextButton()
     .setText("@JaviLopezG")
     .setOpenLink(CardService.newOpenLink()
         .setUrl("https://javilopezg.com/")
         .setOpenAs(CardService.OpenAs.OVERLAY)
         .setOnClose(CardService.OnClose.RELOAD_ADD_ON));
  return CardService.newKeyValue()
     .setContent("Developed and maintained by")
  .setButton(button);
}

You also have to change script’s manifest. To do this you need to access to the menu «View>Show manifest file». Now you can modify it as you want, following our example you have to replace the content with following lines:

{
  "timeZone": "GMT",
  "dependencies": {
    "enabledAdvancedServices": [{
      "userSymbol": "Tasks",
      "serviceId": "tasks",
      "version": "v1"
    }]
  },
  "oauthScopes": ["https://www.googleapis.com/auth/gmail.addons.execute", "https://www.googleapis.com/auth/gmail.addons.current.message.readonly", "https://www.googleapis.com/auth/tasks"],
  "gmail": {
    "name": "Save as task",
    "logoUrl": "https://i0.wp.com/javilopezg.com/wp-content/uploads/2017/11/save-as-tag-ico-24.png",
    "contextualTriggers": [{
      "unconditional": {
      },
      "onTriggerFunction": "getContextualAddOn"
    }],
    "primaryColor": "#000000",
    "secondaryColor": "#888888",
    "version": "TRUSTED_TESTER_V2",
    "openLinkUrlPrefixes": [
      "https://javilopezg.com/"
    ]
  }
}

As soon as you save all changes you are ready to publish your add-on. Unfortunately the Gmail add-ons store is not publicly available yet. However, you can get the ID of your add-on and distribute it to your company co-workers in order to allow them install your add on in their gmail accounts. See images below:

Gmail Add-on ID
Gmail Add-on ID
Add-ons in Gmail settings
Add-ons in Gmail settings

I know that it’s frustrating not being able to publish an add-on to all gmail users around the world yet. Anyway, I already have two cool ideas to implement as soon as I was able to distribute it at least to my friends. Something to draw an ordered tree of a conversation thread and an add-on to respond an e-mail with a video in an easy way. And you? What ideas are coming to your head?

Mi respuesta a la Bonilista: ideas free

Este domingo, como cada domingo, leía a Bonilla que ha hecho públicas 10 ideas de las que apunta en su cuaderno.

ideas photo

Como él, tengo mi lista (sólo que yo uso Google Tasks) y venía ya unas semanas pensando en ir haciéndola pública para dotar de más contenido al blog, aunque al no tener trabajo y por tanto ordenador, me está resultando difícil plasmar el formato de análisis «completo» que quería darle.

Su newletter (aunque para mi sea un post, puesto que prefiero no recibir emails y entrar yo a buscar su texto cada domingo), me ha animado a ponerme manos a la obra, ya que en él he encontrado puntos que he tratado en repetidas ocasiones con colegas y amigos, y porque la 7 en concreto me ha recordado muchísimo a lo que hicimos en GPMESS.

Recogiendo su testigo adoptaré su mismo formato de titular las ideas y comentarlas por encima. Si alguien quiere, ya habrá ocasión de profundizar en ellas. La mayoría, son posibles soluciones a problemas detectados, como pueden ser recursos en desuso, necesidades sin cubrir o sistemas con comisiones muy altas.

Todos los que me conocéis, sabéis el poco valor que le doy a las ideas, lo que cuenta es la ejecución, así que feel free de hacer con ellas lo que queráis, y si lo petáis me alegraré mucho por vosotros. Si queréis tener un detalle ya me invitaréis a una mariscada 😉

  1. Hacer una ICO para montar el dominio de primer nivel .eth: En los dominios de primer nivel (.com, .es, …) hay un espacio para los dominios esponsorizados. Podemos ver que hay algunos muy de marca como son el .goog o el .barclays por ejemplo. Aquí andaba dándole vueltas a que se podría ofrecer en una ICO para que fuera interesante. Para los ajenos, una ICO (muy simplificadamente) es el lanzamiento de una criptomoneda sobre Ethereum en el que la gente compra la divisa, ya que sólo con ella se podrá hacer en el futuro lo que quiera que vaya a ofrecer la empresa que está detrás, esta moneda tiene más valor cuanto más interesante sea para la comunidad lo que se pueda hacer con ella en el futuro (sí, es bastante de especulación). El dominio de primer nivel .eth podría usarse para proyectos que trabajen sobre Ethereum y los dominios sólo podrían comprarse con la moneda lanzada. En principio me parece que cumple con todas las cosas necesarias para una ICO, pero no conozco suficiente ese mundo como para garantizarlo.
  2. Plataforma para contratar equipos dev funcionales: todos somos conscientes de que hay cierta burbuja emprendedora en el país. Además esto se une a que montar equipos técnicos es bastante complicado, y las comisiones de los head hunters son muy altas. Además tras una contratación lleva bastante tiempo conseguir que todo el equipo funcione bien en conjunto. Por tanto, sería interesante tener una plataforma donde juntar a los equipos de startups que están llegando a su fin con posibles contratadores que fichen al equipo en su conjunto. Al cerrar GPMESS hubo una empresa que, sabiendo como funcionaba mi equipo, quiso contratar a toda la plantilla en su totalidad. Desgraciadamente era tarde, porque hacía meses que había tenido que despedir a todo el mundo menos a Juan, y de un modo u otro la gente ya se había ido buscando sus habichuelas.
  3. Juego, cazar objetos y marcas: siempre he sido un contrario a la realidad aumentada tal como está planteada hoy en día, porque a la gente no le gusta ir pareciendo imbécil por la calle. El exito de Pokemon Go, dejó en clara evidencia que estaba completamente equivocado. Ahí hizo muchísimo la marca de Nintendo, pero la verdad que ha sido un sistema de juego que ha parecido no disgustar (aunque fuera el mismo de su no tan querido predecesor). Otro sistema de juego innovador, podría ser para juegos de construcción o de tipo tamagochi, que los materiales los tuvieras que fotografiar y con alguna de las apis de reconocimiento actuales identificaras lo que hay en la foto y eso se lo aportases al juego. En un juego de construcción podrías ir recopilando ladrillos y tejas, y llevarte más puntos si tu cocina la equipas con electrodomésticos Siemens. O si a tu «tamagochi» le das una hamburguesa del Burguer King aguantará más tiempo con el estomago lleno. En el reconocimiento de marcas hay mucha pasta.
  4. Who loves you: es una app de facebook que cuando le das acceso examina todas tus interacciones y te dice quien es probable que esté coladito por ti. Es un poco black hat, pero claro, para hacer la tontería le tienes que dar acceso a todos tus datos, y los datos son dinero, mucho.
  5. WikiHighlights: Este lo había empezado a programar para entretenerme, pero al quedarme sin curro y por tanto sin ordenador, se ha quedado un poco en el olvido. ¿Has usado alguna vez un Kindle? Su sistema para marcar contenido interesante es muy sencillo, además te permite compartirlo en redes, y te permite ver mientras lees las cosas que han destacado otros.  Pues esto es eso pero para webs. Tal como lo tenía pensado, la funcionalidad básica (esa) podría ser gratuita. El premium (para el site) sería que el texto se convirtiera en imagen antes de compartirlo (como hacía mi difunto infinitweet que tanto le gustaba a Bori) y el superpremium sería que permitiese al site elegir el tipo de letra y el diseño en general de la imagen que generarán los usuarios al compartir. Para la distribución había pensado empezar por un plugin de WordPress, ya que tiene tanto mercado en Internet.
  6. Buscador de dominios en base a idiomas: poner nombre a los proyectos cada vez es más complicado, sobre todo si quieres tener un dominio libre. Por tanto, podría ser interesante un buscador de dominios en el que tú le metes una o varias palabras, y te diga dominios que haya libres traduciendo esas palabras a distintos idiomas. Una vez que lo tengas ya podrás decir que el nombre de tu empresa es en Rumano porque eres super fan de los vampiros o cualquier otra explicación que se te ocurra.
  7. Micro silencioso: si habéis leído la saga de Ender no necesitaréis que os lo explique, pero para el resto… Los bots conversacionales, los asistentes y demás están cada vez más de moda. Sin embargo, con mi comentada repulsión a parecer imbécil por la calle, creo que un micro con el que no necesitases hablar en alto y bastase con que susurrases podría tener mucho éxito.
  8. Resume generator: ahora que Microsoft se ha cargado el lab de Linkedin donde tenían una utilidad para hacerte un curriculum muy apañado tirando de tu información de Linkedin, hay un gran hueco que cubrir. Hay otras herramientas, pero son caras y malas.
  9. GPAds: en GPMESS los yipis de difusión no llegaron a explotar, porque 33.000 usuarios eran muy pocos para tanto terreno como es España. Sin embargo, sí que nos funcionó un poco aunque nos quedamos sin tiempo de testarlo más y mejor, el mandar anuncios de cosas que iban a pasar dentro de poco a la gente que estaba cerca (conciertos principalmente). Es algo que me quedé con las ganas de exprimir más, pero ya sabéis el tiempo es oro y el oro es tiempo, había que cerrar.
  10. Petar la store: la décima, que no la última, es una sugerencia que le hice a un amiguete. Habían montado una empresa en la que estaban especializados entre otras cosas en automatizar despliegues de apps móviles, pero necesitaban hacerse un poco de nombre para poder ofrecer consultoría a otras empresas. En archive.org hay juegos noventeros míticos (como el Tant-R), así que se me ocurrió que podrían hacer una app contenedor y publicar automáticamente en las stores de aplicaciones una app por cada juego de los que hay en archive. No creo que les hubiese reportado mucha pasta, a no ser que la gente se los empezase a bajar como locos, pero estoy seguro de que algo de ruido habrían hecho con algún artículo del tipo «Como crear miles de aplicaciones en una hora». No les gustó y no lo pusieron en práctica, por lo que no lo sabremos.

Estas son mis 10, que aunque son distintas a las de Bonilla, alguna ataca al mismo problema. Hay más en la lista, así que si queréis: pedir. ¿Cuáles son las vuestras?

Normas para la generación de ideas

Muchas veces nos enfrentamos a la necesidad de generar ideas, ya sea para solucionar un problema que no tenga una solución directa, o para crear o mejorar un producto. Sea cual sea el objetivo hay algunas normas que podemos seguir:

  1. No juzgar: Cuando estás generando ideas, ya sea sólo o en grupo, es muy importante no juzgarlas, por varios motivos. En primer lugar si estás en modo creativo no tiene sentido parar todo el tiempo que requiere una evaluación completa. Además no hay que desmoralizarse (ni a uno mismo ni a nadie). Por tanto, si estás generando ideas nada de «eso es una tontería».
  2. Todo vale: Digamos que esto es un refuerzo de lo anterior. Hay que poner encima de la mesa absolutamente todo lo que se te pase por la cabeza, ya que aunque estés seguro de que es algo que no vale por el motivo que sea, esa puede llevarte a ti o a otra persona a pensar en la buena buena, así que es importante que sea lo que sea lo plantees.
  3. Desorden: El desorden ayuda mucho a que el cerebro se ponga en modo creativo, así que busca momentos o espacios alternativos para darle vueltas a ese problema.
  4. Usa las manos: Hacer manualidades ayuda a pensar. Puedes garabatear dibujos, hacer papiroflexia, jugar con una goma o tirar una pelotita. En realidad, cualquier cosa que provoque usar otras partes del cerebro ayudará.
  5. Sólo no puedes, con amigos sí: Siempre es mejor hacerlo con más gente. Las ideas de uno pueden retroalimentar las ideas de otro. Además, con perfiles (estudios, experiencias, culturas) distintos se tiende a pensar en cosas distintas.

La próxima vez que tengas que darle vueltas a algo intenta poner todo esto en práctica y todo será mucho más fácil.