Últimos artículos:


Como bien sabes estoy "reviviendo" este blog, hacía cerca de mil años (año arriba, año abajo) que no publicaba nuevas entradas y me he encontrado con algunas cosas que han cambiado. Entre ellas, que TwitterFeed cerraba sus puertas en noviembre del 2016 y que FeedBurner se ha convertido en una especie de zombie del que algunos hemos huido. Con lo que en mi cuenta ¿personal? @Ivan_rg, no se estaban lanzando automáticamente los Tweets cuando publicaba un nuevo artículo en este blog. Putadilla...

Ante esto he buscado diferentes alternativas, por supuesto he pensado en las míticas Dlvr.it, IFTTT o Hootsuite, incluso en alguna otra menos conocida, pero al final me he decidido por utilizar los recursos de Google y montarme el tinglado por mi mismo. Así que hoy comparto este mini-tutorial para crear un automatizador que envíe un Tweet cada vez que haya contenido nuevo en tu blog.

  1. Crea tu propia aplicación de Twitter.

    Esta parte es muy sencilla, como usuario de Twitter, puedes crear tus propias aplicaciones para utilizar los recursos de la plataforma, así que vamos a crear una con la cuenta de Twitter que quieres que envíe los tweets (si no has creado una aplicación anteriormente).
    Logueado con la cuenta de Twitter entra en Twitter Application Management y crea una nueva aplicación:

    Una vez creada, debes autorizar tu cuenta para que utilice la aplicación:


     Ahora tan sólo debes apuntar los siguientes códigos que utilizaremos más adelante:
    • Consumer Key (API Key).
    • Consumer Secret (API Secret).
    • Access Token.
    • Access Token Secret.

  2. Trabajando con Google Apps Script.

    En tu cuenta de Google Drive crea un nuevo archivo de Google Apps Script y ponle nombre, a continuación crea un nuevo archivo de secuencia de comandos y llámalo "OAuth":


    Copia y pega en OAuth.gs el siguiente código sin realizar cambios:


    /**
     * Adds a OAuth1 object to the global scope. This can be used as follows:
     *
     * var urlFetch = OAuth1.withAccessToken(consumerKey, consumerSecret,
     *     accessToken, accessSecret);
     * var response = urlFetch.fetch(url, params, options);
     */
    (function(scope) {
      /**
       * Creates an object to provide OAuth1-based requests to API resources.
       * @param {string} consumerKey
       * @param {string} consumerSecret
       * @param {string} accessToken
       * @param {string} accessSecret
       * @constructor
       */
      function OAuth1UrlFetchApp(
          consumerKey, consumerSecret, accessToken, accessSecret) {
        this.consumerKey_ = consumerKey;
        this.consumerSecret_ = consumerSecret;
        this.accessToken_ = accessToken;
        this.accessSecret_ = accessSecret;
      }

      /**
       * Sends a signed OAuth 1.0 request.
       * @param {string} url The URL of the API resource.
       * @param {?Object.<string>=} opt_params Map of parameters for the URL.
       * @param {?Object.<string>=} opt_options Options for passing to UrlFetchApp
       *     for example, to set the method to POST, or to include a form body.
       * @return {?Object} The resulting object on success, or null if a failure.
       */
      OAuth1UrlFetchApp.prototype.fetch = function(url, opt_params, opt_options) {
        var oauthParams = {
          'oauth_consumer_key': this.consumerKey_,
          'oauth_timestamp': parseInt(new Date().getTime() / 1000),
          'oauth_nonce': this.generateNonce_(),
          'oauth_version': '1.0',
          'oauth_token': this.accessToken_,
          'oauth_signature_method': 'HMAC-SHA1'
        };

        var method = 'GET';
        if (opt_options && opt_options.method) {
          method = opt_options.method;
        }
        if (opt_options && opt_options.payload) {
          var formPayload = opt_options.payload;
        }

        var requestString =
            this.generateRequestString_(oauthParams, opt_params, formPayload);
        var signatureBaseString =
            this.generateSignatureBaseString_(method, url, requestString);
        var signature = Utilities.computeHmacSignature(
            Utilities.MacAlgorithm.HMAC_SHA_1, signatureBaseString,
            this.getSigningKey_());
        var b64signature = Utilities.base64Encode(signature);

        oauthParams['oauth_signature'] = this.escape_(b64signature);
        var fetchOptions = opt_options || {};
        fetchOptions['headers'] = {
          Authorization: this.generateAuthorizationHeader_(oauthParams)
        };
        if (fetchOptions.payload) {
          fetchOptions.payload = this.escapeForm_(fetchOptions.payload);
        }
        return UrlFetchApp.fetch(
            this.joinUrlToParams_(url, opt_params), fetchOptions);
      };

      /**
       * Concatenates request URL to parameters to form a single string.
       * @param {string} url The URL of the resource.
       * @param {?Object.<string>=} opt_params Optional key/value map of parameters.
       * @return {string} The full path built out with parameters.
       */
      OAuth1UrlFetchApp.prototype.joinUrlToParams_ = function(url, opt_params) {
        if (!opt_params) {
          return url;
        }
        var paramKeys = Object.keys(opt_params);
        var paramList = [];
        for (var i = 0, paramKey; paramKey = paramKeys[i]; i++) {
          paramList.push([paramKey, opt_params[paramKey]].join('='));
        }
        return url + '?' + paramList.join('&');
      };

      /**
       * Generates a random nonce for use in the OAuth request.
       * @return {string} A random string.
       */
      OAuth1UrlFetchApp.prototype.generateNonce_ = function() {
        return Utilities
            .base64Encode(Utilities.computeDigest(
                Utilities.DigestAlgorithm.SHA_1,
                parseInt(Math.floor(Math.random() * 10000))))
            .replace(/[\/=_+]/g, '');
      };

      /**
       * Creates a properly-formatted string from a map of key/values from a form
       * post.
       * @param {!Object.<string>} payload Map of key/values.
       * @return {string} The formatted string for the body of the POST message.
       */
      OAuth1UrlFetchApp.prototype.escapeForm_ = function(payload) {
        var escaped = [];
        var keys = Object.keys(payload);
        for (var i = 0, key; key = keys[i]; i++) {
          escaped.push([this.escape_(key), this.escape_(payload[key])].join('='));
        }
        return escaped.join('&');
      };

      /**
       * Returns a percent-escaped string for use with OAuth. Note that
       * encodeURIComponent is not sufficient for this as the Twitter API expects
       * characters such as exclamation-mark to be encoded. See:
       *     https://dev.twitter.com/discussions/12378
       * @param {string} str The string to be escaped.
       * @return {string} The escaped string.
       */
      OAuth1UrlFetchApp.prototype.escape_ = function(str) {
        return encodeURIComponent(str).replace(/[!*()']/g, function(v) {
          return '%' + v.charCodeAt().toString(16);
        });
      };

      /**
       * Generates the Authorization header using the OAuth parameters and
       * calculated signature.
       * @param {!Object} oauthParams A map of the required OAuth parameters. See:
       *     https://dev.twitter.com/oauth/overview/authorizing-requests
       * @return {string} An Authorization header value for use in HTTP requests.
       */
      OAuth1UrlFetchApp.prototype.generateAuthorizationHeader_ = function(
          oauthParams) {
        var params = [];
        var keys = Object.keys(oauthParams).sort();
        for (var i = 0, key; key = keys[i]; i++) {
          params.push(key + '="' + oauthParams[key] + '"');
        }
        return 'OAuth ' + params.join(', ');
      };

      /**
       * Generates the signature string for the request.
       * @param {string} method The HTTP method e.g. GET, POST
       * @param {string} The URL.
       * @param {string} requestString The string representing the parameters to the
       *     API call as constructed by generateRequestString.
       * @return {string} The signature base string. See:
       *     https://dev.twitter.com/oauth/overview/creating-signatures
       */
      OAuth1UrlFetchApp.prototype.generateSignatureBaseString_ = function(
          method, url, requestString) {
        return [method, this.escape_(url), this.escape_(requestString)].join('&');
      };

      /**
       * Generates the key for signing the OAuth request
       * @return {string} The signing key.
       */
      OAuth1UrlFetchApp.prototype.getSigningKey_ = function() {
        return this.escape_(this.consumerSecret_) + '&' +
            this.escape_(this.accessSecret_);
      };

      /**
       * Generates the request string for signing, as used to produce a signature
       * for the Authorization header. see:
       * https://dev.twitter.com/oauth/overview/creating-signatures
       * @param {!Object} oauthParams The required OAuth parameters for the request,
       *     see: https://dev.twitter.com/oauth/overview/authorizing-requests
       * @param {?Object=} opt_params Optional parameters specified as part of the
       *     request, in map form, for example to specify /path?a=b&c=d&e=f... etc
       * @param {?Object=} opt_formPayload Optional mapping of pairs used in a form
       *     as part of a POST request.
       * @return {string} The request string
       */
      OAuth1UrlFetchApp.prototype.generateRequestString_ = function(
          oauthParams, opt_params, opt_formPayload) {
        var requestParams = {};
        var requestPath = [];
        for (var i = 0; i < arguments.length; i++) {
          var mapping = arguments[i];
          if (mapping) {
            var paramKeys = Object.keys(mapping);
            for (var j = 0, paramKey; paramKey = paramKeys[j]; j++) {
              requestParams[paramKey] = mapping[paramKey];
            }
          }
        }
        var requestKeys = Object.keys(requestParams);
        requestKeys.sort();

        for (var m = 0, requestKey; requestKey = requestKeys[m]; m++) {
          requestPath.push([
            this.escape_(requestKey), this.escape_(requestParams[requestKey])
          ].join('='));
        }
        return requestPath.join('&');
      };

      /**
       * Builds a OAuth1UrlFetchApp object based on supplied access token (and other
       * parameters.
       * @param {string} consumerKey
       * @param {string} consumerSecret
       * @param {string} accessToken
       * @param {string} accessSecret
       * @return {!OAuth1UrlFetchApp}
       */
      function withAccessToken(
          consumerKey, consumerSecret, accessToken, accessSecret) {
        return new OAuth1UrlFetchApp(
            consumerKey, consumerSecret, accessToken, accessSecret);
      }

      scope.OAuth1 = {withAccessToken: withAccessToken};
    })(this);

    Ahora edita el archivo Código.gs y copia y pega en él el siguiente código:


    function LanzaBot(){
      //AÑADE AQUÍ LA DIRECCIÓN URL DEL FEED TU BLOG
      var res = UrlFetchApp.fetch('http://www.twittboy.com/feeds/posts/default?alt=rss').getContentText(); 
      var result = revisaFeed(res);
      return;
    }
    var revisaFeed = function(res){
      var document = XmlService.parse(res);
      var root = document.getRootElement();
      var items = document.getRootElement().getChild('channel').getChildren('item');
        try {   
      var titulo =   items[0].getChild('title').getText();
      var link =   items[0].getChild('link').getText();
      var props = PropertiesService.getScriptProperties();
      var desdeID = props.getProperty("DESDE_POST_ID"); 
      var cero = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD2, items[0].getChild('guid').getText()));   
      props.setProperty("DESDE_POST_ID", cero);
      if (desdeID==cero) {
        Logger.log("IDs Iguales, último twitteado: " + titulo + " Enlace: " + link );
      } else {
        Logger.log("NUEVO TWITTEADO!!: " + titulo + " Enlace: " + link ); 
        // ELIGE EL TEXTO QUE PRECEDE AL TÍTULO O DÉJALO VACÍO
      var tweet =  'Nuevo artículo en mi blog! ' + titulo + ' ' + link; 
      mandaTweet(tweet);
      }
     } catch (e) {
          Logger.log(e);
        }
    }

    function mandaTweet(tweet) {
      // PON TUS PROPIAS CLAVES
      var TWITTER_CONSUMER_KEY = "TWITTER_CONSUMER_KEY";
      var TWITTER_CONSUMER_SECRET = "TWITTER_CONSUMER_SECRET";
      var TWITTER_ACCESS_TOKEN =  "TWITTER_ACCESS_TOKEN";
      var TWITTER_ACCESS_SECRET = "TWITTER_ACCESS_SECRET";
      var tweet = tweet; 
      if (typeof OAuth1 === 'undefined') {
        var libUrl = 'https://developers.google.com/adwords/scripts/docs/examples/oauth10-library';
        throw Error('OAuth1 library not found. Please take a copy of the OAuth1 ' +
            'library from ' + libUrl + ' and append to the bottom of this script.');
      }
      var params = {};
      var options = {method: 'POST', payload: {status: tweet}};
      var authUrlFetch = OAuth1.withAccessToken(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET,
          TWITTER_ACCESS_TOKEN, TWITTER_ACCESS_SECRET);
      var response = authUrlFetch
          .fetch('https://api.twitter.com/1.1/statuses/update.json', params,
          options);
    }
  3. Configura el robot.

    En el archivo Código.gs debes editar las partes que están en rojo poniendo tus propios datos:
    • Aquí debes indicar la URL del feed de tu blog.
    • Si quieres añadir una frase antes del título del artículo aquí puedes editarla, si lo dejas como está se twitteará "Nuevo artículo en mi blog!! Título de tu artículo + enlace a tu artículo". Si no quieres que se añada ninguna frase, elimina el contenido en rojo.
    • ¿Recuerdas que antes anotastes las claves de tu aplicación de Twitter? Aquí es donde vamos a utilizarlas. Cada una en su lugar correspondiente.
  4. Autoriza tu cuenta de Google para utilizar un servicio externo.

    ¡Vamos a lanzar por primera vez tu automatizador! Tenemos que pulsar sobre "Seleccionar función" y elegir LanzaBot:

    A continuación, lanzamos por primera vez el bot:


    Si todo ha ido bien Google Script te avisará de que el programa necesita permiso para acceder a nuestros datos en Google. Esto ocurre porque necesitamos autorizar la conexión con el servicio externo como vemos a continuación. Evidentemente aceptamos todo.


    Ahora ya puedes ir a comprobar si se ha twitteado el último post de tu blog, de esa manera verificaremos que todo funciona correctamente. También lo puedes hacer desde Google Apps Script pulsando sobre "Ver" y luego sobre "Registros", el mensaje que debe aparecer es el siguiente (pero con tu título y tu URL):

    Podemos volver a verificar que todo va a ir bien. Si volvemos a ejecutar el script, es decir, volvemos alanzar el bot, podemos ver que identifica que es el mismo post y no lo twittea, pero nos avisa en el registro:


  5. Programa cuándo se ejecutará el programa.

    En este punto tan sólo tenemos que decirle al sistema cada cuánto tiempo queremos que "pase" por nuestro blog a ver si hay nuevos artículos que twittear. Esto dependerá de la frecuencia de publicación que tengamos, ya que como vemos a continuación, Google Apps Script te ofrece diversas opciones. Pulsamos sobre "Activadores del proyecto activo"...


    ...y configuramos uno nuevo. Podemos ver las distintas opciones que nos ofrece la plataforma, así que nos adaptaremos a nuestro ritmo de publicación.



    Si lo deseas, también puedes añadir un notificador para que te avise en caso de error de la secuencia, también con varias opciones:

Y esto es todo amigos y amigas, un sistema que, aunque yo me líe un poco para explicarlo, es bastante sencillo de aplicar y utilizar como alternativa a cualquier plataforma de terceros.




Llevo bastante tiempo "haciendo cositas" con Google Apps Script y esta el la primara vez que comparto una de ellas, espero que les sea muy útil!
Te guste o no, seas partidario de ellos o no, seguro que cada vez que entras a tus Redes Sociales o aplicaciones de mensajería no puedes evitar esbozar al menos una sonrisa cuando ves alguno de los memes que se comparten a diario en la red.

Los memes están (siguen) de moda y cada día se extiende más su uso, pretenden contar de una manera divertida y humorística cualquier hecho ocurrido en la sociedad. Desde la originalidad y la picardía, los memes aportan un punto de vista generalmente divertido al día a día.

¿Qué son los MEMES?

En esencia, los memes son montajes fotográficos, opcionalmente con inclusión de texto, que relatan un hecho mediático, una idea, un concepto, una situación, una expresión y/o pensamiento de forma jocosa y humorística. Generalmente se editan y publican en formatos digitales y son difundidos mediante Internet, convirtíendose en virales aquellos que más aceptación alcanzan.

Cómo crear MEMES online:

A día de hoy existen verdaderos especialistas creando memes en Internet, sobre todo en las redes "más rápidas", como son Twitter y Facebook. prueba de ello son algunos de mis preferidos en Twitter: @unmundolibre, @robotronk1@ordago13 o @DolorsBoatella.

Pero no es necesario ser uno de estos grandes genios para hacer tus propios memes online (bueno, para hacerlos así de graciosos... puede que sí), cualquiera puede crear sus propios memes utilizando algunas de las aplicaciones tanto móviles como web que existen para ello:

  1. Memegenerator

    Es una de las herramientas online más conocidas para crear memes. Sencilla y práctica tan sólo tienes que elegir el personaje protagonista o subir la imagen que quieras utilizar en el fondo de tu meme, añadir el texto si lo deseas y guardar o publicar directamente el resultado.
    Tiene aplicación en Google Play.
  2. MakeaMeme

    Con un diseño pensado más para dispositivos móviles que para su uso desde pantallas grandes, es una más que aceptable opción para crear memes rápidamente y desee cualquier dispositivo. En esta ocasión puedes elegir entre una galería más amplia de imágenes de fondo disponibles, o si no puedes subir tu propia imagen y añadir el texto. Luego puedes compartir el meme directamente o descargarlo a tu sistema.a
    Un inconveniente que le veo es que hay que previsualizar el resultado tras cualquier cambio en el texto, no se van visualizando en tiempo real los cambios.
    Tiene aplicación en la App Store.
  3. ImageChef

    Con esta herramienta para memes podemos seleccionar también una imagen de fondo o subir una propia, aunque esta vez se añade la posibilidad de sacarnos una foto en el momento con la cámara web del dispositivo (no disponible en la versión móvil).
  4. Pintzap
    Otra plataforma con un montón de imágenes de fondo ya disponibles aunque también puedes subir la tuya. Lo que me ha llamado la atención es que dispone de opciones para cambiar las fuentes, tanto el tipo de letra como el color, el tamaño, el borde...
  5. ImgFlip
    Finalmente, esta herramienta online te permite escoger entre una buena variedad de imágenes para el fondo y cómo no, subir la tuya propia. También posibilita hacer cambios en la tipografía de los textos, incluso en este caso nos permite utilizar las tipografías instaladas en nuestro dispositivo.
  6. BONUSTRACK!! MemeZinga
    Tras los requerimientos de un buen amigo en Twitter (lo tengo engañao), y porque creo que además lo merece, añado MemeZinga al listado, que también dispone de una buena galería de imágenes de fondo, aunque no es posible subir nuestra propia imagen. Aún así merece el bonustrack porque se trata de un proyecto de esos que nacen de la imaginación y "el momento loco" que a veces se da en los cursos. Ole!  
Recuerda que lo más importante para hacer un buen meme es que pongas en él toda tu astucia e imaginación, estas sólo son herramientas para facilitarte esa labor. Mucha suerte con tus memes!!
El pasado 7 de noviembre de 2017 Twitter amplió el límite de caracteres permitidos en cada Tweet a 280, a continuación, el día 10 del mismo mes y año, amplia a 50 el límite de caracteres de los nombres del perfil (que nos los de @usuario). Estas dos actualizaciones, conocidas ya por cualquier usuario, me hicieron pensar en su momento que Twitter, una vez más, quería equipararse a otras redes sociales sin importarle perder las señas de identidad que hasta el momento le habían hecho ser "especial".

Han pasado ya varios meses y sigo pensando igual. Desde el principio Twitter se diferenció del resto por no seguir las normas preestablecidas de lo que en ese momento era un red social (esto es publicaciones en un "muro", organización vertical, comunicación prácticamente unidireccional y ausencia de tiempo real tal y como ahora lo conocemos), abriendo las puertas a otras redes que seguirían la línea preestablecida por la red del pájaro azul.

Sin embargo desde un tiempo hasta el presente Twitter ha decidido romper con sus propias reglas "regalando" a los usuarios incluso una nueva herramienta más de publicación que permite enviar de golpe tus hilos a la red (d.e.p. @TwiterSplitter ¿Quiere decir esto que Twitter se ha vendido o que, como indico en el título del artículo, Twitter tiene un complejo de inferioridad?

Sé que son cosas distintas y personalmente me inclino a pensar que se trata de una mezcla de ambas; se ha vendido en parte desde que salió a bolsa, necesitando estar cada mes en los medios por alguna razón, y tiene un complejo de inferioridad frente a otras redes que permiten contenidos más amplios.

Está claro que tener más espacio y poder enlazar los Tweets libera al usuario del "agobio" de los 140 caracteres, pero echa por tierra la principal característica de Twitter, lo que marcaba la diferencia y lo que en parte hacía que fuera una red llena de ingenio y originalidad.

¿Cuántas veces has borrado un Tweet y lo has vuelto a escribir por que en 140 caracteres no conseguías reflejar lo que pretendías decir? Pero desde que disponemos de 280 caracteres y la posibilidad de enlazar hilos ¿Cuántas veces lo has hecho? Sé sincero/a, la mayoría de las veces añadimos un Tweet (o varios) más para aclarar o explicar algo del primero.

La limitación de caracteres en los Tweets daba lugar a mensajes "mas currados", muy elaborados para decir mucho en el mínimo espacio. Pildoritas de valor redactadas con mimo.

Tener más espacio no significa que se digan más ni mejores cosas, el cuidado y la preparación que tiene cada Tweet no es ya igual a como era antaño, más espacio da lugar a otras genialidades, a otras originalidades, por lo que no es un cambio necesariamente negativo a pesar de la impresión que pueda derivar de mis palabras. Pero desde luego... no es lo mismo.

¿Tiene Twitter complejo de inferioridad? Puede ser, si es así, lo iremos viendo en próximas semanas, ya que se esperan más novedades, como el esperado "guardar para después"; por el momento si eres un usuario/a observador habrás visto sutiles cambios en las traducciones de Twitter por web. Por ejemplo en la versión es español, donde antes de contabilizaban los "miles" como "k" en inglés, ya aparece el diminutivo "mil". No muy ortodoxo, todo sea dicho.


Otro pequeño cambio lo he visto en los botones de seguimiento. Ahora los botones muestran el mensaje "Seguir tú también" cuando un usuario te sigue y tú a él no:


Sí, sé que son chorradillas, pero nos confirma que Twitter sigue en la brecha y no cesa de actualizarse permanentemente. Tan sólo espero que no acabe convirtiéndose en "una más", que siga siendo la red que tantos buenos momentos nos ha dado.


P.D.- Este es el primer post desde hace mucho tiempo (pero mucho, mucho tiempo). Cómo no, quería que tratara sobre Twitter, como homenaje a la trayectoria del blog, pero mi intención es revivirlo con contenidos más variados, veremos qué tal 😜. Si has llegado aquí, que sepas que te ailoviu, y que te estoy eternamente agradecido, espero que disfrutes con el nuevo diseño del blog y con la nueva línea de contenidos.
YourMemoPad - Google Chrome Extension

(Bueno, cómo se hacía esto... Ah, sí!) Hoy les presento un nuevo proyecto personal: YourMemoPad, una nueva extensión de Google Chrome para apuntar notas y crear tareas rápida y fácilmente.

Y ahora más de uno/a dirá "Anda el Twittboy que se mete en más líos!!!" Pues sí, qué le vamos a hacer... Al fin y al cabo, yo mismo decía hace poco en @LaNuciaEs que "el momento es ahora", o algo similar, así que ¿por qué esperar más?

YourMemoPad - Simply notes for Chrome es una extensión que surge de mi propia necesidad diaria y en ocasiones constante de apuntar códigos, referencias, cantidades, colores, fechas, pantones, números de facturas, etc. Aunque ya existen varias extensiones similares, no encontraba ninguna que se  ajustase a la velocidad de trabajo que suelo tener, que guardase todo automáticamente y que me permitiese copiar y pegar sin formato cualquier texto de cualquier web. Vale sí, seguro que te viene a la mente Google Keep y otras por el estilo, pero cachis... yo quería tenerlo todo en la misma pestaña. ¿Que también tiene versión para móvil...? Coñe, dame un ratooo, no?!! 😜

YourMemoPad - Simply notes for Chrome

Total, que llevo ya un tiempo trasteando con la programación de extensiones para Google Chrome y me planteé hacerla yo mismo. ¿Por qué no? En un principio la extensión carecía de formato, sin diseño, todo a lo bruto... Pero funcionaba, y me daba cuenta de que cada día la utilizaba aún más.

Como se sincroniza con la cuenta de Google Chrome podía compartir la información entre casa y el trabajo o con el portátil, lo cual hizo que le añadiese la pestañita de "Tareas". En ese momento me di cuenta de que se trataba de una herramienta que ya formaba parte de mi rutina diaria. ¿Así que por qué no compartirla?

La extensión es muy sencilla de instalar y de utilizar. Tan sólo ve a su propia página web y sigue las instrucciones o haz clic en el siguiente botón para instalarla desde la Chrome Web Store:

YourMemoPad - Descargar en la Chrome Web Store

En esta ocasión he realizado todo el trabajo en inglés, por darle un poco de proyección internacional por probar cosas nuevas, por ver qué tal, aunque soy plenamente consiente de que de existir, "mi público" (si estás leyendo esto...) sería en un 99,99% de habla hispana.

Lo bueno de las extensiones, al menos de esta en particular, es que son muy sencillas de actualizar, de hecho gracias al feedback de un pequeño pero irreductible e infalible grupo de usuarios betatester grommenower, he realizado ya algunas correcciones y prevéo varias actualizaciones. La primera de ellas la posibilidad de escoger idiomas, que acompañaré con la web en los mismos idiomas ¿Cuándo? Ay mi niño... 😆

YourMemoPad - Simply for notes and tasks in Chrome

Como decía, la extensión es muy sencilla e intuitiva de utilizar, pero por si acaso, también tiene su propio F.A.Q y su guía de instalación y uso.

Entre sus principales características:
  1. Sincroniza automáticamente con tu cuenta de Google Chrome. No hay botones de guardar, cualquier cambio se guarda al instante.
  2. Las pestañas son intercambiables, depende de lo que más utilices puedes poner delante las lista de tareas o el bloc de notas.
  3. Copias y pegas siempre sin formato.
  4. No hay límite de texto en el bloc de notas ni límite de tareas a añadir.
  5. Puedes añadir descripciones y aclaraciones a las tareas.

En fin, como diría aquel, "yo le daría una oportunidad", seguro que verás lo útil que es, sobre todo si eres developer, CM, gestor de contenidos... si andas apuntando textos y códigos todo el día, vaya!

Y si no, bueno, ahí queda...

Me adelanto a algunos/as: sí, hay publicidad en la web y un pequeño banner en la extensión. "Curioso que siempre hable de la importancia de compartir pero luego meta publicidad en las webs" Pues sí, creo que una cosa no quita la otra. Cualquiera es libre de hacer clic o no en la publicidad, que no es otra que Adsense de Google (tampoco creas que me complico demasiado). Si puedo compartir mis cosas, locuras y desvaríos y además llevarme unas perrillas, no veo nada malo en hacerlo. Al fin y al cabo nos movemos en entornos de emprendedores, "estar-apses", "eleveitor piches" y demás seres extraños, con lo que estamos acostumbrados a "monetizar" y "escalar" cualquier cosa ¿O no?

Por cierto, si alguien quier contratar publi tiene a su disposición el formulario de contacto 😱

YourMemoPad

En fin, sólo espero que a quien la instale le sea tan útil como me está resultando a mí. Y les cuento un secreto, realmente la aplicación es pública desde hace aproximadamente 1 mes, durante el que he estado testeando algunas últimas cosas, poniendo banner en Emojis para Twitter (ya lo habrás visto) y rascándome la barriga de vacaciones.

Por supuesto, no me puedo despedir sin agradecer y alabar la labor de ese pequeño, irreductible, infalible y realmente estimado grupo de tocapelotas amigos y amigas que me han dado el feedback durante el periodo de "testeo privado" de la extensión: @JMChia (la navaja de Ockham del código forever and ever), @Javimonsalupe (Hipster ocasional), @cmoralesper (chachooooo, no?!), @emeguedes (project head of "ponle un botoncito aquí..."), @GiancarloGians (hombre orquesta, lo mismo te vale para un roto que para unos fetuchinni), @Claudix (Erlernen der Sprache) y @cocinaitaliana (ay, io tengo una ideini que te va a gustarrr... y la arma de nuevo).

Y por supuesto, y siempre en especial, @PuyBoneta (instaló iOS en un Motorola). 

En serio, MUCHAS GRACIAS, sé que soy un pesado.

Como es habitual, la extensión tiene su propia cuenta de Twitter, donde puedes seguir las actualizaciones o sugerir cambios e ideas @YourMemoPad:


Finalmente, te cuento un último secreto, en breve, esta vez prometo no tardar un dos años, tendré lista otra extensión (realmente ya está, faltan los últimos retoques), quizás más particular. Si usas JIRA, estate al loro! Y si eres un pelín vivo/a, la verás ya rulando por ahí...

Y ya sabes, si instalas la extensión y te mola, se agradece un comentario en la Chrome Web Store y unas estrellitas!! 😘
Emojis para Twitter

Qué nervios, hacía tiempo que no hacía estas cosas... hoy tengo el placer de presentarles mi nuevo proyecto personal: Emojis para Twitter, una completa colección con 850 emojis listos para utilizar en Twitter.

Ya se imaginan lo especial que es para mi enseñarles hoy esta herramienta, pocas veces uno presenta algo hecho por uno mismo y de lo que se sienta tan orgulloso :-)

Emojis para Twitter es una divertida aplicación web para publicar emojis en Twitter. El funcionamiento es muy simple, sólo tienes que escribir tu mensaje en el campo de texto y añadirle tus emojis preferidos de entre todos  los disponibles en la tabla.

Emojis para Twitter

Una vez tengas listo tu mensaje sólo tienes que pulsar sobre "Enviar" y se abrirá un pop-up para twittear directamente en tu cuenta de Twitter, así de sencillo. Aunque si aún tienes alguna duda, también tiene un FAQ donde aclarar dudas.



Los 850 emojis están divididos en categorías según mi propio y libre criterio (se siente, oyes), y son aquellos que Twitter "acepta" actualmente. En cuanto Twitter de de alta nuevos emojis, los iré actualizando.


La motivación principal al hacer Emojis para Twitter fue que una vez Twitter añadió la posibilidad de utilizarlos en su plataforma, la única manera de hacerlo era desde el teclado del móvil (aquellos que lo permitan) o accediendo a la configuración de cada navegador en tu equipo. Mucho lío, vaya.

Con esta web, puedes acceder directamente a todos los emojis que acepta Twitter desde cualquier navegador, sin necesidad de cambiar su configuración. Además, si eres usuario de Chrome, también tienes una aplicación que instalará un acceso directo en tu navegador para que accedas fácilmente a la web, descárgala desde la Chrome Web Store.

Emojis Twitter en la Chrome Web Store


Cómo no, la web tiene su propio  usuario en Twitter: @EmojisTwiter


Sí, de acuerdo, nos conocemos y sé lo que estás pensando: "¿Pero... y lo de Símbolos para Twitter? ¿No es lo mismo?" Pues no; aunque en un primer momento pensé en ampliar la web y añadir los emojis, pero soy de los que opinan que cuando algo funciona tal y como está, mejor ni tocarlo...que luego lo rompo.

Pero lo que más me decidió a hacer una web nueva para los emojis fue, como diría Homer Simpson, que son "animales distintos". Salvo contadísimas excepciones, los emojis son por regla general y explicado rápido y mal, pequeñas imágenes que se muestran al interpretar determinado código, mientras que los símbolos son tipografías en caracteres Unicode y dibujos ASCII.

Finalmente sólo esperar que les guste tanto como otros de mis proyectillos personales, de verdad que está hecho con todo el cariño del mundo :-)

Para acabar, agradecer a la gente que siempre está ahí para todo, que me guarda los secretos y que aguanta mis cosas, mis preguntas, mis consultas y mis neuras. Especialmente a mi Puy, de divina paciencia, que sabe aplicar las palabras adecuadas en los momentos adecuados. A @JMChia, amigo y socio, que tiene las mejores ideas del mundo y además las comparte. Y a @josevillalobos,que aunque él no lo sepa (o sí, que es múlisto), un DM suyo fue lo que realmente me impulsó a crear Emojis para Twitter.

Y por supuesto a ti, que lees mis tonterías, que me sigues en las redes y que en definitiva, formas parte de mi vida. GRACIAS!

No te olvides: Emojis para Twitter!
Bola 8

Sigo sin tener mucho tiempo para publicar (es obvio), pero aprovechando estos días veraniegos y que el calorcito madrileño activa mi parte mas creativa, me gustaría empezar a compartir hoy una serie de viñetas sin elevadas pretensiones, dibujadas con mayor o menor acierto, que tan solo pretenden sacar una sonrisa a quien esté dispuesto a pasar por estos lares...

Bola 8 reúne una serie de ideas y tonterías que han ido tomando forma con el tiempo en algún lugar recóndito de mi cabeza, rebotando con mis dos neuronas hasta materializarse poco a poco en algunos dibujos y bocetos. Quizás mi humor no sea del agrado de todos, siempre he pensado que el chiste más tonto es siempre el más inteligente, así que si exclamas "Qué malooo!!" tras ver alguna viñeta, es probable que haya cumplido su cometido.

Espero que les guste. Empezamos con "Extrañas parejas" :-)

Suscribirte por RSS: Rss