Borrar metadatos personales de OpenOffice y LibreOffice

Son famosas las cagadas con los metadatos de políticos, valga este mismo como ejemplo y Chema Alonso tiene muchos más en su blog, cuando intentan falsear o filtrar una información «comprometedora». Para ciertas cosas es útil estar gobernado por inútiles, no lo niego (es que si además de desalmados llegan a ser listos íbamos a estar bien jodidos).

Existen muchas herramientas para borrar los metadatos de OpenOffice y Libre Office, pero si no buscamos una seguridad paranoica, sino simplemente evitar que vayan datos junto al archivo como nombre, dirección… hay formas sencillas de hacerlo.

Si estás elaborando un documento nuevo, lo mejor es guardarlo ya sin los metadatos. Es fácil configurar el OpenOffice para que lo haga:

  • Te vas al menú Herramientas y allí seleccionas Opciones.
  • En opciones, en el árbol de la izquierda eliges Seguridad. En la derecha verás un apartado Opciones de Seguridad y alertas. Allí pulsas el botón Opciones.
  • Dentro del menú que se te abrirá marcas Elimina la información personal al guardar.

libre office

Con esto ya logras que el archivo se guarde sin tus datos personales. ¿Y con los archivos ya guardados?. Bueno, los archivos nativos de OpenOffice y LibreOffice realmente son un archivo comprimido (en tar.gz creo) que podéis abrir con cualquier compresor/empaquetador (7zip, FileRoller, WinZip…) y donde podéis ver varios xml que forman el documento. Los metadatos están guardados en meta.xml así que, si borráis ese archivo (o lo modificáis para eliminar lo que no queréis que salga) está arreglado, muerto el perro se acabó la rabia. También tenéis otros xml por ahí como el settings, donde se guardan datos sobre impresoras, servidores… que pueden ser sensibles. Incluso se podría hacer un script que borre estos metadatos, si buscáis un poco seguro que hay más de uno colgado (y si no, pedidlo y me curro uno en algún artículo).

En fin, otra ayudita para vuestro anonimato y que no os pase como a muchos politicastros. Si queréis algo más profundo y currado, a Chema Alonso me remito again.

Scripts para parar, arrancar y reiniciar Apache y MySQL en Ubuntu

Muchos desarrolladores tenemos en nuestro equipo un entorno LAMPP para testear nuestros trabajos web. Como generalmente uso el ordeador para trabajar tengo configurado que arranquen con el equipo por defecto tanto MySQL como Apache, ya que rara vez estoy ON en mi equipo y no estoy trasteando con algo de código.

Pero a veces, para virtualizar o para trabajar con algún editor de vídeo me veo obligado a tener toda la memoria posible para que la cosa no se torne inusable
. Cierto que son sólo dos líneas en el terminal… pero con cada script las dejo en una sola:

Script para parar Apache 2 y MySQL:

#!/bin/bash/

sudo apache2ctl -k stop
sudo /etc/init.d/mysql stop

Script para arrancar Apache2 y MySQL

#!/bin/bash/

sudo apache2ctl -k start
sudo /etc/init.d/mysql start

Y finalmente, script para reiniciarlos

#!/bin/bash/

sudo apache2ctl -k restart
sudo /etc/init.d/mysql restart

Te dará una serie de warnings, pero ni caso, funciona (compruébalo intentando conectar con MySQL o intentando ver algunha página en local).

En fin, por hoy nada más.

AngularJS: animaciones con scroll

No tenía muy claro cómo titular esta entrada, dado que su título original es AngularJS: Scroll Animations. Como en ocasiones anteriores se trata de una «traducción-no-literal»/explicación de un artículo tutorial en inglés.

En fin, ¿a qué nos referimos con esto de animaciones con scroll? Seguro que habéis visto más de una página que las tiene. Se trata de animaciones que se activan conforme vas haciendo scroll en la página, al alcanzar una determinada posición. La web Let’s Free Congress es presentada con ejemplo de esto en el texto original.

AngularJS logo

La idea es que la animación comience cuando el usuario llegue a la parte de la pantalla, para lo cual nos serviremos de la directiva scrollPosition, que se nos presenta así en el ejemplo original

.directive('scrollPosition', ['$window', '$timeout', '$parse', function($window, $timeout, $parse) {
    return function(scope, element, attrs) {

        var windowEl = angular.element($window)[0];
        var directionMap = {
          "up": 1,
          "down": -1,
          "left": 1,
          "right": -1
        };

        // Recuperamos el elemento con el scroll
        scope.element = angular.element(element)[0];

        //Almacenamos los elementos que escuchan a este evento
        windowEl._elementsList = $window._elementsList || [];
        windowEl._elementsList.push({element: scope.element, scope: scope, attrs: attrs});

        var element, direction, index, model, scrollAnimationFunction, tmpYOffset = 0, tmpXOffset = 0;
        var userViewportOffset = 200;

        function triggerScrollFunctions() {

          for (var i = windowEl._elementsList.length - 1; i >= 0; i--) {
            element = windowEl._elementsList[i].element;
            if(!element.firedAnimation) {
              directionY = tmpYOffset - windowEl.pageYOffset > 0 ? "up" : "down";
              directionX = tmpXOffset - windowEl.pageXOffset > 0 ? "left" : "right";
              tmpXOffset = windowEl.pageXOffset;  
              tmpYOffset = windowEl.pageYOffset;  
              if(element.offsetTop - userViewportOffset < windowEl.pageYOffset && element.offsetHeight > (windowEl.pageYOffset - element.offsetTop)) {
                model = $parse(windowEl._elementsList[i].attrs.scrollAnimation)
                scrollAnimationFunction = model(windowEl._elementsList[i].scope)
                windowEl._elementsList[i].scope.$apply(function() {
                  element.firedAnimation = scrollAnimationFunction(directionMap[directionX]);  
                })
                if(element.firedAnimation) {
                  windowEl._elementsList.splice(i, 1);
                }
              }
            } else {
              index = windowEl._elementsList.indexOf(element); //TODO: Add indexOf polyfill for IE9 
              if(index > 0) windowEl._elementsList.splice(index, 1);
            }
          };
        };
        windowEl.onscroll = triggerScrollFunctions;
      };   
    }]);

Tal directiva se ha utilizado en este ejemplo. En ella podéis ver como la barra de la pantalla del móvil progresa según bajáis la barra.

En fin, la cosa es explicar ahora como usar esto. Como en el ejemplo original, iremos desgranando poco a poco el código, despedazándolo para ver cómo funciona.

Lo principal es añadir la directiva al elemento que queremos animar:

.row.show-for-large-up
  .teaser(scroll-position, scroll-animation='fireupApplicationDesignAnimation')
    .row
      .large-6.columns.left-align.margin-top
        h1(data-i18n="_CareerDesign_APPLICATIONDESIGNTITLE")

Esto le dice a AngularJS que cuando el usuario llegue al área determinada del DOM debe dispararse la animación. En vuestro controlador deberíais tener algo así

$scope.fireupApplicationDesignAnimation = function(scrollDirection) {
        scrollDirection > 0 ? reduceAmount() : aumentAmount(); // We want to increase on scrollDown
        setOffsetForImage();
    };

La directiva envía al controlador la dirección del scroll, lo que permite mostrar animaciones basadas en él. En ocasiones querrás ejecutar la animación sólo una vez en lugar de que ocurra cada vez que el scroll esté a su altura. Puedes lograrlo devolviendo un valor true y chequeándolo antes de lanzar la animación, como en este ejemplo:

$scope.fireupMarketingDesignAnimation = function() {
      if(!firedMarketingAnimation) {
        window.animations.marketingAnimation.init();
        firedMarketingAnimation = true;
        return firedMarketingAnimation;  
      }
    }

Como podéis ver en el ejemplo la función que lanza la animación está dentro de un if que hará que sólo se ejecute una vez.

En fin, resumiendo ¿Cómo funciona la directiva?. El proceso es el siguiente:

  • Crea un array de elementos que requieren un eventListener del tipo onScroll. Puedes tener varios almacenados, y si devuelves un true para una sola ejecución serán eliminados para reducir el uso de memoria.
  • Añade un eventListener onScroll que comprueba en qué parte de la página está el usuario.
  • Recorre tus elementos vinculados con la directiva comprobando si se han activado las animaciones.
  • Si no lo han hecho y el usuario se posiciona junto a ellas con el scroll entonces se activan. Esto obliga a hacer mucho uso de $parse, así que léete bien su documentación para entenderlo al 100%.
  • Si la animación llamada a través de scope devuelve true, la extrae del array, como dijimos en el primer punto.

La conclusión:

La directiva es útil cuando necesitas lanzar varias animaciones en un periodo de tiempo específico. También te permitirá definir un comportamiento específico según la posición del scroll o hasta para realizar cambios en propiedades CSS3 relacionándolas con la posición de la página.

En este ejemplo en Codepen, creado por el autor del artículo original, podéis ver cómo también funciona en horizontal. Si movéis el scroll lentamente veréis como el balón lo sigue. Eso sí, probad con Chrome porque a mi en Firefox en lugar de una pelota se me ve una especie de mojón raro.

En fin, finalmente recomendar el blog de jjperezaguinaga Surviving by Coding, donde podréis encontrar mucha info sobre AngularJS y otros temas de desarrollo web, en inglés.

Firefox: evitar tracking, que no rastreen tus datos

Ayer hablábamos del complemento Collusion como una gran herramienta para saber a qué webs envían información las webs que visitamos. Y como ya os dije, Collusion sirve para diagnosticar, pero no para combatir. Sabemos quién envía a quién, pero olvídate de cortarles el grifo con eso.

Tranquilos, ya os dije que había opciones para evitar que nos sigan. La primera, como podréis ver en la web de Mozilla, viene de forma nativa en el navegador. Por si no entendéis la explicación en inglés, os la repito por aquí:

  • Pulsáis el botón Firefox de la parte superior izquierda.
  • Os metéis en Opciones.
  • Ahí buscáis Privacidad.
  • En Rastreo activáis el checkbox «Decir a los sitios web que no quiero ser rastreado».

Luego le dais a OK y vía.

Pero claro, esto para según qué páginas puede no ser suficiente, y podéis necesitar un complemento para evitar el tracking. Desde aquí vamos a hablar de dos: Do Not Track Plus y Ghostery.

logotipo Ghostery

Ambas cumplen perfectamente la función de evitar el tracking, si bien Ghostery es la que está recibiendo mejores críticas por parte de los usuarios, ya que te da mayor flexibilidad a la hora de bloquear las cookies (Do Not Track Plus lo bloquea todo, Ghostery bloquea lo que quieras bloquear), te permite participar (si quieres) en una recogida de estadísticas para elaborar un ranking de sitios potencialmente invasivos y se trata de un proyecto Open Source, mantenido por la comunidad y con gran transparencia.

Do Not Track Plus Logo

En cualquier caso, ya ves que gozas de buenas herramientas para poder evitar las intromisiones habituales de ciertos sitios en tu red. Y si quires mayor seguridad, siempre puedes recurrir a las redes Tor.

Collusion: Comprueba a dónde envían tus datos las webs que visitas

Con el asunto de PRISM, el espionaje de la NSA, los diversos proyectos europeos (en España tenemos SITEL espiándonos desde 2009, por cierto que es curioso como ciertos medios atacaron a Rubalcaba por implantarlo pero no han comentado nada de que el gobierno de Rajoy lo siga utilizando), las filtraciones de Snowden… en fin, todo esto ha puesto la seguirdad y la paranoia en primera línea de información.

Ahora la gente empieza a preguntarse «¿Qué hacen las grandes compañías con mis datos?», empiezan a ser conscientes de que los millones de Facebook y Google tienen que salir e algún sitio y de que «si no pagas tú eres el producto». Por suerte muchos ya llevaban tiempo pensando esto, y más en el campo del desarrollo y de la seguridad web.

Collusion es un término que hace referencia a cuando dos personas u organizaciones se asocian para perjudicar a una tercera. También es un proyecto de Mozilla que vio la luz en 2012 y que nos permite saber, mediante un complemento del navegador, a quién envían la información las páginas que visitamos. Veremos burbujas de tres colores: azul para los sitios que visitamos, rojas para los anunciantes y blancas para webs que reciben alguna información. Luego el software generará un gráfico tipo telaraña uniéndolas para monstrarnos las relaciones. En algunos casos son cosas esperables (Google Analytics u otros servicios de estadísticas, Gravatar…) y en otros en cambio nos encontramos cosas sorprendentes (y desagradables).

gráfico collusion
Gráfico de collusion generado en sólo un día de uso.

Collusion es una buena herramienta para conocer quién conoce qué sobre nosostros, que podemos integrar como complemento en nuestro navegador Mozilla. Eso sí, sólo nos vale como herramienta de análisis, no nos protegerá del seguimiento. Tranquilos, hay formas de hacerlo, y mañana os hablaré de un complemento que os ayudará con eso.

AngularJS: Introducción y Hello World

Llevo unos días trasteando con el framework de Javascript AngularJS, libre y mantenido por Google. En su momento no lo incluí en mi pequeña selección de frameworks a ir mirando, pero al final he acabado por dedicarme a trastear con él. De momento tampoco he avanzado mucho, que este mes estoy liado, pero en el futuro os iré comentando.

Comencemos por la primera pregunta ¿para qué vale AngularJs? En fin, la idea de este framework es dinamizar las páginas HTML estáticas vinculando elementos de ese HTML con un modelo de datos que hemos definido en Javascript (a mano, o desde un JSON), permitiendo la interactividad con el usuario. En este caso, aunque se usa un patrón MVC la potencia es que nos permite, mediante bindings {{}} , acceder a la funcionalidad o a los datos. Es cierto que el resultado final lo podemos conseguir de otras muchas formas, pero AngularJS nos ahorrará muchas líneas de código. Algunos lo comparan ya con lo que significó jQuery en su momento para el desarrollo en Javascript.

AngularJS Logotipo
AngularJS

Para descargaros Angular, que por cierto cada versión tiene un nombre más delirante que la anterior (al momento de escribir esto estamos en la Monochromatic Rainbow, pero mi favorita es Flatulent Propulsion), podéis hacerlo desde la página del proyecto. Y desde la documentación de esa misma página he sacado el código para el primer ejemplo: un Hello World!. Pero claro, como hablamos de un framework que dota de actividad a vuestro CSS será más bien un Hello ______ (loquesea).

Empezamos, como siempre, por el marcado:


    <html ng-app>
      <head>
<script class="hiddenSpellError" type="text/javascript">// <![CDATA[
src</span>="http://code.angularjs.org/angular-1.0.2.min.js">
// ]]></script>
<script class="hiddenSpellError" type="text/javascript">// <![CDATA[
src</span>="script.js">
// ]]></script>
 </head>
 <body>
 <div ng-controller="HelloCntl">
 Your name: <input type="text" value="World" />
 <hr/>
 Hello {{name}}!
 <div>
 </body>
 </html>

Bien, como puedes ver en la cabecera cargamos como un script la librería de AngularJS (está copiado de un ejemplo antiguo, así que revisa cual es la última versión en el momento en que lo hagas) y debajo cargamos otro script con lo que hayamos programado en Javascript. Puedes ver que al div le hemos asignado un atributo llamado ng-controller. La idea de esto es definir que ese div estará dentro del ámbito del controlador que le indicamos (recuerda, estamos trabajando en un modelo MVC). Luego verás que al input le hemos puesto también un atributo, en ese caso ng-model. Lo mismo, estamos vinculando ese atributo al ámbito del modelo de datos definido, o explicado de forma más simple: el texto que hay ahí será el modelo de datos y se llamará name. Finalmente ves que al lado de Hello hemos incluido {{name}}, esencialmente la idea es que ese elemento entre llaves está relacionado en el elemento del modelo con el mismo nombre (que a su vez está relacionado con el input) ¿qué va a ocurrir? Pues el llamado two-way-data-binding: modificarás el modelo desde la vista y justo al mismo tiempo verás como los datos de la vista se modifican.

Ahora vamos con la parte del javascript, donde definimos el controlador y el modelo:

    function HelloCntl($scope) {
       $scope.name = 'World';
    }

Como puedes ver aquí definimos la función HelloCntl, que fue la que vinculamos en el marcado al div. Abajo simplemente hacemos que, por defecto, el nombre que aparezca sea World (para formar el Hello World). Si bien, si lo modificamos veremos como este cambia.

Logo AngularJS

Finalmente vamos a hablar de otro de los fuertes de AngularJS: el testeo del código. Porque AngularJS nos permite escribir test para comprobar el correcto funcionamiento, sin tener que meternos en absurdas y largas pruebas con algún complemento del navegador para depurar javascript. El teste sería este:

    it('should change the binding when user enters text', function() {
        expect(binding('name')).toEqual('World');
        input('name').enter('angular');
        expect(binding('name')).toEqual('angular');
    });

Si queréis ver en acción todo el ejemplo antes de testearlo vosotros, en la página de Angular (de donde lo he copiado yo) podréis hacerlo. Además de ver otros, como un juego del tres en raya.

En fin, ya puedes hacerte una idea de la potencia de este AngularJS, más adelante espero escribir más sobre el tema. Yo lo veo como una potente herramienta, sobre todo para el desarrollo de Apps móviles con HTML5 y CSS.

También añadiré que la principal idea es usar AngularJS con Node.js en el lado del servidor, si bien podéis desde ese lado el lenguaje que prefiráis (Ruby, PHP, Python).

Títulos de apertura con CSS3

En fin, para empezar este artículo sobre animaciones sobre títulos en CSS3 primero echad un ojo a esta página de ejemplo.Vamos a trabajar para hacer algo similar (bueno, de hecho para hacer ese ejemplo).

Ojo, yo no me he currado el css en este caso, me la encontré mientras me documentaba para otra cosa a través de este artículo, y creo que merece que lo traduzca/explique en castellano.

Años atrás un efecto como este sólo sería posible con Flash, pero ahora podemos hacerlo con la tecnología nativa de los navegadores (bueno, como siempre con la excepción de nuestro querido Internet Explorer, al menos hasta la versión 10). Cierto que en este caso también hay ayuda de un poco de Javascript, no es CSS puro, pero se trata de una simple librería que permitirá trabajar con las letras por separado sin tener que crear nosotros a mano un span para cada una. La biblioteca de JS a utilizar será Lettering.js.

Por tanto vamos primero con el marcado. Crearemos un div para envolverlo todo y meteremos dentro de él todas las frases a usar como títulos de segundo nivel (h2):

</pre>
<div class="hiddenSpellError">class="os-phrases"></div>
<pre></pre>
<h2>Sometimes it's better</h2>
<pre>
    <h2>to hide</h2></pre>
<h2>in order to</h2>
<pre>
    <h2>survive evil</h2>
    <h2>Thanatos</h2>
    <h2>This fall</h2>
    <h2>Prepare</h2>
    <h2>Refresh to replay</h2>
</div>

Ok, ya tenemos el marcado. Como dije antes, toca meter una línea de javascript (en este caso, con jQuery además)

$("#os-phrases > h2").lettering('words').children("span").lettering().children("span").lettering();

Esto lo que hará será, primero, separar cada título en palabras y cada palabra en letras, y además cada letra está metida en dos span distintos con la misma clase. En la página original podéis ver un ejemplo de cómo sería hacer eso codeándolo a mano.

Muy bien, ya tenemos la parte de marcado lista, a base tanto de código manual como de javascript para facilitar las tareas. Toca ponerse manos a la obra con el CSS.

Lo primero será lograr que nuestros títulos ocupen el 100% de la página, posicionado de forma absoluta, en mayúsculas y bien tocho:

.os-phrases h2 {
    font-family: 'Dosis', 'Lato', sans-serif;
    font-size: 70px;
    font-weight: 200;
    height: 100%;
    width: 100%;
    overflow: hidden;
    text-transform: uppercase;
    padding: 0;
    margin: 0;
    position: absolute;
    top: 0;
    left: 0;
    letter-spacing: 14px;
    text-align: center;
}

Right now! Este paso ya está listo, el título es bien tochaco. Eso sí, podría pasar que no se ajustase bien a todos los tamaños de pantalla, así que vamos a usar flexbox para solucionarlo.

.os-phrases h2,
.os-phrases h2 > span {
    height: 100%;
    /* Centrando con flexbox */
    display: flex;
    flex-direction: row;
    justify-content: center;
    align-items: center;
}

El siguiente paso es meter espaciado entre palabras:

.os-phrases h2 > span {
    margin: 0 15px;
}

Y ahora vamos a ver el por qué de los dos span para cada letra. Al primero de ellos le vamos a aplicar perspectiva:

.os-phrases h2 > span > span {
    display: inline-block;
    perspective: 1000px;
    transform-origin: 50% 50%;
}

Las letras en si serán transparentes y les meteremos una animación, que durará 5.2 segundos.

.os-phrases h2 > span > span > span {
    display: inline-block;
    color: hsla(0,0%,0%,0);
    transform-style: preserve-3d;
    transform: translate3d(0,0,0);
    animation: OpeningSequence 5.2s linear forwards;
}

Con esto ya ves la lógica del doble span.

Una vez tenemos la orientación de las letras toca definir los delays de las frases. La quinta frase, la que es el título de la «película imaginaria» tendrá un delay especial, aparecerá más lentamente. En cambio las secuencias 6 y 7 irán más rápido.

.os-phrases h2:nth-child(2) > span > span > span {
    animation-delay: 5s;
}

.os-phrases h2:nth-child(3) > span > span > span {
    animation-delay: 10s;
}

.os-phrases h2:nth-child(4) > span > span > span {
    animation-delay: 15s;
}

.os-phrases h2:nth-child(5) > span > span > span {
    font-size: 150px;
    animation-delay: 21s;
    animation-duration: 8s;
}

.os-phrases h2:nth-child(6) > span > span > span {
    animation-delay: 30s;
}

.os-phrases h2:nth-child(7) > span > span > span {
    animation-delay: 34s;
}

Antes de meternos con la última frase, que tendrá un tratamiento más especial, toca definir cómo se comportarán las letras durante la animación (es decir, cómo va evolucionando la separación, la opacidad, etc durante la animación):

@keyframes OpeningSequence {
    0% {
        text-shadow: 0 0 50px #fff;
        letter-spacing: 80px;
        opacity: 0.2;
        transform: rotateY(-90deg);
    }
    50% {
        text-shadow: 0 0 1px #fff;
        letter-spacing: 14px;
        opacity: 0.8;
        transform: rotateY(0deg);
    }
    85% {
        text-shadow: 0 0 1px #fff;
        opacity: 0.8;
        transform: rotateY(0deg) translateZ(100px);
    }
    100% {
        text-shadow: 0 0 10px #fff;
        opacity: 0;
        transform: translateZ(130px);
        pointer-events: none;
    }
}

Ok, con esto ya tenemos todo lo relativo a todas las frases… menos la última, que ya dijimos que tendría un tratamiento especial, ya que la animación será distinta al resto, usando en este caso un fundido:

.os-phrases h2:nth-child(8) > span > span > span {
    font-size: 30px;
    animation: FadeIn 4s linear 40s forwards;
}

@keyframes FadeIn {
    0% {
        opacity: 0;
        text-shadow: 0 0 50px #fff;
    }
    100% {
        opacity: 0.8;
        text-shadow: 0 0 1px #fff;
    }
}

Y ahora pensarás «¿No había algunas palabras destacadas?». Y tienes razón, algunas estaban en negrita. Pero tranqui, eso lo arreglamos con esta última línea, donde aplicamos la negrita a ciertas palabras concretas:

.os-phrases h2:first-child .word3,
.os-phrases h2:nth-child(2) .word2,
.os-phrases h2:nth-child(4) .word2 {
    font-weight: 600;
}

En fin, ya ves que es un pelín tocho el código pero que tampoco come a nadie, y se logra un resultado muy espectacular. Si no os apetece copiar, el código original está en este enlace.

A la hora de terminar este artículo, la web original estaba en remodelación. Pero echadle un ojo por si acaso porque cuando vuelva a estar activa tiene muchos trucos de diseño web muy interesantes, como todos los que ha colgado la creadora de este efecto Mary Lou.

Eliminar Genius Box

Ya sabéis que de vez en cuando me toca hacer labores de mantenimiento de equipos. Generalmente cuando alguien me trae un equipo es con algún Windows y les está funcionando lento. Lo habitual es que el disco duro esté muy fragmentado, el arranque de Windows no esté muy optimizado, haya un montón de basura en los archivos temporales, el registro esté hecho un Cristo… y rara es la vez que no aparece algún malware.

El último con el que me he topado es con Genius Box Pop Up. El típico adware que se instala a traición en tu equipo (como Lollipop) cuando descargas software de ciertas páginas y del que luego no hay dios que se libre. En este caso se instala como un complemento en el navegador. Como puede venir con programas lícitos la mejor forma de no infectarse es descargar el software de la web del fabricante y andar con ojo durante la instalación porque suelen colar como letra pequeña un checkbox donde te preguntarán si quieres instalarlo o no (y por defecto vendrá marcado como sí).

Resumiendo, que este adware se te va a instalar como un complemento del navegador y te va a dar la murga mientras navegas al más puro estilo del antes citado Lollipop o del Babylon Search.

Pero don’t worry man, que es eliminable en unos cómodos pasos:

    • Lo primerito, te vas a Panel de Control, a la opción de Quitar o reparar Programas y desde ahí intentas eliminarlo (puede que te deje o puede que no, pero tú prueba).
    • Lo segundo, vete a cada navegador, a su opción de eliminar complementos y bórralo. Aquí tienes como hacerlo en Firefox , aquí como apañarte con Explorer, aquí de Chrome y, para acabar, aquí de Opera. La extensión debería llamarse Genius Box o Genius Box Pop Up.
    • Ahora tocar reiniciar, y en el arranque pulsas F8 hasta que te salga el menú para elegir MODO SEGURO CON FUNCIONES DE RED.
    • Una vez reiniciado y con el modo seguro con red puesto te vas a la web de Malwarebytes y te lo descargas. Lo instalas, le dejas que haga la actualización (siempre te pedirá hacer una al acabar de instalarse) y lo pones a hacer un análisis completo (no te explico cómo porque es muy intuitivo). Cuando acabe le das a que repare todo el malware encontrado.
    • Te descargas, cuando acabe, el AT Destroyer, lo instalas, lo ejecutas y en la pantalla principal pulsas BUSCAR Y DESTRUIR. Si pilla algún archivo infectado te lo mostrará en rojo.
    • Y finalmente te descargas CCleaner, lo instalas, limpias el historial y la basura del equipo y usas la herramienta de registro para dejarlo bien reparadito.
    • Antes de acabar desinstala AT Destroyer (y si tienes un antivirus también Malwarebytes, porque si no crearán conflictos)

Y con esto ya está solucionado el asunto del coñazo de Genius Box. Y ahora vete con más ojito para que no te vuelva a pasar.

Importar datos desde un fichero CSV a una tabla de SQLite

Ya hemos hablado en el pasado de ficheros CSV en este blog, y hoy vuelven a la primera línea.

En este caso porque ayer estaba aconsejando a un amigo sobre cómo agilizar una tarea de inserción de datos en SQLite y llegamos a la conclusión de que, teniendo los datos en un fichero CSV tenía que haber una forma de importarlo. El caso es que San Google nos dio la respuesta, pero me fijé en que no había mucha cosa válida sobre el tema en español. Total, que me he decidido a traducir la entrada que nos fue más útil, que fue esta de HackGeo. Bueno, como siempre no será una traducción literal, sino una adaptación/explicación de su solución.

En fin, como dice el artículo original, hay una serie de puntos a considerar antes de ponerse a trabajar:

  • SQLite instalado en tu sistema operativo.
  • Una base de datos ya creada (si quieres seguir el ejemplo del original, podéis descargar ejemplos de código desde allí)
  • Una tabla creada en esa base de datos cuyos campos y tipos coincidan con los datos de nuestro CSV, tal que así:
    CREATE TABLE counties (
        name        CHAR,
        state       CHAR,
        state_abbrv CHAR( 2 ),
        FIPS        CHAR( 5 )
    );
    
  • Un fichero CSV cuyo esquema coincida con vuestra tabla, como por ejemplo:

    Maui,Hawaii,HI,15009
    Kauai,Hawaii,HI,15007
    Kalawao,Hawaii,HI,15005
    Honolulu,Hawaii,HI,15003
    Hawaii,Hawaii,HI,15001

Ahora, siguiendo el ejemplo original, ya tenemos todos los datos y el software listos. Ya sólo quedan cuatro pasos para tener todo listo:

  1. Lanza un terminal
  2. Abre la herramienta de terminal de comandos de SQLite, escribiendo sqlite3 y pasándole como parámetros la ruta absoluta a vuestra base de datos:
    sqlite3 '/Path/To/HackGeo - SQLite CSV Import Example/HackGeo.db'
    
  3. Pon la coma como separador por defecto (si usas tu propio CSV y no el del ejemplo entonces define el separador que corresponda, en caso de que no sea la coma):
    .separator ','
    
  4. Ahora ejecuta el importador de SQLite para volcar los datos del CSV en tu equipo. Le tenemos que pasar dos parámetros a este comando: la ruta del csv y el nombre de la tabla donde insertaremos los valores:
    .import '/Path/To/HackGeo - SQLite CSV Import Example/Counties.csv' counties
    

Y sólo con esto ya tenemos los datos pasados del CSV a la base de datos SQLite. Ya podéis cerrar el terminal de línea de comandos y empezar a trabajar con vuestros nuevos datos. Y si sabéis inglés en HackGeo tenéis muchos artículos interesantes sobre desarrollo, sistemas, etc…

Eliminar virus del FBI de OS X y Safari (Mac)

Aunque dije que no daría soporte a Maqueros en mi blog, al final acabo siendo blando y comentando alguna cosilla. Además, los inconscientes suelen ir por la vida sin antivirus ni cuidado porque les han dicho que «para Mac no hay virus».

En fin, seguro que hace unos meses… bueno, realmente hace más de un año, leísteis por aquí cómo eliminar el virus de la policía. En fin, pues ahora los usuarios de Mac tienen su propia versión de dicho malware, al menos según ha detectado la gente de Malwarebytes. Como en Mac todo es más grandilocuente en este caso este ransomware en lugar de amenazarte haciéndose pasar por la policía lo hace como si fuera el FBI (mucho más glamouroso, donde va a parar).

Virus FBI Safari OS X
Captura de pantalla del virus desde la web de Malwarebytes

Por suerte para el usuario maquero el virus es menos jodón que en Windows (alguno dirá «ves, hasta los virus son más sencillos de usar en mi Mac»), básicamente porque en lugar de secuestrar el sistema secuestra el navegador Safari (eso pasa por usar Safari y no un navegador de verda). Esto hará que cuando el usuario entre en dicho navegador le salga la página de «El FBI te va a joder pero bien» y si intenta salir una función de Javascript le bloqueará, obligándole a matar el proceso del navegador.

Virus FBI pop up OS X Safari
Captura del mensaje que no te deja cerrar el navegador

La desinfección es simple: basta con borrar la caché del navegador, el historial del navegación y las cookies. Al hacer esto la página maliciosa desaparecerá del navegador y el usuario ya podrá volver a navegar normalmente. Es decir, secuestro al guano.

Javascript Virus FBI Safari OS X
Parte del Javascript que bloquea tu navegador, sacado de MalwareBytes

Curiosamente el otro día descargando un juego del Google Play (tranquilos, fue retirado a los pocos minutos) me instaló un malware similar en el navegador nativo de Android (que me redireccionaba por javascript y no me dejaba navegar), y la solución era la misma: borrar caché, borrar datos del navegador… y pista.