Últimos artículos:


Hacía mucho tiempo, demasiado, que no me asomaba por aquí. Los motivos son obvios, si has leído mi anterior entrada entenderás que... en fin, que soy un sentimentaloide, lo sé!!

El caso es que aquí estoy de nuevo, no con esperanza de reflotar este blog, porque hace mucho que esa no es mi intención, sino para celebrar en la que fue durante mucho tiempo ES mi casa, que Plataica cumple su primer añito de vida...

¿Qué qué es Plataica, te preguntas? Bueno, pues que sepas que tú eres la primera razón por la que celebrar en este blog el aniversario, y no en el propio blog de Plataica.

Verás, te lo resumo... hace algo más de un año publicaba el siguiente hilo en Twitter:


En ese momento hacía 3 meses que habíamos cerrado Pirendo "oficialmente", y me encontraba de nuevo en Estella, Navarra. Tras meditarlo mucho, llevaba varias semanas dándole vueltas a la idea de volver a trabajar con la plata, con mis manos que es lo que realmente hace que me sienta realizado... El caso es que aprovechando las herramientas y algo de material que aún conservaba de mi primera etapa de artesano con Puy, y por supuesto contando a cada momento con su apoyo incondicional, decidimos juntos que volvería a liarme la manta a la cabeza para volver a ganarme las papas con el trabajo de la plata.

Y así (versión super-reducida) nació Plataica.


Así que, hermanos y hermanas mías, nos reunimos hoy aquí para celebrar el primer añito de vida de Plataica.

Durante este año no he parado de aprender, eso es lo que más me gusta de dedicarme a esto y de hacerlo de esta manera. Poder dedicarle el tiempo necesario a cada idea, problema o situación, y además hacerlo con la complicidad y el beneplácito de tu apuesto, inteligente, simpático, y de muy buen ver jefe, no tiene precio. Sí, es lo que tiene ser tu propio jefe, o te quieres o te odias 😜.

Han sido muchísimas las sorpresas que me he llevado con algunas de las reacciones de amistades, sobre todo de compañeros y compañeras de mi anterior entorno, mucho más tecnológico y "on-line". Y debo decir que no todas placenteras y gratificantes. Desde quien directamente ha dejado de seguirme en Twitter-FB-IG (y supongo que también borrado de la agenda), hasta quien me ignora en las redes cuando antes suplicaba en privado una ayudita o un retweet.

En fin, a esos que les den, ellos se lo pierden. La verdad es que han sido muchas las personas que de una u otra manera han contribuido en la medida de sus posibilidades a que esto siga adelante. No quiero nombrar específicamente a nadie, porque seguro que me olvidaría de alguien, pero desde blogs que han enlazado la tienda online, alguna youtuber muy muy geek que se ha convertido en fan, que nos sacan en sus libros o que nos llevan de paseo por otros mundos.

Y tantas otras que anónimamente, o no, han puesto su granito de arena para que cada día me despierte con la ilusión desbordada y las fuerzas al 200%. Ellas saben quienes son.

A todas estas personas humanas, GRACIAS, GRACIAS Y GRACIAS, escritas cada una de las veces con las mano en el corazón y una lagrimilla a punto de saltar.

Y gracias por la confianza, los encargos, las ideas, las críticas y los follows, los likes y los RTs.

Este nuevo año plataiquero, o "la segunda vuelta", como yo lo llamo, se presenta prometedor:

Acabo de lanzar la última (por el momento) colección de Plataica, las #NJoyas, basadas en la última novela de Roberto López-Herrero "N mundos. Mundo Pequeño" que además, aunque ya está a la venta online y en librerías de barrio, se presenta esta misma noche.

Por otro lado, San Fermín está a la vuelta de la esquina, y voy a llenar la tienda del amigo Mikel Urmenteta, Sanferfood de toritos y corredores de plata...

Y además, en breve una nueva colección estará únicamente disponible a la venta en G.thyka Estella, con diseños exclusivos diseñados en colaboración con la propietaria.

Y por supuesto, en agosto la Semana medieval de Estella Lizarra, en la que espero, al menos, repetir la audiencia del año pasado:


A todo esto hay que sumarle algunos otros proyectos e ideas que aún están fraguando. Y por supuesto, seguir manteniendo y subiendo nuevas piezas a la tienda Online de Plataica que es lo que más me gusta.

En fin, que eso, que buaf, no? yaaaashhh!!! 😂😂😂



Llevo días dándole vueltas a la cabeza pensando si debía escribir o no estas líneas. Al fin y al cabo nunca he sido muy proclive a escribir sobre temas excesivamente personales en este blog ni en ninguna de mis redes. Pero esta vez es distinto.
Quizás por eso me he decidido a buscar fuerzas de donde no las hay y empezar con este texto.

El pasado 20 de abril nuestro compañero Moore falleció a causa de un tumor en el estómago que no habíamos detectado y que en cuestión de 3 horas hizo que su luz se fuera apagando poco a poco hasta no brillar más.
Miento.
No fue el tumor quien realmente se lo llevó, fuimos nosotros quienes egoístamente decidimos ahorrarle el dolor y sufrimiento en el que se iban a convertir sus últimas horas. Aún hoy dudo sobre si tomamos la decisión adecuada, creo que jamás lo sabré ni conseguiré soltar el peso de esa incertidumbre. Pero no me arrepiento. Moore era un perro fuerte y feliz, no merecía acabar entre dolores y sufrimiento.

Llegó a nuestras vidas hace ya 10 años, allá por mayo de 2008 y fue el mayor regalo que jamás nadie me había hecho. Gracias Puy por permitirme estos años de felicidad.
Moore nació el 5 de marzo de 2008, justo 2 meses antes de llegar a nuestras vidas, y se llamaba en principio "Terry", pero siguiendo la línea que habíamos empezado con nuestro amo y señor Benvenuto Cellini, decidimos llamarle Henry Moore, "Mur" para los amigos...
Siempre cuento que Moore tenía unos 20 hermanos y dos madres, porque cuando fuimos a buscarlo, el criador nos contó que había "juntado" a su padre con dos perras que parieron a la vez y se habían mezclado los cachorros, con lo que nunca supo a cuál de las dos hembras correspondía.

Me gustaría señalar aquí que adquirimos a Moore mediante un criador de perros de caza, no lo rescatamos de ningún lado, ni fue un perro abandonado, pero de alguna manera siempre he pensado que "lo rescatamos" de una vida dura y miserable como cazador. Aún me atormentan las imágenes de perros hacinados en jaulas y colgados de las ramas en los bosques que he llegado a encontrarme en más de una caminata. Conozco cazadores muy cariñosos y responsables con sus perros, pero por desgracia no todos son así.

Cuando nos acercamos a un pequeño recinto lleno de pequeños seres peludos y alborotados, el criador metió la mano y sacó, tirando por la piel del pescuezo, una pequeña bolita blanca con manchas marrones y negras, todo amor y orejas, que nada más mirarnos nos arrebató el corazón.
Tengo cientos de imágenes almacenadas en mi memoria de esos días, pero muy pocas imágenes reales. Siempre he sido una persona que prefiere disfrutar al 200% de los mejores momentos y olvido dejarlos inmortalizados, soy un desastre.
Lo primero que hizo Moore al llegar a casa, tras la correspondiente presentación y aceptación por parte de Cellini (no le costó mucho, cuando aquello aún tenía sólo 3-4 años), fue aprender cuál era "su sitio".
Recuerdo que Puy y yo comimos (o quizás era una cena?) ese día mirando todo el rato a aquel peluche que había llegado a nuestras vidas. Nos tenía hipnotizados. No sé qué daban en la tele ni nos importaba, tan sólo podíamos sonreír mientras veíamos cómo Moore había decidido que tooooodos los juguetes que Cellini tenía repartidos por la casa eran ahora suyos, y que ahora buscaba y llevaba al que a partir de aquel día sería "su sitio".
Moore no era perfecto. Era un gran perro, sin duda el mejor que tendré nunca, y no puedo expresar con palabras lo orgulloso que estoy de él. Pero siempre tuvo miedo a la gente desconocida. Jamás sufrió maltratos de ningún tipo, pero en algún momento, seguramente viviendo ya en casa, se llevó algún susto que lo dejó un pelín traumatizado para toda la vida (por las fechas en que Moore llegó a casa siempre he culpado a las fiestas del pueblo, los cohetes, voladores y fuegos artificiales, a las cuadrillas de borrachines por la calle... A nosotros por exponerlo a eso.). Bien es verdad que en los últimos años, sobre todo después de estar viviendo en Madrid, este "trauma" había remitido en gran medida, pero aún hoy en día se mostraba receloso cuando nos cruzábamos con algún desconocido.
Tardamos mucho en castrarle, lo hicimos ya con 9 años porque en palabras del veterinario "tiene la próstata como un balón de rugby", y el proceso haría que ese problema remitiese. No lo hicimos antes por ninguna razón especial. Era un perro dócil, sumiso, sin especial interés por las hembras y con buena salud. Pero debido a su edad algo fue mal y el último año sufrió de "incontinencias" que solucionamos con unas gotas de medicamento en cada comida. Nada grave.

Me gustaría contarles aquí miles de anécdotas que vivimos con nuestro Moore, me encantaría hacerles partícipes del amor que desprendía mi pequeño hermanito, pero jamás podría acercarme siquiera a una ínfima parte de la luz que transmitía.
Sí, sé que tiendo a idealizarlo, y lo que me queda...
Para mi Moore era algo más que un compañero o un amigo. Era mi mejor amigo, y sé que puedo decirlo sin que nadie se ofenda. Moore nunca fue un "perrihijo" como dicen por ahí. Nunca lo consideré una "personita" y siempre estuvo en su lugar. Pero era mi hermanito. No hay momento feliz o amargo en estos últimos 10 años que no haya compartido con él. Ni lágrima que no haya intentado lamer. Ni sonrisa que no haya celebrado con ese rabo que movía como un loco....

Pero se fue de repente. No puedo culpar ni enfadarme con nadie. No puedo consolarme pensando que "fue culpa de...". Pero tampoco puedo sacarlo de mi cabeza, de verlo aparecer por la puerta cada vez que miro al suelo, de esperar a despertarme de esta mierda de pesadilla o de que en algún momento alguien me diga que ha sido todo mentira...
No consigo pensar bien si mi corazón está oscuro y triste, no puedo dejar de pensar que ya no haremos juntos todas esas cosas que había imaginado, que ya no estará en mi futuro, que ahora tengo que construir un futuro nuevo en el que no va a estar él.
Me había hecho muuuchas ilusiones, ya había pensado los trucos nuevos que quería enseñarle cuando llegase el momento. Moore formaba parte de nuestra familia y jamás se me ocurrió planear un futuro sin él. Ahora...

Creo que Cellini se huele algo. Estos días ha estado más "hablador" que de costumbre, y maúlla a veces sin mucho sentido y sin buscar nada en concreto. Incluso parece más cariñoso. No sé cómo procesan la muerte los gatos. Igual ni se ha enterado y espera que algún día vuelva de la guardería. Ojalá sea eso.

Nosotros ya nos hemos despedido de él. Si es que eso es posible de alguna manera. Sus cenizas vuelan ahora junto a los majestuosos buitres leonados del "Balcón de Pilatos" en Navarra, cerca de Estella. Un paraje espectacular en el que podrá oler y rastrear sin parar, que era lo que le hacía más feliz.
O quizás Moore ni siquiera esté allí ya. Estos días he reflexionado muchísimo sobre la vida y la muerte, sobre lo que habrá después de todo esto si es que hay algo. Sea como sea sé que si su energía sigue fluyendo por el universo, en algún momento volveremos a encontrarnos. Puede que esa vez sea yo el perro y él el animal.

En cualquier caso sólo tengo palabras de agradecimiento para Moore, por tantos años de fidelidad infinita, de amor sin límites, sin condiciones. Dicen por ahí que los perros acaban pareciéndose a sus dueños, pero mi aspiración era llegar a parecerme un poco a él interiormente.
No puedo sacarme de la cabeza el último paseo que dimos juntos y cómo trotaba a mi lado como si fuera el día más feliz de su vida. No puedo olvidar cómo llegó a casa y estaba feliz y contento porque Puy también estaba allí, porque su manada estaba reunida. Ese brillo que tenía en los ojos me acompañará por el resto de mis días.
La memoria es un monstruo, evoca recuerdos por voluntad propia. Crees que tienes un recuerdo, pero es él quien te tiene a ti. Por eso no quiero olvidarlo, pero necesito dejar de pensar en él. Necesito retomar mi vida, decirle adiós, mirar hacia delante.
No sé cómo hacerlo, pero sacar lo que llevo dentro seguro que me ayudará. De ahí estas líneas, este homenaje al que ha sido mi fiel hermano durante 10 años. También he creado un blog, un sitio donde iré recopilando todas sus fotos y vídeos a medida que las vaya encontrando, un sitio sin enlaces ni widgets, sólo con sus fotos. Un sitio que no compartiré, que será sólo nuestro, de nuestra manada. Un sitio al que recurriré cada vez que la memoria me ataque, que ilustrará mis lágrimas y espero ponga una sonrisa en mi rostro.

También hemos donados sus cosas. Era tremendamente doloroso ver sus mantas, sus juguetes, su cuenco... Y no pudimos pensar en mejor homenaje a nuestro hermano que donar sus cosas a quien más lo pudiera necesitar.

Están ya en la Asociación TXIKAS DE ETXAURI, que trabaja por cada perro abandonado en el Centro de Protección Animal de Etxauri (Navarra), donde sabemos que muchos otros perros podrán disfrutar aún por mucho tiempo de sus cosas. Si también quieres echar una mano a esta asociación, su número de cuenta es el siguiente:

BANCO SABADELL 0081 7547 75 0001234830 Iban ES87 0081 7547 75 0001234830 BIC BSA BESBB -ASOCIACIÓN TXIKAS DE ETXAURI

Te aseguro que se trata de un grupo majísimo de personas muy muy comprometidas con esta labor totalmente altruista. Tras dejar las cosas de Moore intentamos dar una vuelta por el local y ver a los otros peludos, pero el corazón se nos partía de impotencia y tristeza, así que nos fuimos enseguida. Quién pudiera hacer algo más por ellos...

Creo que jamás le diré adiós del todo a Moore. Una parte de él siempre estará conmigo. Siempre me sobrarán dos o más horas al día, las que pasábamos solos los dos paseando y arreglando nuestro mundo a cada paso. Cómo me tranquilizaba, cómo sabía cuándo necesitaba más que nada sus caricias y su tierna mirada.. cómo me conocía.

No sabría qué más contar sobre Moore sin extenderme demasiado... Me hubiera gustado pasar un día más con él, dejarle comer sin límite y subirse a donde quisiera, permitirle dormir en nuestra cama, llevarlo a pasear sin correa hasta las tantas de la madrugada una vez más, como hacíamos en Madrid... Decirle lo bien que lo había hecho y lo buen perro que era, lo orgullosos que estábamos de él, lo mucho que le íbamos a echar de menos. Que esté donde esté ahora me espere, que lo quería mucho, muchísimo. Que siempre será mi perrito pequeño.
No sé cómo voy a seguir ahora, me cuesta sentarme a trabajar si no está él a mi lado. He cambiado los muebles de sitio con la esperanza de no ir a buscarlo con la mirada cada minuto. Ahora llega Semana Santa y tengo la esperanza de poder distraerme un poco y poco a poco volver a la carga. Pero tengo que ser sincero, me está costando. No he sido capaz de poner música, no quiero recordarle cada vez que suene una canción. Espero que nadie tenga el valor para decirme "era sólo un perro", porque no sabría qué hacerle...

Aunque también sé que gracias a la gente maravillosa que tengo a mi alrededor lo conseguiré. Gracias Puy por estar siempre, siempre, siempre ahí, sé que todo esto está siendo muy doloroso para ti. Pero juntos podemos con todo, ya lo sabes.

Y a ti que lees estas líneas, corre a darle un beso de nuestra parte a tu peludo preferido, o a todos si tienes más de uno, diles que una vez hubo un beagle blanco con manchas negras y marrones que habría sido su mejor amigo.

A mi ya no me quedan palabras ni lágrimas. Estas líneas han sido las más difíciles de escribir de mi vida y sólo han pretendido ser un pequeño homenaje a un amigo. Si has leído hasta aquí, gracias.
Y a ti, Moore, gracias por todo, te quiero bichito.

De todos es sabido (y si no ya te estás enterando) que en el interior de este pequeño escritor de las redes sociales llamado Iván, reside un estudiantes de Bellas Artes, especialista en Fundición Artística y además "manchatelas" desde que era chiquitito.

Si además me sigues en las redes, sabrás que en estos momentos me encuentro en un periodo de... no sé cómo llamarlo, ¿redescubrimiento? ¿reinvención? ¿barbecho? El caso es que el dibujo y la pintura siempre han representado para mi una válvula de escape, una manera de alejarme para ver las cosas con perspectiva. Realmente hacer cualquier cosa con las manos me produce ese efecto.

Ahora necesito recurrir a esa "terapia" y me he decidido por dar salida a una idea que andaba rondándome por la cabeza desde hacía tiempo, una pequeña serie de dibujos titulada "La evolución estaba equivocada" compuesta por algunas ilustraciones que iré "presentando" aquí a razón de uno por semana.

La primera de ellas:


La ilustración está realizada digitalmente utilizando una tableta gráfica Wacom Intuos Draw y el programa ArtRage 5.

Sé que no es una maravilla de obra, de hecho me he ido encontrando con algunos problemas que espero corregir en la siguiente, como es el tamaño de la propia ilustración, la definición y la adaptación a un medio que es en parte nuevo para mi. Me explico, desde hace años hago algunos pinitos dibujando digitalmente, pero hasta ahora había utilizado el iPad (iPad 1, soy así de cutre, pero aún tira... más o menos) y alguna tableta para sobremesa de dudosa calidad, con lo que nunca había estado mínimamente satisfecho con los resultados.

Ahora tampoco es que esté dando saltos de contento, pero quizás la búsqueda de abstracción de mi momento actual, como decía antes, está logrando que me obligue a recuperar parte de quien fui en algún momento, haciendo que se diluya, en parte, el miedo a la exposición. Yo me entiendo.

Como decía, soy consciente de los problemas del dibujo, pero en este ejercicio de autocrítica tengo tres poderosas razones para hacer pública la serie:
- La primera es porque quiero.
- La segunda es porque puedo.
- La tercera es porque como decía el amigo @CalvoconBarba en su blog, hay que atreverse a cagarla, pensamiento con el que cada día estoy más de acuerdo y creo que estoy demostrando desde hace un tiempo.

En fin, mucho que mejorar y aprender, pero ganas no faltan! Estaré encantado de recibir cualquier crítica (constructiva, eh!) u opinión a través de las redes, nos leemos!!


Últimamente tengo la sensación de que las publicaciones en los medios respecto a Twitter vienen acompañadas de cierta coletilla por parte de la red en la que pretenden dejar bien patente que "siguen luchando contra las cuentas bots". Y aunque muchos dudan de la veracidad de estas afirmaciones, sí que es cierto que un usuario avispado puede ir comprobando ciertos cambios que apuntan en esa dirección.
Sin ir más lejos, el último cambio se ha dado en TweetDeck, la plataforma multiusuario de Twitter:

Me di cuenta del detalle entrando en la herramienta para gestionar mis otras cuentas, ya saben, @Ivan_RG, @EmojisTwiter@SimbolosTwiter... Antes era posible seleccionar un Tweet y hacer RT de manera simultánea desde todas las cuentas dadas de alta en TweetDeck, sin embargo ahora hay que ir haciendo el RT con cada cuenta cada vez, de igual manera a cuando se hacía like, hay que desplegar el "pop-up" una vez para cada cuenta y RT.


No es un cambio especialmente significativo si como yo, gestionas sólo un par de cuentas y no tienes intención de hacer "nada raro", pero ponte en el lugar de esos "usuarios" que tienen añadidas decenas cuentas de cuentas automatizadas... Sí, no pongas esa cara, que te veo, no te hagas ahora el loco/a... Ya sabes que hay determinados indeseables por ahí que gestionan más cuentas de las que te puedas imaginar sólo con fines "oscuros", pero de eso ya hablaremos otro día.
Ojo, no me refiero a casos como CMs y gestores de comunidad que, por trabajo, necesitan tener muchas cuentas conectadas a Tweetdeck. En esos casos dudo muchísimo que alguna vez sea necesario hacer un RT de manera masiva como los casos de los que hablamos.

Justo en el momento de redacción de este post, el blog oficial de Twitter para desarrolladores publica el siguiente artículo: Automation and the use of multiple accounts, donde añade algo de luz a este asunto con Tweetdeck y anuncia además las nuevas reglas para desarrolladores que serán de obligado cumplimiento a partir del 23 de marzo de 2018, pudiendo llegar a ser incluso suspendidas las aplicaciones que no las cumplan.

De acuerdo con las nuevas reglas , los desarrolladores que usan la API de Twitter ya no podrán dejar que los usuarios:

  • Publiquen simultáneamente contenido idéntico o sustancialmente similar en varias cuentas.
  • Realicen acciones simultáneas como "Me gusta",  "Retweets", o seguimientos desde múltiples cuentas de manera simultánea.
  • Utilicen cualquier forma de automatización (incluida la programación) para publicar contenido idéntico o sustancialmente similar, o para realizar acciones como "Me gusta" o "Retweets", en las cuentas que hayan autorizado su aplicación (ya sea que haya creado o controle directamente esas cuentas).
Será interesante ver cómo aplican estas nuevas reglas algunas herramientas como Hootsuite... El objetivo de estas nuevas reglas parece claro, evitar que los bots utilicen aplicaciones de terceros para propagar spam.


Si investigamos mínimamente en el propio Twitter encontramos dos casos recientes de eliminación de cuentas que también nos hablan de esa supuesta guerra que ,mantiene Twitter contra las cuentas bots. Por un lado encontramos este Tweet de @justinhendrix que avisa de la eliminación de cientos de cuentas relacionadas con los conservadores estadounidense, como a podemos leer en Gizmodo.


Por ejemplo Bill Mitchell, una voz popular de la derecha que es conocida por sus polémicos Tweets que defienden al presidente Trump, afirma que perdió aproximadamente 4.000 seguidores de la noche a la mañana.


El caso es que "algo" parece estar haciendo Twitter contra las cuentas bots, aunque no sé si es debido a un error en la ejecución de la purga o a acciones predeterminadas, creo que no lo está haciendo de la manera adecuada. Lo que está claro es que si es todo real y no un "invent" de las cuentas de la derecha estadounidense,  vaya error de Twitter empezar por las cuentas que a mi entender, van a dar más que hablar ¿O quizás eso es lo que pretende, que se hable más de la plataforma?

Si miramos un poco más cerca, también en el espectro de Twitter en español vemos algunas "acciones extrañas" por parte de la red. Es el caso de #TwitterNosDaElCambiazo, que aglutina las denuncias de algunos usuarios (principalmente de izquierdas en este caso) que denuncian la desaparición de cantidades importantes de seguidores que son (esto es lo más sorprendente) sustituidos por cuentas bots.


En mi caso debo decir que también ha visto en las últimas semanas un descenso importante en mi número de seguidores, pero como estoy reviviendo este blog, igual es debido a que estoy más activo en Twitter y... cabrones!!! 😂😂😂 En cualquier caso, lo que no he conseguido detectar en mi cuenta es esa sustitución de seguidores reales por cuentas bots.
A tales extremos está llegando este caso que algunos usuarios han creado una cuenta de Twitter, @expectbigdata, desde la que, ante la ineptitud de Twitter España, están monitorizando los usuarios que se creen afectados por esta otra purga en busca de alguna aclaración. Estaremos pendientes.
Aunque quizás la respuesta a la pregunta sobre qué está pasando la haya dado ya nuestro querido @mediotic en ElDiario.es, apuntando la posibilidad de que "simplemente" se trate de un caso de shadow banning, teoría que veo bastante aplicable, ojo al vídeo:



Y defiendo esta postura basándome en una experiencia propia que paso a relatar. Hace poco más de un año me di cuenta gracias al aviso de varios amigos de que mis Tweets no aparecían en las respuestas a otros usuarios, como si fuera invisible. Por supuesto tampoco aparecían en las búsquedas ni al utilizar cualquier hashtag (algo que a veces ocurre en Twitter, pero esta vez era distinto).
El tema es que durante varios días, creo recordar que al menos 2 semanas, estuve de alguna manera "baneado" del sistema de Twitter. Mi cuenta seguía ahí, mis listas, mis seguidos, mis seguidores... pero si no entrabas a mi perfil, jamás te llegarían mis Tweets aunque fuesen una respuesta directa.
A los pocos días me di cuenta de que no estaba sólo, también se vieron afectados otros usuarios de mi entorno como @pacegar o @LuLaG_G entre otros. Directamente nuestros Tweets aparecían como "No disponibles" al desplegar una conversación.
Al final y tras varios formularios enviados a Twitter sin respuesta, a contactos personales con miembros el equipo de Twitter España, también sin respuesta claro, y tras llegar incluso a plantearme abandonar la red (sí, no saben lo que angustia publicar y saber a ciencia cierta que NADIE te lee...), todo se arregló y hasta el momento sigue bien.
¿Que si creo que fue algún  tipo de conspiración? No, pero sí tuve la sensación de ser una especie de conejillo de indias... es curioso que todo esto esté pasando justo un año después.

Lo que sí queda claro es que es una buena noticia que Twitter le haya declarado la guerra a los bots, aunque también creo que no hay que cabrearse mucho con este tema y tener en cuenta otros aspectos antes de pensar en teorías conspiranoides.
Por ejemplo piensa en la cantidad de cuentas de Twitter que están sin uso desde hace meses o años, provenientes de usuarios que una vez se hicieron la cuenta "para probar" o en un curso de redes sociales pero que jamás volvieron a utilizarlas. No sería descabellado pensar que Twitter pueda suspenderlas cautelarmente (para enviar el consiguiente email de recuperación de cuenta al propietario), y definitivamente si no hay reacción por parte del usuario. De esa manera el @nombre de usuario queda libre a los pocos meses.
Sé de buena tinta que Twitter está actuando así en estos momentos con las cuentas que son detectadas automatizando contenidos  sobre todo interacciones. Primero les avisa y si no hay reacción por parte del propietario, "se las carga" por completo. Tampoco quiero decir aquí que tooodas las cuentas que automatizan contenidos sean malas, ojo... ya me entiendes.


En fin, que quien quiera pensar mal está en todo su derecho, quizás no le falten razones, no seré yo quien apunte que es una casualidad macanuda que la nueva directora de Twitter España sea familia del rey y esas cosas... no seré yo!!!

Parece que el conflicto con los bots rusos le ha puesto las pilas a Twitter, tan sólo espero que la purga siga con la cabeza y el buen sentido común que debería, y no como hasta ahora, sin pies ni cabeza ni orden o concierto. Cuando Twitter quiere dar que hablar, desde luego no se queda corto. Seguiré atento.



Ya sabrás, si me sigues en Twitter, que desde hace algunos años hago mis pinitos con las extensiones de Google Chrome, sobre todo resolviendo mis propias necesidades a la hora de trabajar online.
Sin embargo, hasta el momento jamás las había hecho públicas, principalmente porque pensaba que cubrían carencias propias y no les daba la debida importancia. Pero he decidido que es el momento de  ir más allá que algún simple Tweet y contar un poco más sobre algunas de ellas.
En esta ocasión me gustaría hablar de "Delete this site Cookies", una de mis primeras incursiones en las extensiones y que probablemente me habría ahorrado ya algunas horas (si sumamos cic a clic) desde que la hice pública y la instalé en mis equipos.


La "misión" de la extensión es tan sencilla como su propio nombre indica, borrar las cookies del sitio que estás visitando en este momento.
Habrás observado que la extensión no tiene página propia de aterrizaje que sabes que es algo característico de mis proyectos,  pero es que allá por 2015 no se me ocurría ningún nombre de dominio apropiado, y la verdad sigue sin ocurrírseme. Además, la extensión es taaaan sencilla que no sé si merece la pena ¿Qué opinas?

En fin, sigo contando más cosas.

La necesidad en este caso surgió porque @Jmchia y un servidor nos encontrábamos en pleno desarrollo de algunas características de Pirendo que requerían que cada dos por tres el que suscribe tuviese que borrar las cookies del navegador y comprobar algunas nuevas prestaciones. En fin, cosas de programadores, recarga, recarga, borra cookies, recarga y vuelve a borrar, ahora a la pata coja...
Al final a Jose se le ocurrió que si utilizaba un marcador para el navegador que al pulsarlo me borrase únicamente la cookie del sitio que estabas visitando, ahorraríamos tiempo. Además me evitaría el tener que estar restableciendo contraseñas en todos los servicios en que estaba logueado y que se habían cerrado al borrar todas las cookies del navegador (era lo más rápido).
Como por aquel entonces yo comenzaba a interesarme por las extensiones, decidí transformar ese código inicialmente preparado como marcador por Jose en esta extensión. Sip, by the face, lo que hay, para eso están los amigos! 😘

El funcionamiento es muy muy sencillo, desde la Chrome Web Store instalas la extensión en tu navegador Chrome:
Disponible en la Chrome Web Store
A continuación sólo tienes que pulsar el botón de la extensión en tu navegador cuando necesites borrar las cookies de la página que estás visitando:


Para confirmar que la cookie se ha borrado, se desplegará un pequeño "pop-up". Ahora sólo tienes que recargar la página que estabas visitando y será como si no hubieras pasado por allí:


En el tiempo que lleva online la extensión ha acumulado 487 usuarios, supongo que porque los programadores son unos pesados y será porque al fina es una pequeña ayuda para aquellos que necesitan recargar permanentemente una página y eliminar sus cookies para ver resultado de actualizados de nuevos diseños, nuevos elementos agregados, etc.

"Delete this site Cookies" es una extensión para Google Chrome sin pretensiones, como dicen por ahí, que "hace exactamente lo que dice", muy sencilla de instalar y utilizar.
Disponible en la Chrome Web Store
Si la instalas y te parece útil por favor no te olvides de puntuarla positivamente y dejar un comentario en la Chrome Web Store!

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 es la primera vez que comparto una de ellas, espero que les sea muy útil!

Suscribirte por RSS: Rss