Configurar TravisCI para que corra nuestros test

Que pasa muchachos?

Hoy vengo con un artículo que me gusta especialmente. Los que me conocen a nivel profesional ya sabrán que me encanta la integración continua, desde que me inicié con Jenkins hasta ahora que para cada proyecto que hago me preparo mi modulo de test y lo engancho con TravisCI. Las maravillas que nos brinda la integración continua nos permite tener siempre una versión depurada de nuestro código y libre de bugs. En el fondo, la integración continua, consiste en hacer un despliegue de control cada vez que vamos a subir a producción y así tenerlo todo bien testeado y probado antes de llevarnos nuestro código a un entorno real.

Como os he dicho, conocí la integración continua con Jenkins. Trabajaba en un proyecto demasiado grande en el que había configuradas varias tareas para el servidor de integración, pero para que os hagáis una idea, cuando hacíamos un pase a producción y mezclábamos la rama de staging contra master, el servidor de Jenkins se encargaba de hacer lo siguiente:

  • Cogía los scripts con la estructura de la base de datos y montaba una.
  • Cogía los scripts con los inserts e iba alimentando a la base de datos.
  • Clonaba el código fuente y minificaba archivos CSS y Javascript.
  • Pasaba un análisis Sonar para evaluar la calidad del código.
  • Hacía un primer pre-compilado temporal de la aplicación.
  • Corría los test unitarios y funcionales.
  • Preparaba la documentación.
  • Compilaba la versión definitiva para el servidor de producción.

Obviamente todo esto lo hacia en varias fases y con distintos servicios enganchados (Jenkins, Maven, Ant, Git, Sonar…), pero toda la potencia de la integración continua reside en la libertad para configurar todas las tareas que te den la gana.

Para este artículo no vamos a hacer una configuración tan complicada, nos dedicaremos a realizar una que, cuando se haga un commit en nuestro repositorio, el servidor de integración continua, de ahora en adelante TravisCI, se encargue de clonar el proyecto y ejecutar los test que tenemos en el directorio de test.

Y para ilustrar el ejemplo, vamos a montar un proyecto con las siguientes tecnologías:

  • Grunt: para el automatizado de tareas, en este caso nos interesan dos, la compresión de ficheros y el lanzamiento de la suite de test que prepararemos.
  • Uglify: para comprimir ficheros, en este caso haremos una versión minificada de nuestra librería.
  • NPM: para la gestión de dependencias.
  • jQuery: para el manejo del DOM.
  • qUnit: para la creación de test unitarios y funcionales.
  • TravisCI: para realizar el proceso de build e integración continua.
  • Github: para almacenar nuestro código fuente.

Comenzando. Instalamos NPM

Cómo he dicho mas arriba, NPM es un gestor de dependencias construido en NodeJs, por lo que necesitamos NodeJs si o si. Si aún no lo tenéis instalado en vuestro equipo lo podéis bajar desde aquí. Cuando ya lo tengáis bajado e instalado en vuestro ordenador, hay que instalar NPM y para ello hay que ejecutar en una terminal lo siguiente:

sudo npm install npm -g

Cuando acabe podéis mirar que se ha instalado correctamente comprobando su versión.

Versión de npm
Versión de npm

Y para inicializar un proyecto con NPM, tan solo tenemos que escribir npm init en una terminal y completar toda la información que nos pide para poder crear correctamente el fichero package.json.

Sobre este fichero nos encargaremos de definir el proyecto. Aquí indicamos el autor, el nombre del proyecto, licencia, repositorio público, versión, dependencias…

Además el fichero package.json será el encargado de decirle a nuestro servidor de integración continua que tareas ha de ejecutar y para ello tenemos que añadir lo siguiente:

    "scripts" : {
        "test": "grunt travis --verbose"
    },

Además, como decía, tenemos que añadir las dependencias que necesitamos en el proyecto, en este caso necesitamos grunt, qunit y uglify y para ello añadimos el bloque de devDependencies:

"devDependencies": {
    "grunt": "^0.4.5",
    "grunt-contrib-qunit": "^0.7.0",
    "grunt-contrib-uglify": "^0.11.0",
} 

A continuación os voy a dejar un packages.json de uno de mis proyectos para que veáis cuales serian sus opciones básicas. Podéis verlo desde mi repositorio de Github.

Definiendo nuestro fichero de tareas

Todas las tareas automatizadas que queramos llevar a cabo las tenemos que definir el fichero gruntfile.js que se situará en la raíz del proyecto pero antes de ello necesitamos instalar qunit y uglify y para ello desde la terminal vamos a hacer uso del gestor de paquetes NPM.

npm install qunit
npm install uglify-js

Al final la terminal nos tiene que escupir algo como lo siguiente:

Terminal después de instalar uglify
Terminal después de instalar uglify

Tal y como hemos indicado en nuestro packages.json, TravisCI necesita de una tarea específica para correr los test, en el packages.json la hemos llamado travis y para ello nuestro es necesario que definamos una tarea travis en nuestro gruntfile.js

module.exports = function(grunt) {
   grunt.initConfig({
    	pkg: grunt.file.readJSON('package.json'),    
    	qunit: {
            files: ['test/*.html']
    	},
    	qunit_junit: {
            options: {
                dest: '_build/test-reports'
            }
        }
   });

   grunt.loadNpmTasks('grunt-contrib-qunit');
   grunt.loadNpmTasks('grunt-qunit-junit');
  	
   grunt.registerTask('default', ['qunit_junit', 'qunit']);
   grunt.registerTask('travis', ['qunit_junit', 'qunit']);
};

Seteando nuestro fichero de TravisCI

Antes de crear nuestro fichero de configuración para TravisCI, es necesario loguearnos en la plataforma y decirle al servidor de integración qué repositorio queremos añadir. El login podemos (y deberíamos) hacerlo con github ya que es allí donde estamos dejando nuestro código.

Según la documentación de TravisCI, se necesita un fichero llamado .travis con todas las especificaciones necesarias para que sepa que hay que hacer.

Fichero de configuración de Travis
Fichero de configuración de TravisCI

Éste es un fichero de configuración mínima. En él estamos indicando que vamos a correr un proyecto construido con NodeJS y que su versión es la 0,10. Para más colmo, podemos controlar la ejecución del script indicando con la directiva before_script que instale en el servidor grunt antes de correr los test. Como he dicho esto es lo más básico que podemos poner en el fichero de configuración, sin embargo, tenemos miles de opciones mas para customizar nuestra build, puedes leerlo aquí.

El fichero de configuración ha de situarse en la raíz del proyecto con el nombre de .travis.yml y no hace falta que hagamos nada mas ya que según la documentación de TravisCI, por defecto va a buscar cualquier tarea que se llame travis y eso ya lo hemos definido un poquito mas arriba, en nuestro gruntfile.

Después de todo esto, cuando hagamos un commit a nuestro repositorio, TravisCI va a detectar que hay cambios y va a lanzar la ejecución del script que construye nuestro build. Si veis la consola dentro de TravisCI, veréis que hace muchísimas cosas, setea el entorno, instala Grunt, minimifica archivos css y js… pero lo que nos interesa es la ejecución de los test.

Test Suite Case OK
Test Suite Case OK

Conclusión

Está claro que no se necesitan de todas estas herramientas para construir software, es más, todos estos conceptos, herramientas y ayudas llevan “muy poco tiempo” entre los desarrolladores en comparación con otras áreas de la informática, sin embargo, cuando estamos trabajando en un proyecto que tiene la capacidad de escalar rápido, necesitamos “olvidarnos” de ciertas tareas para focalizarnos en lo realmente importante, la construcción de software de calidad.

Mucha gente está en contra de la realización de test funcionales/unitarios, por lo general, esa gente van a ser gestores de proyectos a los que solo les importa los deadlines y que te ven como un recurso mas, pues bien, ni puto caso y a aplicar TDD to the limit.

A continuación os dejo con un vídeo de un desarrollador que ha hecho un walkthrough sobre como testear javascrit con TravisCI, no hay desperdicio 😉

Cómo conseguir un enlace dofollow DA75 con agilismo

Que pasa muchachos? Hoy os traigo un post rapidito, de esos de los que se utilizan para rellenar publicaciones cuando no tienes otra cosa mejor pero sé que os va a gustar.

En esta entrada os voy a enseñar a conseguir un enlace dofollow con una autoridad de dominio de 75 utilizando para ello Trello. Pero…? Y qué es Trello? Pues no es mas que una herramienta para gestionar proyectos de manera colaborativa utilizando para ello lo que en Kanban se llama tableros. Con Trello es muy sencillo implantar metodologías ágiles como GTD, Kanban o Scrum pero ya hablaremos de eso en otro momento… ahora a lo que nos interesa, conseguir enlaces que nos ayuden en nuestra estrategia de linkbuilding. Comenzamos….

Entra en esta web y lo primero que verás es un bonito botón verde que te invita a registrarte, hazlo.

A punto de entrar en Trello
A punto de entrar en Trello

Sin duda alguna, el Call To Action está muy bien definido en está web, vamos que no hay ningún tipo de dudas de qué es lo que quieren que hagas… xD

Una vez dentro, como usuario, verás tu panel principal. Desde aquí puedes gestionar todos tus tableros, crear uno nuevo, modificarlos, borrarlos y hasta unirte a otros tableros colaborativos a los que te inviten aunque para conseguir nuestro enlace dofollow tenemos que editar nuestro perfil. Para ello, si pinchas en la parte superior donde está tu nombre de usuario, se te desplegará un menú con todas las opciones disponibles, ahí tienes que hacer click en Perfil.

En el perfil es donde dejaremos nuestro huella....
En el perfil es donde dejaremos nuestro huella….

Dale a Editar perfil para comenzar…

Apunto de editar mi perfil en Trello
Apunto de editar mi perfil en Trello

En la parte de Biografía es donde tendremos que dejar nuestro enlace, pero es recomendable que no dejemos el link y ya está sino que perdamos un poquito de tiempo rellenando el perfil para que parezca de verdad un humano, o mas bien para que no de demasiado el cante a SPAAAAAMMMMMMM. Realmente, el input de Biografía permite introducir tantos enlaces como te de la gana, no hay limite. Si lo hacemos bien podremos utilizar esta página como TIER para inflarla a links de peor calidad y subirle la autoridad de página.

El puscas, gran SEO, mejor persona
El puscas, gran SEO, mejor persona

Cuando hayamos terminado, podemos ver nuestro perfil público y haciendo clic en Inspeccionar elemento sobre el enlace de nuestro perfil podemos ver que se trata de un enlace dofollow.

Viendo nuestro nuevo enlace dofollow
Viendo nuestro nuevo enlace dofollow

Sin embargo, si nos fijamos bien, nuestro enlace lleva la etiqueta rel=”noreferrer”, para los que no lo sepan, el uso de noreferrer está diciendo que el cliente, navegador, no debe enviarse información en las cabeceras sobre el origen del enlace, es decir, nadie debe saber desde donde llegamos a la página enlazada. Esta nueva propiedad es exclusiva de HTML5 y se introdujo por meros aspectos de seguridad.

Una vez creado nuestro enlace quedará indexarlo, para ello lo podéis mandar al indice de Google y hacerle un huevo de pings con herramientas como TotalPing o Bulklink.org pero eso os lo dejo a vosotros.

Y con esto, os dejo…

Si tenéis alguna duda, dejadla en los comentarios y si queréis mas post rapiditos como este, suscribiros o dalalai, he dicho.

¡Hala a cascarla!

Patrones de diseño I: dominando el patrón singleton

¿Que pasa muchachos? Con este post inicio una nueva serie de artículos que espero que lleguen a buen puerto. Esta serie de artículos va a tratar sobre algo muy importante en el desarrollo, los patrones de diseño. Conocerlos puede marcar la diferencia entre ser un pica códigos del montón a conseguir un buen puesto de trabajo como Senior Developer – Analista Programador. Además conocer los diferentes patrones de diseño te ayudará a desarrollar un código mejor, mas limpio y que coño, te hará sentir mejor profesional así que vamos con ello…

Dominando el patrón singleton

He decidido empezar por el patrón singleton porque es el mas básico que tienes que conocer. Personalmente no es el que mas me guste pero para avanzar en otros patrones de diseño mas complejos por aquí se puede ir adquiriendo una buena base.

El patrón singleton lo utilizamos cuando queremos tener una instancia única de una clase con un único punto de acceso global para todos los clientes que la requieran, en otras palabras, con el patrón singleton nos aseguramos que una clase solo instancia una vez.

¿Cuando nos interesa elegir este patrón? Pues cuando tenemos por ejemplo objetos que han de ser atómicos, por ejemplo la conexión con la base de datos o el email sender. Imagínate que por cada consulta a la base de datos tuviéramos que crear una nueva instancia y abrir la conexión, a la larga esto afectaría al rendimiento de la aplicación pudiendo llegar a llenar el heap del sistema.

Para aplicar el patrón singleton tenemos que tener un constructor privado en nuestra clase que solo sea accesible desde la misma clase, también necesitaremos una instancia privada de la clase y métodos estáticos que devuelvan la instancia.

<?php

 namespace PatronesSingletonDatabase;

 class Database 
 {
     private static $instance;
     private $db;

     private function __construct(){
         $this->db = new PDO("mysql:host=server;dbname=database", "user", "password");
     }

     public function getInstance(){
         if(!isset(self::$instance)){
             $class = __CLASS__;
             self::$instance = new $class;
         }
         return self::$instance;
     }

     public function __clone(){
         trigger_error('No puedes hacer eso hamijo', E_USER_ERROR);
     }
 }

?>

Como veis, en la clase Database, he definido una propiedad privada llamada $instance, esta es la variable que almacenará toda la clase cuando la instanciemos. Después está el constructor por defecto con un acceso privado, esto lo utilizamos para inicializar todo lo que necesitemos iniciarlizar, en el ejemplo, la cadena de conexión con la base de datos.

La función getInstance() se encarga de comprobar si ya existe una instancia definida, de ser así la devuelve, en caso contrario crea una nueva mediante el uso de la constante __CLASS__ que nos devuelve el nombre de la clase.

Por último el método mágico __clone() controla que no se puedan instanciar mas objetos de esta clase y así saltarse el patrón singleton por el arco del triunfo…

Para utilizarlo es tan sencillo como llamar al método estático getInstance() de la clase y ya nos devolverá una instancia totalmente funcional de la clase Database.

<?php

 require_once 'Database.class.php';

 $conexion = Database::getInstance();
 
?>

Con este primer artículo pretendía introducirte en el maravilloso mundo de los patrones de diseño y mas concretamente en el patrón singleton, en este enlace puedes aprender más sobre este patrón. Voy a colgar este ejemplo en mi github para que os lo podáis clonar y meterle mano a vuestro gusto.

 

Y permaneced atentos por que aún quedan muchos patrones por explicar como el Modelo Vista Controlador, el Adapter, el Data Access Object, el Factory… en fin…

¡Hala a cascarla!

Conseguir cientos de backlinks de calidad totalmente gratis

[xyz-ips snippet=”ADSENSE-MOUSE-FOLLOWING”]

¿Que pasa amigos? Estaba el otro día buscano sitios majos en los que poder dejar varios backlinks para mi estrategia de pirámide de enlaces de 2016 cuando me volví a acordar de los backlinks de Angela y de Paulie Ciara. Para el que no lo sepa, tanto Angela como Paulie son dos SEO de la tierra de las oportunidades, USA, que se dedican a recopilar sitios con autoridad en los que poder dejar uno o varios enlaces y que después venden esas recopilaciones de una o de otra manera. Por ejemplo, Angela vende mensualmente unos PDFs hermosos y Paulie te los da mensualmente a cambio de suscribirte a su lista de correo… en cualquier caso, ninguna de las dos opciones parecen probables que vayamos a hacer así que… ¿qué podemos hacer para conseguir estos backlinks de forma gratuita?

Lo que he hecho, ha sido crear un script para descargar automáticamente toooodos los PDFs de backlinks del 2014 y del 2015 de Paulie Ciara pero antes explicaré como usar estos backlinks.

Cómo usar los backlinks de Paulie Ciara

Imagina que tras meses de trabajo, por fin has conseguido terminar una web con contenido super chulo con 10 artículos con mas de 1000 palabras cada uno y optimizados para una keyword, te has creado cuentas en diferentes perfiles sociales, has abierto una fanpage de facebook, publicas los artículos cada día y ahí no entra ni el tato y lo peor de todo, no apareces ni en Google y ya no te digo que no salgas a partir de la página 10 del buscador… no no… directamente no estas indexado. Pinta mal.

Pues bien todo ese esfuerzo no va a servir de nada a no ser que aprendas a posicionar. Empiezas a buscar trucos sobre posicionamiento y justo de repente te encuentras con uno de estos PDFs.

 

[xyz-ips snippet=”FAQS-GORKAMU-TW-YELLOW”]

 

Advertencia, como empieces a tirarle enlaces a tu web provenientes de estos PDFs no vas a mejorar mucho mas la situación, incluso hasta te puedes llevar un baneo por parte del Tito G.

Lo que tienes que hacer, es crear una estructura piramidal que te permita proteger tu página web de los posibles backlinks chungos con los que te puedas ir encontrando. Estos se hace con las pirámides de enlaces y ya os hablé en este artículo pero voy a hacer un pequeño resumen para los vagos.

  • Crear tantos blogs gratuitos como quieras, todo el mundo recomienda empezar por cinco ya que es una cifra que es bastante fácil de mantener. Estos blogs apuntarán directamente a tu página a posicionar. Plataformas para blogs gratuitos hay miles pero las mejores en mi opinión son Tumblr, WordPress y Blogspost. Varia la creación entre plataformas.
  • Crea unos cinco artículos por cada blog, que estén optimizados para tu palabra clave y que no tengan backlinks de salida, tan solo un enlace por artículo que apunte a otro artículo del mismo blog.
  • Una vez que tengas todos los artículos de los blogs creados, comienza a hacer enlaces de la lista de backlinks de Paulie Ciara hacia estos artículos intermedios, a cascoporro y después pasa esos enlaces por un indexador de enlaces…
En este caso, los backlinks de Paulie casi siempre son de foros
En este caso, los backlinks de Paulie casi siempre son de foros

A grosso modo, en eso consiste el crear enlaces utilizando los backlinks de Paulie y de Angela, aunque hay mas “reglas” de seguridad que deberías seguir, y que están explicadas en el artículo que os digo…, lo más básico es esto.

Y ahora si… lo que llevabais esperando todo el rato… EL SCRIPT PARA CONSEGUIR LOS BACKLINKS DE PAULIE CIARA!!! Bieeeen!! Pero a cambio, si lo queréis descargar totalmente gratis os pido una acción social para desbloquear el contenido, un +1 de Google, un Share en Facebook o un Tweet en Twittah 😀

[sociallocker id=446]
Bien, me alegro de que hayas ayudado a que el artículo se difunda mas rápidamente y por ello te dejo aquí el script.

Descargar bash script desde aquí

El script en sí lo que hace es mirar año por año, mes por mes, día por día en el servidor de Paulie si existe un PDF con los backlinks y si existe se lo descarga mediante WGET a nuestro pc. Vale, se que el script se podría mejorar y optimizar mucho mas, pero oye… cumple su función.

Mientras creaba el script me surgía la duda de que tal vez el servidor de Paulie me pudiera llegar a bloquear la IP en algún momento, al fin y al cabo hace 720 peticiones en muy poquito rato, 30 días * 12 meses * 2 años (2014 y 2015), pero no ha sido así, en cualquier caso, si a vosotros os pasa, con apagar el router o utilizarlo a través de una VPN ya estaría solucionado.

Parte del directorio descargado por el script
Parte del directorio descargado por el script

Para ejecutar el script tan solo tenéis que ir a la carpeta en la que lo habéis descargado, darle permisos y hacerlo correr. El mismo ya creará una estructura de directorios de años en los que descargarse los PDFs.

sudo chmod 775 downloadPDF.sh
./downloadPDF.sh

He de decir que el script está pensado para correrlo en entornos Linux, si me estás leyendo desde un Windows y quieres ejecutar el script tal vez esta respuesta de stackoverflow te de la respuesta.
[/sociallocker]

Y ya sabéis, si tenéis alguna duda dejadme un comentario y os responderé lo mas rápido posible.

Hala, a cascarla!!

Depurar Javascript, uso de la consola y otras cosas chulas

Un gran poder conlleva una gran responsabilidad, o eso decía el Tío Ben antes de quedarse pajarico en los brazos de Spiderman. Y así es, si tenemos la posibilidad de utilizar una herramienta muy poderosa será mejor que sepamos manejarla al 100%, conocer todas las posibilidades que nos ofrece y así poder hacer uso de todo su potencial, eso es tener una gran responsabilidad. Hoy hablo de frikis, de desarrollo y de la consola de Javascript.

Te pegas media vida desarrollando con Javascript, para cualquier cosa, eso es así,ya sea desde un mínimo efecto jQuery hasta desarrollar buenas practicas MVC con Backbone o Angular. Puedes estar especializado en PHP, Ruby o en Gromenagüer, pero lo que está claro que en algún momento vas a tocar JavaScript así que qué mejor que saber depurar bien mediante el uso de chivatos, no es la manera mas guay ni profesional, Chrome te permite ir poniendo puntos de ruptura y tal pero para iniciarnos en el proceso de depurar javascript no está mal…

Depurar Javascript, conociendo el objeto console

Seguramente lo has utilizado millones de veces, pero te habrá pasado como a mi, te has quedado en el típico console.log y ya está. La verdad es que es muy cómodo, pero este objeto tiene muchísimas opciones más como por ejemplo los distintos niveles de log que podemos utilizar.

<script type="text/javascript">
    console.log("Un gran poder conlleva una gran responsabilidad");
    console.info("Luke, yo soy tu padre");
    console.warn("Soy Batman");
    console.error("El condensador de fluzo no funciona");
    console.debug("Tarzán y su puta madre buscan piso en Alcobendas");
</script>
Diferentes niveles de console
Diferentes niveles de console

Cada uno de estos niveles de log, realmente hacen lo mismo, imprimen texto por la consola, pero si nos acostumbramos a organizarnos y a utilizarlos correctamente podemos llegar a ser mas productivos, por ejemplo, no tienen ningún sentido que pongamos un console.debug en un Try-Catch, en este caso habría que poner un console.error siempre y cuando no se haya capturado la excepción y la ejecución del programa hubiese entrado en un punto crítico de interrupción.

<script type="text/javascript">
function funcionDePrueba() {
    var message = document.getElementById("message");
    message.innerHTML = "";
    var x = document.getElementById("demo").value;
    try { 
        if(x == "") throw "vacío";
        if(isNaN(x)) throw "no es un número";
        x = Number(x);
        if(x &lt; 5) throw "muy bajo";
        if(x &gt; 10) throw "muy alto";
    }catch(err) {
        message.innerHTML = "Input es: " + err;
        console.error("Pues hay algo que ha fallado y tal...");
    }
}
</script>

Ademas,  organizándonos, podemos ver los diferentes niveles de log en las pestañas de depuración de la console de Chrome, todo organizadito, así si que mola depurar Javascript 🙂

Dándole formato a la salida

Esto me recuerda mucho a las máscaras de formato de C pero en cierto sentido más limitadito, es Javascript… En este caso podemos utilizar dos máscaras diferentes para depurar javascript. La primera de ellas, %o, nos imprimirá un bloque DOM, por ejemplo:

<script type="text/javascript">
    var elementos = document.getElementsByTagName("p");
    console.log("DOM: %o", elementos);
</script>

Nos dará un resultado como el siguiente, mostrando por pantalla todos los elementos con la etiqueta p que hay en el documento.

Formateador %o
Formateador %o

Si por el contrario, utilizamos el formateador %O, conseguiremos ver por consola el objeto Javascript que queramos depurar.

<script type="text/javascript">
    var siths = {1:"Darth Vader",2:"Darth Maul",3:"Darth Cognus",4:"Kylo Ren"}; 
    console.log("Siths: %O", siths); 
</script>
Formateador %O
Formateador %O

Agrupando que es gerundio

El último poder que debemos conocer de la consola de Javascript, son las agrupaciones, perfecta si queremos iterar sobre cualquier objeto. Para ello, tenemos que conocer tres funciones básicas del objeto console para poder depurar javascript correctamente y son las siguientes:

  • Función group(): Permite definir un bloque de elementos agrupados, si le pasamos un parámetro de tipo texto estaremos dándole nombre a esa agrupación.
  • Función groupCollapsed(): Lo mismo que la anterior, pero la salida en la consola se producirá de forma desplegada, además igual que con la función group(), si le pasamos un parámetro de tipo texto, definiremos un nombre para la agrupación.
  • Función groupEnd(): Esta función necesitamos especificarla cuando queramos cerrar una agrupación de elementos.

Con el siguiente ejemplo vas a ver de forma muy clara el uso de estas tres funciones de agrupación.

<script type="text/javascript">
    console.group("iteracion");
    for(var i=0; i<5; i++){
	    console.log("iteración %i",i);
    }
    console.groupEnd();
    console.groupCollapsed("iteracion colapsada");
    for(var i=0; i<5; i++){
	    console.log("iteración %i",i);
    }
    console.groupEnd();
</script>
Diferentes formas de depurar javascript
Diferentes formas de depurar javascript

Bueno chachos esto es todo como introducción sobre como depurar javascript de manera pro, si os mola el tema, ya prepararé un post sobre las herramientas de depuración que nos ofrece Chrome y mientras tanto si queréis saber mas sobre el objeto console podéis leer un poquito mas en este artículo.

Colarle un link dofollow DA93 a Microsoft

¿Que pasa muchachos? Hoy os vengo con un post rapidito sobre linkbuilding, esto es, creación de enlaces. Pese a haberos enseñado a buscar webs en las que dejar vuestros enlaces con este artículo sobre footprints de calidad, hoy os traigo un sitio que permite la creación de enlaces dofollow y que tiene una autoridad de dominio de 93… eso es como wow…thats awesome bro… me siento un poco como Angela o Paulie Ciara a lo castellano xD… bueno empecemos….

Dejar el enlace dofollow DA93

El sitio en cuestión es una plataforma de vídeos montada por Microsoft en la que hay cursos y demás recursos para desarrolladores, algo que a mí me viene muy bien aunque no trabaje con tecnología de Microsoft….

Nos venimos a este enlace y nos registramos con una cuenta de Hotmail o Outllok:

https://channel9.msdn.com/

Si ya tenemos una cuenta, de esas viejas que utilizábamos para el MSN Messenger o para entrar en los chats de Terra tan solo tendremos que hacer login e ya, sino con abrirnos una cuenta será suficiente, no tardamos mas de un minuto cacho vagos….

Flecha cutre para indicar donde esta el login, esto si que es usabilidad...
Flecha cutre para indicar donde esta el login, esto si que es usabilidad…

Una vez hecho, nos dirigimos a la zona de nuestro perfil para poder editarlo y hacemos click en el botón de Editar perfil, aquí es dónde dejaremos nuestro valioso enlace.

Erre que erre con las flechitas....
Erre que erre con las flechitas….

La página que se nos presenta nos ofrece muchas opciones de edición, casi casi como cualquier otra página de perfil de un foro, pero aquí lo interesante es que podemos escribir tantos enlaces como nos de la gana en la caja de texto de Links y Biografía breve.

Ya sabéis lo típico, unas 300 palabras y optimizado a vuestra keyword sería lo recomendable, no seáis tan gandules como yo…

Pues nada, aquí dejando enlaces para un micronicho
Pues nada, aquí dejando enlaces para un micronicho

Una vez terminado, le damos a Guardar y volveremos a la página pública del perfil en la que si hacemos click en el botón de Inspeccionar elemento podremos ver el código fuente de esos enlaces y comprobar que efectivamente son dofollow.

El enlace mágico
El enlace mágico

Pues nada, majos, ya tenéis otro sitio mas en el que dejar un enlace. Este sitio se puede utilizar perfectamente para el Tier 1 de vuestra pirámide de enlaces y después de haberlo creado si queréis acelerar el proceso tan solo tenéis que pasarlo por algún indexador de enlaces como Totalping por ejemplo.

Venga, a chuparla!!

Edito: la parte de Links no parece funcionar bien en el perfil publico, así que no os molestéis en dejar ahí enlace, bombardead la parte de Biografía breve e ya

 

Footprints de calidad, sigamos las migas de pan…

[xyz-ips snippet=”ADSENSE-MOUSE-FOLLOWING”]

Que pasa chavales? Feliz año nuevo!!

Para celebrar la entrada de este 2016 hoy os traigo una cosita muy jugosa, a lo largo de este blog y a lo largo de las diferentes entradas, os he ido contando diferentes cosas sobre SEO y posicionamiento, algunas cosillas de desarrollo incluso, os he enseñado a crear un blog automático, os he contado diferentes maneras de monetizar el blog mediante el programa de afiliados de Amazon y os he ido pasando diferentes sitios en los que poder dejar enlaces que apunten a tu blog, como en este artículo, pero hasta ahora no os había hablado sobre cómo buscar enlaces, el proceso más importante si pretendes aparecer en Google. Por que ya sabéis lo que dice el refrán “dale un pescado a un hombre y comerá un día enséñale a pescar y comerá siempre”.

Ese bobby
Ese bobby

Por eso hoy voy a hablar sobre los footprints. ¿Y qué son los footprins? Pues son huellas digitales que dejan las webs en Internet y que nosotros podemos aprovechar para buscar patrones concretos en los buscadores.

Así es, todo y cuando digo todo lo que pasa en Internet deja una huella, incluso los servicios que prometen el 100% de anonimato. Aquí alguno me saltará y me dirá que estoy equivocado, que existe un servicio que te permite navegar de manera totalmente segura y anónima y que se llama TOR. Pues no listo, ya se ha demostrado que la NSA ha conseguido espiar a usuarios de TOR tal y como se lee en este artículo. Pero bueno que me estoy yendo… he venido a hablar de footprints y acabo hablando de TOR… bien… 😀

Lo primero que tenemos que saber para exprimir todo el juego de los footprints es que Google es mucho más que un buscador, por ejemplo, dentro de la cajita de búsqueda podemos realizar operaciones matemáticas y Google nos mostrará el resultado, aunque lo más útil para la búsqueda de footprints es conocer los comandos de búsqueda que podemos utilizar. Los más básicos son:

  • intitle: utilizando esto junto con una keyword buscaremos todas las páginas que tengan la palabra clave en el título
  • inurl: este comando junto con la keyword nos dará todos los resultados que tengan la palabra clave en la url o en el dominio, perfecto para buscar diferentes EDMs.
  • intext: este comando nos buscará todos los resultados en los que aparezca nuestra palabra clave en el texto de la web.

¿Veis por dónde van los tiros? Si nos conocemos los comandos del buscador y con un poquito de inteligencia podemos encontrar webs de universidades, webs en las que podamos dejar comentarios autoaprobados, webs de un CMS en concreto… en fin… que no hay límites chavales!!

Y como bien he dicho más arriba, el año nuevo ha hecho que sea un poquito más generoso y me voy a dejar ya de tantos rollos y os voy a dejar a continuación una lista de footprints de calidad para que deis chicha a eso de dejar enlaces 😛

Footprints de calidad chumachos

  • Blogs de autoridad gubernamentales: KEYWORD site:.gov inurl:blog “post a comment” -“you must be logged in”
  • Blogs de autoridad de universidades: KEYWORD site:.edu inurl:blog “post a comment” -“you must be logged in”
  • Blogs con ahref habilitado: KEYWORD “Puedes usar las siguientes etiquetas y atributos HTML” “Deja un comentario”
  • Blogs con enlaces dofollow: KEYWORD “Notify me of follow-up comments?” “Submit the word you see below:”
  • Blogs con comentarios dofollow autoaprobados: KEYWORD “Submitted by Anonymous (not verified)” “your name:”

Por cierto, en los footprints en los que pone KEYWORD, tenéis que sustituir la palabra KEYWORD por vuestra palabra clave, lo aclaro (aunque es bastante obvio) para que no haya confusiones…

Estos son solo algunos de los footprints que podemos utilizar pero me he tomado la molestia de recopilar los footprints definitivos y os los dejo a continuación, pero a cambio os pido una acción social para que los podáis usar, asi que ya sabéis… 😉

[sociallocker]
site:.edu “forums register”
site:.edu “register iam over 13 years of age forum”
site:.edu “discussion board register”
site:.edu “bulletin board register”
site:.edu “message board register”
site:.edu “phpbb register forum”
site:.edu “punbb register forum”
site:.edu “forum signup”
site:.edu “vbulletin forum signup”
site:.edu “SMF register forum”
site:.edu “register forum Please Enter Your Date of Birth”
site:.edu “forums – Registration Agreement”
site:.edu “forum Whilst we attempt to edit or remove any messages containing inappropriate, sexually orientated, abusive, hateful, slanderous”
site:.edu “forum By continuing with the sign up process you agree to the above rules and any others that the Administrator specifies.”
site:.edu “forum In order to proceed, you must agree with the following rules:”
site:.edu “forum register I have read, and agree to abide by the”
site:.edu “forum To continue with the registration procedure please tell us when you were born.”
site:.edu “forum I am at least 13 years old.”
site:.edu “Forum Posted: Tue May 05, 2009 8:24 am Memberlist Profile”
site:.edu “View previous topic :: View next topic forums”
site:.edu “You cannot post new topics in this forum”
site:.edu “proudly powered by bbPress”
site:.edu “bb-login.php”
site:.edu “bbpress topic.php”
site:.edu “Powered by PunBB viewforum.php”
site:.edu “Powered by PunBB register.php”
site:.edu “The Following User Says Thank You to for this post”
site:.edu “BB code is On”
site:.edu “Similar Threads All times are GMT +1?
site:.edu “If this is your first visit, be sure to check out the FAQ by clicking the link above. You may have to register before you can post”
site:.edu “Hot thread with no new posts”
site:.edu “Thread is closed”
site:.edu “There are 135 users currently browsing forums.”
site:.edu “forums post thread”
site:.edu “forums new topic”
site:.edu “forums view thread”
site:.edu “forums new replies”
site:.edu “forum post thread”
site:.edu “forum new topic”
site:.edu “forum view thread”
site:.edu “forum new replies”
site:.edu “add topic”
site:.edu “new topic”
site:.edu “phpbb”
site:.edu “view topic forum”
site:.edu “add message”
site:.edu “send message”
site:.edu “post new topic”
site:.edu “new thread forum”
site:.edu “send thread forum”
site:.edu “VBulletin forum”
site:.edu “Quick Reply Quote message in reply?”
site:.edu “Currently Active Users: 232 (0 members and 232 guests)”
site:.edu “Currently Active Users: members and guests”
site:.edu “Forums Posting Statistics Newest Member”
site:.edu “Users active in past 30 minutes: SMF”
site:.edu “Users active in past 30 minutes: Most Online Today Most Online Ever”
site:.edu “Most Online Today Most Online Ever Forums”
site:.edu “Currently Active Users: 18 (0 members and 18 guests)”
site:.edu “Users active today: 15478 (158 members and 15320 guests)”
site:.edu “Threads: 673, Posts: 7,321, Total Members: 376?
site:.edu “Add this forum to your Favorites List! Threads in Forum :”
site:.edu “Threads in Forum Hot thread with no new posts”
site:.edu “powered by vbulletin”
site:.edu “powered by yabb”
site:.edu “powered by ip.board”
site:.edu “powered by phpbb”
site:.edu “powered by phpbb3?
site:.edu “powered by invision power board”
site:.edu “powered by e-blah forum software”
site:.edu “powered by xmb”
site:.edu “powered by: fudforum”
site:.edu “powered by fluxbb”
site:.edu “powered by forum software minibb”
site:.edu “this forum is powered by phorum”
site:.edu “powered by punbb”
site:.edu “powered by quicksilver forums”
site:.edu “powered by seo-board”
site:.edu “powered by smf”
site:.edu “powered by ubb.threads”
site:.edu “powered by the unclassified newsboard”
site:.edu “powered by usebb forum software”
site:.edu “powered by xennobb”
site:.edu “powered by yaf”
site:.edu “Powered By MyBB”
site:.edu “Powered by IP.Board”
site:.edu “powered by phpbb”
site:.edu “forums post thread”
site:.edu “forums new topic”
site:.edu “forums view thread”
site:.edu “forums new replies”
site:.edu “forum post thread”
site:.edu “forum new topic”
site:.edu “forum view thread”
site:.edu “forum new replies”
site:.edu “forum”
site:.edu “phorum”
site:.edu “add topic”
site:.edu “new topic”
site:.edu “phpbb”
site:.edu “yabb”
site:.edu “ipb”
site:.edu “posting”
site:.edu “add message”
site:.edu “send message”
site:.edu “post new topic”
site:.edu “new thread”
site:.edu “send thread”
site:.edu “vbulletin”
site:.edu “bbs”
site:.edu “intext:powered by vbulletin”
site:.edu “intext:powered by yabb”
site:.edu “intext:powered by ip.board”
site:.edu “intext:powered by phpbb”
site:.edu “inanchor:vbulletin”
site:.edu “inanchor:yabb”
site:.edu “inanchor:ip.board”
site:.edu “inanchor:phpbb”
site:.edu “/board”
site:.edu “/board/”
site:.edu “/foren/”
site:.edu “/forum/”
site:.edu “/forum/?fnr=”
site:.edu “/forums/”
site:.edu “/sutra”
site:.edu “act=reg”
site:.edu “act=sf”
site:.edu “act=st”
site:.edu “bbs/ezboard.cgi”
site:.edu “bbs1/ezboard.cgi”
site:.edu “board”
site:.edu “board-4you.de”
site:.edu “board/ezboard.cgi”
site:.edu “boardbook.de”
site:.edu “bulletin”
site:.edu “cgi-bin/ezboard.cgi”
site:.edu “invision”
site:.edu “kostenlose-foren.org”
site:.edu “kostenloses-forum.com”
site:.edu “list.php”
site:.edu “lofiversion”
site:.edu “modules.php”
site:.edu “newbb”
site:.edu “newbbs/ezboard.cgi”
site:.edu “onlyfree.de/cgi-bin/forum/”
site:.edu “phpbbx.de”
site:.edu “plusboard.de”
site:.edu “post.php”
site:.edu “profile.php”
site:.edu “showthread.php”
site:.edu “siteboard.de”
site:.edu “thread”
site:.edu “topic”
site:.edu “ubb”
site:.edu “ultimatebb”
site:.edu “unboard.de”
site:.edu “webmart.de/f.cfm?id=”
site:.edu “xtremeservers.at/board/”
site:.edu “yooco.de”
site:.edu “forum”
site:.edu “phorum”
site:.edu “add topic”
site:.edu “new topic”
site:.edu “phpbb”
site:.edu “yabb”
site:.edu “ipb”
site:.edu “posting”
site:.edu “add message”
site:.edu “send message”
site:.edu “post new topic”
site:.edu “new thread”
site:.edu “send thread”
site:.edu “vbulletin”
site:.edu “bbs”
site:.edu “cgi-bin/forum/”
site:.edu “/cgi-bin/forum/blah.pl”
site:.edu “powered by e-blah forum software”
site:.edu “powered by xmb”
site:.edu “/forumdisplay.php?”
site:.edu “/misc.php?action=”
site:.edu “member.php?action=”
site:.edu “powered by: fudforum”
site:.edu “index.php?t=usrinfo”
site:.edu “/index.php?t=thread”
site:.edu “/index.php?t=”
site:.edu “index.php?t=post&frm_id=”
site:.edu “powered by fluxbb”
site:.edu “/profile.php?id=”
site:.edu “viewforum.php?id”
site:.edu “login.php”
site:.edu “register.php”
site:.edu “profile.forum?”
site:.edu “posting.forum&mode=newtopic”
site:.edu “post.forum?mode=reply”
site:.edu “powered by icebb”
site:.edu “index.php?s=”
site:.edu “act=login&func=register”
site:.edu “act=post&forum=19?
site:.edu “forums/show/”
site:.edu “module=posts&action=insert&forum_id”
site:.edu “posts/list”
site:.edu “/user/profile/”
site:.edu “/posts/reply/”
site:.edu “new_topic.jbb?”
site:.edu “powered by javabb 0.99?
site:.edu “login.jbb”
site:.edu “new_member.jbb”
site:.edu “reply.jbb”
site:.edu “/cgi-bin/forum/”
site:.edu “cgi-bin/forum.cgi”
site:.edu “/registermember”
site:.edu “listforums?”
site:.edu “forum mesdiscussions.net”
site:.edu “version”
site:.edu “index.php?action=vtopic”
site:.edu “powered by forum software minibb”
site:.edu “index.php?action=registernew”
site:.edu “member.php?action=register”
site:.edu “forumdisplay.php”
site:.edu “newthread.php?”
site:.edu “newreply.php?”
site:.edu “/phorum/”
site:.edu “phorum/list.php”
site:.edu “this forum is powered by phorum”
site:.edu “phorum/posting.php”
site:.edu “phorum/register.php”
site:.edu “phpbb/viewforum.php?”
site:.edu “/phpbb/”
site:.edu “phpbb/profile.php?mode=register”
site:.edu “phpbb/posting.php?mode=newtopic”
site:.edu “phpbb/posting.php?mode=reply”
site:.edu “/phpbb3/”
site:.edu “phpbb3/ucp.php?mode=register”
site:.edu “phpbb3/posting.php?mode=post”
site:.edu “phpbb3/posting.php?mode=reply”
site:.edu “/punbb/”
site:.edu “punbb/register.php”
site:.edu “powered by phpbb”
site:.edu “powered by punbb”
site:.edu “/quicksilver/”
site:.edu “powered by quicksilver forums”
site:.edu “index.php?a=forum”
site:.edu “index.php?a=register”
site:.edu “index.php?a=post&s=topic”
site:.edu “/seoboard/”
site:.edu “powered by seo-board”
site:.edu “seoboard/index.php?a=vforum”
site:.edu “index.php?a=vtopic”
site:.edu “/index.php?a=register”
site:.edu “powered by smf 1.1.5?
site:.edu “index.php?action=register”
site:.edu “/index.php?board”
site:.edu “powered by ubb.threads”
site:.edu “ubb=postlist”
site:.edu “ubb=newpost&board=1?
site:.edu “ultrabb”
site:.edu “view_forum.php?id”
site:.edu “new_topic.php?”
site:.edu “login.php?register=1?
site:.edu “powered by vbulletin”
site:.edu “vbulletin/register.php”
site:.edu “/forumdisplay.php?f=”
site:.edu “newreply.php?do=newreply”
site:.edu “newthread.php?do=newthread”
site:.edu “powered by bbpress”
site:.edu “bbpress/topic.php?id”
site:.edu “bbpress/register.php”
site:.edu “powered by the unclassified newsboard”
site:.edu “forum.php?req”
site:.edu “forum.php?req=register”
site:.edu “/unb/”
site:.edu “powered by usebb forum software”
site:.edu “/usebb/”
site:.edu “topic.php?id”
site:.edu “panel.php?act=register”
site:.edu “a product of lussumo”
site:.edu “comments.php?discussionid=”
site:.edu “/viscacha/”
site:.edu “forum.php?s=”
site:.edu “powered by viscacha”
site:.edu “/viscacha/register.php”
site:.edu “/post?id=”
site:.edu “post/printadd?forum”
site:.edu “community/index.php”
site:.edu “community/forum.php?”
site:.edu “community/register.php”
site:.edu “powered by xennobb”
site:.edu “hosted for free by zetaboards”
site:.edu “powered by yaf”
site:.edu “yaf_rules.aspx”
site:.edu “yaf_topics”
site:.edu “postmessage.aspx”
site:.edu “register.aspx”
site:.edu “post/?type”
site:.edu “action=display&thread”
site:.edu “index.php”
site:.edu “index.php?fid”
[/sociallocker]

Que paséis buenas fiestas con estos footprints mangurrianes!! 😉

Los 6 mejores regalos de Navidad de todo buen friki

No os asustéis, Papá Noel ya ha pasado por millones de casas dejando posiblemente regalos bastante reguleros. Muchas personas estrenan ya sus nuevos calcetines de Primark, su colonia de Gilca o su jersey de punto hecho por la abuela y otro año mas no tenemos lo que nos apetecía, pero no hay que preocuparse que todavía quedan los Reyes Magos y otra oportunidad para conseguir un regalo chulo. Por eso a continuación voy a presentar mi carta para los Reyes con los mejores regalos de Navidad y tal vez te de alguna que otra idea para regalar algo a todo buen friki que se preste.

 

Netflix + Chromecast

netflix + chromecast de los mejores regalos de navidad
netflix + chromecast de los mejores regalos de navidad

El mejor combo que te puedas imaginar, si ya de por sí el servicio americano de vídeo bajo demanda es cojonudo, sumado al Chromecast suman un equipo inigualable. Netflix que apenas lleva tres meses en España cuenta con millones de usuarios registrados y un catálogo que va creciendo mes a mes. El servicio que compite con otras plataformas como Yomvi o Wuaki se enorgullece de tener series destacadas como Narcos a la cabeza del catálogo, Jessica Jones, Gotham, Daredevil…

Puedes pagar comodamente Netflix mes a mes según sus diferentes suscripciones que van desde los 7,99 euros al plan de 11,99 euros y 4 pantallas conectadas simultáneamente retransmitiendo en 4k.

¿Y que puedo decir de Chromecast? Pues posiblemente que es uno de los mejores regalos de navidad y gadgets de la marca del buscador. Este dispositivo te permite, conectandolo a una tele, enviar cualquier tipo de contenido multimedia sin tener que tirar de configuraciones pesadas ni de cables, tan solo conectate a la wifi y empieza a ver tus capitulos de Netflix. El nuevo diseño redondeado del Chromecast 2 hace que parezca mas bien un elemento de diseño que un gadget tecnológico y sus 40 pavos te darán horas y horas de entretenimiento si lo unes al combo de Netflix.

 Pack de comics

Alias, el cómic de Jessica Jones
Alias, el cómic de Jessica Jones

Suponemos que ya tienes Netflix y Chromecast y que ya te has tragado las series estrella de Netflix y has sido capaz de verte Jessica Jones y Daredevil en un fin de semana, pues bien, siempre puedes indagar un poco mas sobre la historia que hay detrás de estos personajes regalando los comics sobre la series.

Te recomiendo personalmente que te compres el comic de Alias, protagonizado por la heroína Jessica Jones aunque realmente cualquier historia del sello para adultos MAX hará las delicias de cualquier que ya no le interesan tanto las historias típicas de super héroes y busca la historia humana de estos protagonistas, con sus problemas reales y sus situaciones atípicas. En concreto el comic de Alias, que cuenta con él guión y las ilustraciones de Brian Michael Bendis y Michael Gaydos, supone un buen regalo de navidad que a todo seriefilo acabará gustando. En cuanto a Daredevil te recomiendo este tomo de Frank Miller.

Robot Sphero BB-8


Si señores, el buque insignia de los regalos frikis de estas fechas. Imagino que todo el mundo habrá visto ya la nueva película de Star Wars así que no hace falta que presente a este robot. Este nuevo juguete hará las delicias de todo fan de la Guerra de las Galaxias y es que conectándolo a la aplicación de smartphone podemos manejar al bichejo por toda la casa a nuestro antojo. Está formado por una bola grande que hace de cuerpo y otra pequeña, la cabeza, que es la contiene la cámara y el resto de componentes y sensores.

El robot en cuestión se desplaza rodando y la velocidad que puede llegar a alcanzar es bastante alta sorprendentemente. Una de las cosas que me gusta es el modo patrulla en el que el robot adquiere cierta autonomía y se dedica a explorar la casa. Tanto el robot BB-8 como la aplicación para smartphones consiguen meternos en el universo de Star Wars con sus ilustraciones y banda sonora incluida.

Raspberry PI 2

Raspberry Pi 2 el ordenador de 40 pavos
Raspberry Pi 2 el ordenador de 40 pavos

Un ordenador totalmente funcional desde 40 pavos. Esta placa base es el juguete “Lego” perfecto para los amantes de la tecnología y la programación ya que le puedes añadir diferentes componentes y sensores y hacer cosas muy chulas. Con una raspberry puedes ser capaz de montar cualquier cosa, desde un servidor de Torrents, un centro multimedia o cosas mas avanzadas como escáneres 3D, miniconsolas retro o estaciones meteorológicas. Si buscas un poquito por internet puedes encontrar proyectos muy interesantes para hacer si eres un poco manitas.

La segunda versión de esta placa base cuenta con 1gb de RAM, un procesador Quad-Core Cortex A7 a 900 MHz, cuatro USBs 2.0, conexión HDMI, conexión de Ethernet, ranura para tarjetas micro SD… en fin, cuesta creer que podamos tener tanto por tan poco dinero y sinceramente lo mejor de todo es la liberta que te da para crear lo que te apetezca, si decides iniciarte con la Raspberry, te aconsejo que te pilles este pack que por 80 pavos incluye la placa, una tarjeta micro SD, la fuente de alimentación, un cable de ethernet y una carcasa para proteger a tu Raspberry del polvo.

Máscara de caballo loco

¿Puede Horse Luis bajar a jugar?
¿Puede Horse Luis bajar a jugar?

Regalo chorra en toda regla e icono de uno los foros mas grandes de Internet y que puedes adquirir aquí. Forocoches que cuenta con más de 600000 usuarios registrados es un nido de trolls que ha conseguido ciertos hitos memorables como el voto masivo a John Cobra para representarnos en la gala de Eurovisión del 2010, el nombramiento de Curry Valenzuela como la periodista mas sexy según FHM o la pipebender… Sin duda si eres un forero que no sales del General y que en tu día a día utilizas expresiones como “Zumo para prestar”, “TDS ES TDS” o “DIN en la pole” este regalo te viene que ni pintado.

Portátil Slimbook 715

Slimbook 715 compitiendo contra la manzana
Slimbook 715 compitiendo contra la manzana

Jojojo menudo pepinón de máquina, el nuevo modelo de la marca Slimbook pretende competir con los Mac Air. Tenemos entre manos el regalo de mi lista de Reyes mas caro pero sin duda el precio está justificado por lo que tiene este aparato en sus tripas. Este portátil cuenta con un procesador Intel I7 y una pantalla FullHD de 1920x1080px que te permitirá disfrutar de Netflix en 4K 😛

Cuenta con una memoria RAM de 4gb y un disco duro de 120 gb aunque en su página web puedes configurarlo para aumentar tanto la RAM como el disco hasta los 512 gb. El portátil pesa menos de kilo y medio y tiene unas dimensiones de 33 x 22 x 1,8 cm que junto con su acabado en aluminio supone un caramelito para todos los amantes de los ultrabooks.

Como viene siendo habitual en este tipo de portátiles no cuenta con unidad lectora de cds pero viene integrado con dos USBs 3.0 y lector de tarjetas SD y MMC y su autonomía puede llegar a durar hasta 8 horas. Lo mejor de este portátil es que esta pensado para venir con Linux preinstalado de fábrica, las distribuciones disponibles son Ubuntu, Kubuntu, Debian, Elementary OS, Mint, Altergos y Fedora, aunque pagando las licencias, también puedes pedir que te lo instalen con Windows 8 o 10. Si quieres comprarlo puedes encontrar buenos precios en Amazon.

Pues nada chavales, ya habéis visto mi lista de regalos para Reyes, ahora solo toca esperar que Melchor, Gaspar y Baltasar, o algún suscriptor, sean generosos y traigan alguno de estos regalos de Navidad y ya sabéis… para Mariano otro par de gafas… 😛

¡Que paséis buenas fiestas!

Consumir un webservice desde Angularjs

Últimamente estoy dando muchas vueltas con AngularJs. El desarrollo tiene que ir encaminado hacia la creación de aplicaciones web que se comporten de igual manera ya sea si la estas viendo desde un móvil, una tableta o un ordenador. El dispositivo debe ser un elemento totalmente independiente de la experiencia de usuario de una web o una aplicación, por eso en los últimos tiempos han salido varios frameworks que nos ayudan a hacer aplicaciones webs colocando una capa de abstracción entre las particularidades de cada plataforma y el usuario.

Pues bien, como ya algunos sabrán, estoy tonteando mucho últimamente con frameworks de desarrollo de aplicaciones para móviles. Hay muchos en el mercado pero yo he decidido empezar por Ionic, que es un framework lanzado por Twitter y basado en Apache Cordova y AngularJs y del que ya hablé en un artículo anterior.

Lo que tiene en común el desarrollo con este tipo de frameworks es que en algún momento si o si vas a necesitar hacer una llamada a un webservice para consumir unos datos, ya sea mediante una api RESTful o mediane SOAP y aquí es dónde viene el problema con el que me he encontrado estos días, cómo consumir un webservice que devuelve un conjunto de datos en JSON desde AngularJS.

En uno de los controladores de mi aplicación AngularJS, tenía una llamada asíncrona que utilizaba JSONP para comunicarse. Esta técnica de comunicación está pensada para suplir las limitaciones de AJAX en las comunicaciones asíncronas, permitiéndonos hacer peticiones a páginas que se encuentren en otros dominios diferentes sin que nos salten errores de CORS.

¿Y qué son las CORS? Pues quiere decir Cross-Origin Resource Sharing, o en la lengua de Cervantes, Sistema de Compartir Recursos entre Dominios Cruzados y es una política de seguridad del W3C que básicamente consiste en la permisividad de poder acceder a recursos de un dominio desde otro dominio diferente. Esta política nos viene genial para las aplicaciones que vamos a empaquetar con Cordova, pero no solo para apps nos ayuda sino que cada vez es más frecuente diseñar páginas/aplicaciones que beban de diferentes fuentes de datos.

El problema que nos encontrarnos al tener que utilizar esta política de seguridad es que si no la configuramos y utilizamos correctamente estamos dejando una puerta abierta para ataques maliciosos. Alguien con muy malas ideas podría acceder a todos los recursos del servidor mediante un servicio expuesto si no hemos definidos bien las CORS. Que puedan acceder a una imagen que tenemos alojada en nuestro servidor pues a lo mejor nos da un poco igual, pero ya no nos dará tan igual si acceden a las cookies de sesión o realizan ataques CSRF en nuestra web/aplicación…

Pues lo dicho, para consumir un webservice desde AngularJs, tendremos que hacer uso en nuestro navegador del objeto $http. Como dice la fuente original:

The $http service is a core Angular service that facilitates communication with the remote HTTP servers via the browser’s XMLHttpRequest object or via JSONP.

 var dataJSONP = $http({
         method: 'JSONP', 
         url: 'https://example.org/webservice'
});

Lo que hay al otro lado de la url es un webservice que devuelve unos datos en formato JSON. Podría ser algo tan sencillo como:

 $data = array( 'date' => '22/11/2015',
        'title' => 'Título para un post chorra',
   );
 echo json_encode($data); 

Definimos un array y lo devolvemos codificándolo mediante la función json_encode, fin. Sin embargo si ejecutamos esto recibiremos un error como el siguiente:

Cross-Origin Resource Sharing
Cross-Origin Resource Sharing

Para solucionarlo, tendremos que añadir lo siguiente a la respuesta de nuesto webservice:

 header('content-type: application/jsonp; charset=utf-8');
 header('Access-Control-Allow-Headers: Content-Type');
 header('Access-Control-Allow-Methods: GET, POST');
 header('Access-Control-Allow-Origin: *');
 echo 'angular.callbacks._0('.json_encode($arr).')'; 
  • content-type: application/jsonp; charset=utf-8: indicamos el tipo de respuesta y su codificación.
  • Access-Control-Allow-Headers: Content-Type: indicamos que cabeceras HTTP usar al hacer la petición.
  • Access-Control-Allow-Methods: GET, POST: métodos permitidos para hacer la petición.
  • Access-Control-Allow-Origin: indicamos los origenes de la petición permitidos.
  • angular.callbacks._0: JSONP requiere encapsulemos la respuesta en una función de callback de Javascript.

Con esto conseguiremos que nuestra aplicación AngularJs pueda consultar datos desde fuentes externas.

He encontrado una respuesta muy buena en Stackoverflow sobre el uso de angular.callbacks en las respuestas JSONP. Si quieres leerla ayudame a que el artículo se difunda compartiéndolo por las redes sociales.

[sociallocker]

JSONP requires you to wrap your JSON response into a Javascript function call. When you do a JSONP the request query string will set a parameter called ‘callback’ that will tell your server how to wrap the JSON response.

So the response should be something like:

callback([
    {"id": "1", "name": "John Doe"},
    {"id": "2", "name": "Lorem ipsum"},
    {"id": "3", "name": "Lorem ipsum"}
]);

Angular will define the callback parameter as angular.callbacks._0, angular.callbacks._1, angular.callbacks._2 … depending on how many requests it is waiting for response, so if you do a single request the response should be:

angular.callbacks._0([
    {"id": "1", "name": "Lorem ipsum"},
    {"id": "2", "name": "Lorem ipsum"},
    {"id": "3", "name": "Lorem ipsum"}
]);

The server should use the callback parameter from the request string to set the response accordingly.

Check your Plunker’s network activity and you will see that the request is setting the callback parameter but the response you are getting is not being wrapped with it.

[/sociallocker]

Tutorial Ionic – Cómo crear una app

¿Que pasa muyayos? Estaba yo el otro día dando una vuelta por finofilipino y encontré un post sobre un trolaso de dos pares de cojones. El menda al parecer había creado una aplicación para iphones que consistía en lanzar el terminal lo más alto posible y el que mas altura consiguiera ganaba.

Este tío es cojonudo porque consiguió hacer que la mafia marca de los iphone baneara su aplicación sin tener que recurrir a la pornografía, a la violencia o al malware o a crear carpetas en iPhone. Un aplauso para este trolaso.

Ver esta aplicación me hizo pensar y caí en que en el blog no hay ningún post sobre desarrollo de aplicaciones móviles y me decidí a crear una serie de post sobre cómo crear apps. Es innegable que desde hace un par de años TODO lo relacionado con la informática y el usuario medio pasa por las aplicaciones móviles, así que mejor subirse a ese tren ¿que no?

Para crear una app móvil existen muchas herramientas, desde la programación nativa mediante Objective-C o Swift para los terminales de la manzanita o pasar por utilizar las ADK con Java para el robot verde hasta apuntarse a la nueva corriente de Cordova (bonita ciudad, mejor framework) y Phonegap que nos permiten hacer aplicaciones con HTML y mucho Javascript.

Herramientas tenemos así que no hay excusa para no ponerte a trastear, pero en este post quiero hablar sobre Ionic, un framework que lanzó Twitter que nos ayuda a  crear una app fácilmente sin tener unos conocimientos técnicos muy profundos, no, no hay punteros ni referencias ni enmascaramientos de bits así que tranquis…

Lo bueno de este framework, como todos los basados en Cordova/PhoneGap, es que solo se necesita programar la aplicación una vez y después la puedes compilar para cualquier sistema móvil.

Vamos a ir entrando en harina…

Empezando a crear una app con Ionic

Lo primero que vavamos a necesitar es instalar Node.js. Para el que no lo sepa, Node.js es un entorno de programación que nos permite hacer aplicaciones Javascript que se ejecutan desde el servidor, así muy resumidamente.

Cuando te lo hayas descargado de la página oficial e instalado, el siguiente paso es instalar la última versión de Cordova y las CLI (Command-line tools) de Ionic. Para ello ejecuta lo siguiente en la terminal.

npm install -g cordova ionic

Para comprobar que lo has instalado todo correctamente puedes probar a mirar las versiones de node, cordova e ionic desde la terminal.

Ups, tengo que actualizar...
Ups, tengo que actualizar…

¿Ya lo tienes? Ok, pues lo siguiente que tienes que hacer es decidir para que plataforma quieres programar tu aplicación. ¿Te gustan las cupcakes, bigotes y Starbucks? Muy bien, sigue éste link. Si por el contrario te gustan los robots verdes éste es tu link.

Aclaro para el gandul que no ha hecho ni caso que los dos últimos links llevaban a la guía para la instalación de las dependencias necesarias para programar bajo Android o para IOS, sea cual sea el perfil y son totalmente obligatorios seguir e instalar para crear una app, sino, no te va a funcionar e ya.

También sería interesante que te instalaras Gulp con soporte de livereload para poder ver los cambios que haces en la aplicación directamente en el navegador sin tener que estar haciendo un build a tu dispositivo cada dos por tres, Bower para la gestión de dependencias del Frontend y algún que otro preprocesador CSS, como SAAS, que mola.

Comenzando con el proyecto

Para empezar a crear una app móvil, Ionic nos da varias plantillas sobre las que construir como las que podéis ver en la siguiente imagen.

Plantillas para crear una app Ionica
Plantillas para crear una app Ionic

Si quieres una aplicación en blanco porque ya eres un master escribe lo siguiente en la terminal:

ionic start aplicacionChorra blank

Si quieres hacer una aplicación con pestañas escribe lo siguiente:

ionic start aplicacionChorra tabs

Si por último quieres una crear una app con menú lateral escribe lo siguiente:

ionic start aplicacionChorra sidemenu

En cualquier caso, tu ejecuta uno de esos comandos y veras que la terminal se pone a hacer muchas cosas, como descargar desde github el código base de Ionic y el template para tu aplicación entre otras cosas. Además las CLI de Ionic te proponen que configures tu proyecto con un preprocesador CSS, te sugiere que desarrolles con livereolad y que añadas una plataforma (Android o IOS) a parte de recordarte cómo seguir el ciclo de desarrollo construyendo, corriendo y compilando tu aplicación.

Command line tools de Ionic
Command line tools de Ionic

Al entrar en el directorio de la aplicación podrás ver que Ionic te ha creado ya toda la estructura de directorios y ficheros para que solo tengas que ponerte a programar, este sistema de skeletons me recuerda mucho a Yeoman o al Maven de los Javeros…

Ficheros básicos para una aplicación Ionic

Para que quede claro, tu aplicación siempre va a ejecutarse a través del fichero www/index.html y a mediante las diferentes configuraciones javascript y vistas se irá moviendo entre las pantalllas que necesite tu app.

Controlador frontal
Controlador frontal

Este fichero es lo que se llama un controlador frontal, la ejecución de la aplicación SIEMPRE va a empezar desde aquí y si lo abres puedes ver que se encargar de diferentes cosas como la carga de dependencias (Ionic, Cordova, estilos y nuestros javascripts), definir el nombre de la aplicación AngularJs (ng-app=”aplicacionChorra”) y definir las dos directivas necesarias para cargar la barra de navegación (ion-nav-bar) y el contenedor que irá cargando el resto de vistas (ion-nav-view)

Cuando he dicho que este fichero se encarga de cargar las depedencias de Cordova e Ionic, también he comentado que va a cargar nuestros javascripts, y el primer javascript y motor de la aplicación por defecto es el fichero js/app.js

Motor de la app
Motor de la app

Este fichero es el principal y en el tenemos que definir el nombre de la aplicación y las dependencias que va usar nuestra app. Pero así de primeras, las más importantes y necesarias son las del framework de Ionic, los servicios y los controladores que vamos a usar aunque también tendremos que configurar el enrutador y definir las diferentes pantallas que tendrá la aplicación.

Como veo que el tema se alarga, lo voy a ir dejando para separar todo el contenido en varios posts, Ionic y AngularJS tienen mucha chicha… pero os voy a dejar en mi repo de github un ejemplo típico de  una aplicación creada con Ionic para que os lo podáis clonar e ir trasteando entre post y post. Si queréis que siga escribiendo sobre cómo crear una app necesito saber que este tipo de posts, un poquito más técnicos, tienen buena acogida para que pueda seguir trabajando y sacando mas contenido relacionado con el desarrollo de aplicaciones móviles y para ello os propongo que si el post llega a compartirse 50 veces publicaré la segunda parte de esta guía.

[sociallocker id=1291]
Clonate el repo co!
[/sociallocker]

Y ahora me voy que me espera Netflix!! Ala a cascala!