Conceptos básicos de la programación orientada a objetos

En pleno siglo XXI y con una tendencia cada vez mas en aumento del dominio digital en nuestras vidas es imprescindible que todos tengamos unos conocimientos mínimos sobre informática, tecnología y programación. A lo largo de mi vida he conocido a muchas personas que solo sabían encender el ordenador y acceder a sus redes sociales, compartir sus fotos en Instragram y descargar películas desde plataformas de sharing.

Y tal vez eso sea suficiente para ellos pero si ahora mismo desarrollas un trabajo delante de un ordenador deberías tener unos conocimientos técnicos mínimos; y no hablo de conocer el sistema de señales del kernel de nuestro ordenador o saber como gestionar la memoria de tu máquina, tan solo quiero remarcar la importancia de poseer unos conocimientos técnicos en un mundo en el que cada vez dependemos mas de la informática.

Ya se ha demostrado la sana relación que existe entre los niños y la programación en su proceso de aprendizaje maduro. Esto tiene muchísimas ventajas en la formación del cerebro y en su definición de la personalidad. Un niño que aprende programación esta sin saberlo amueblando su cabeza y recibiendo herramientas para pensar de una manera lógica y desarrollando su capacidad para resolver problemas.

Entonces, si un niño es capaz de aprender un lenguaje de programación ¿porque tu no vas a poder aprenderlo?

Otra cosa es si de verdad quieres desarrollar su autosuficiencia tecnológica o si por el contrario quieres seguir dependiendo del friki gordo que juega con los ordenadores toda tu vida. Cuando ese tío ya no este, ¿qué vas a hacer cuando aparezca la temida Blue Screen Of Death en tu ordenador y tu trabajo tenga que ser interrumpido? Por ejemplo…

Por eso y como modo de educación os voy a contar los conceptos de la programación para que a los que os interesa sigáis aprendiendo y para los que no os interesa tanto por lo menos que conozcáis en qué se basa nuestro trabajo y desmentir el mito de que los programadores apretamos un botón y el trabajo ya está hecho.

Por cierto, no somos vagos. Trabajamos con la ley del mínimo esfuerzo pero siempre buscando la manera de optimizar y automatizar procesos de trabajo. 😛

programador

¿Qué es la programación orientada a objetos?

Dentro de la programación existen diferentes paradigmas sobre como afrontar y resolver un problema y estos tipos de paradigma están ligados al desarrollo histórico de la tecnología y de nuestra capacidad para producir mejores máquinas y aumentar la capacidad de cálculo y procesamiento de estas.

Si hacemos una búsqueda rápida veremos que podemos desarrollar haciendo programación funcional, programación imperativa, programación estructural, programación orientada a objetos o las recientes en alcanzar hype programación orientada a eventos y orientada a comportamientos, entre muchas otras…

Pero en este caso vamos a aprender qué es la programación orientada a objetos y para ello la wikipedia nos dice lo siguiente:

La programación orientada a objetos (POO, u OOP según sus siglas en inglés) es un paradigma de programación que viene a innovar la forma de obtener resultados. Los objetos manipulan los datos de entrada para la obtención de datos de salida específicos, donde cada objeto ofrece una funcionalidad especial.

Tal vez esta definición te deje con el culo torcido. Para aclarar las dudas y asentar las bases de la programación orientada a objetos has de saber que nuestros ordenadores contienen y procesan datos. Estos datos no dejan de ser información plana que carece de sentido por si mismos y que solo al ser analizados en un universo determinado y conocido obtienen el significado que nos es necesario para nuestros requisitos.

Me explico. Imagina que nuestro ordenador posee los siguientes datos:

Altura Anchura
50 20

Vale, vemos en la tabla que tenemos un dato que representa la altura, cuyo valor es 50, y tenemos otro dato que representa la anchura, que vale 20.

Pero ¿a qué representan estos valores? ¿Son las medidas de una persona? ¿Las medidas de una caja tal vez? ¿O las propiedades de un paquete de tabaco en un dibujo? Digo en un dibujo porque es un plano bidimensional tal y como lo son la altura y la anchura. Al no haber valor para la profundidad, plano Z, no podemos representar una caja o una persona de tres dimensiones, solo es un ejemplo educativo, no os pongáis tiquismiquis cabrones…

Pues bien, esa caja, esa persona o ese paquete de tabaco es a lo que me refiero con el universo concreto de los datos, es el contexto que le da sentido a los valores numéricos que hemos visto. Y como los datos y la informática es impersonal y carente de significado, la programación orientada a objetos es la herramienta que utilizamos para traducir esos valores a conceptos que conocemos de nuestra vida real.

La programación orientada a objetos como su nombre indica trabaja con objetos y nuestro paquete de tabaco del ejemplo es un objeto. Este objeto tiene propiedades como la altura y la anchura y encima puede realizar acciones por si mismo y puede ser sometido a acciones, como por ejemplo abrir el paquete, sacar un cigarrillo, comprobar que tenga tabaco o que el cartón del paquete se degrade.

Pues en la programación orientada a objetos, todo este conjunto de propiedades y acciones es lo que se conoce como objeto que es la representación abstracta de un objeto real de la vida real. ¿Se entiende?

Bueno, si todavía no te ha explotado la cabeza tomate un descanso, tomate un café o échate un piti porque vamos a entrar en faena a partir de aquí…

Representando los datos mediante las clases

Ya hemos visto cual es la definición de un objeto dentro de la programación orientada a objetos, pues bien una clase es la plantilla que vamos a utilizar para modelar este conjunto de datos o estos objetos vamos. Utilizamos las clases para representar entidades o conceptos y definen un conjunto de variables (propiedades) y de métodos (acciones).

Tal y como hemos visto, las clases y objetos suponen el pilar fundamental de la programación orientada a objetos.

Cuando estamos programando y utilizamos una clase, osea la plantilla, para crear un objeto digital, decimos que estamos instanciando una clase.

Para que nuestro ordenador nos entienda tenemos que escribir una clase tal que así:

Atención:

Tutorial basado en PHP. Si eres un Javero o defensor aferrimo de otros lenguajes y te entran pampurrias por favor vete 😛
Cada lenguaje utiliza diferentes sintaxis aunque compartan ciertos aspectos en común.

https://gist.github.com/gorkamu/48c0c5a623b69cb18cc1ac4f086aba30.js

Vale, tal y como puedes ver en el ejemplo, hemos definido la clase utilizando la palabra reservada class para a continuación nombrar a esta clase con el nombre PaqueteDeTabaco. El nombre de una clase puede ser cualquier nombre que te de la gana siempre y cuando no utilices una palabra reservada de esta lista.

Si te fijas bien, la clase tiene un conjunto de propiedades (altura y anchura) y de métodos (cualEsLaAltura, cualEsLaAnchura, abrirPaquete, comprobarSiHayTabaco, sacarCigarrillo)

Las propiedades tienen la palabra private delante de su definición y esto tiene que ver con las buenas prácticas en la programación orientada a objetos y con el encapsulamiento de datos. La palabra reservada private hace referencia al ámbito de las variables o como se diría en inglés al scope.

Existen varios tipos de ámbitos o de visibilidad de propiedades y métodos:

  • public: permite que el valor de la propiedad o el método sean accesibles desde cualquier lugar como por ejemplo otra clase u otras instancias de esa clase.
  • protected: hace que el valor de la propiedad o el método sea accesible desde la misma clase o desde cualquier otra que herede de ella.
  • private: hace que el valor de la propiedad o el método solamente sea accesible desde la misma clase que la define.

El valor de una propiedad no debería ser accesible desde fuera de una clase o desde otra clase sin utilizar un método que nos proporcione ese valor y aquí es donde entran los métodos getters y setters. Métodos get para recuperar un valor y métodos set para establecer un valor. Por ejemplo, si queremos acceder a la altura del paquete de tabaco tendríamos que hacerlo tal que así.

$paqueteDeTabaco->cualEsSuAltura();

Vuelve a fijarte en la definición de la clase que hay algo que todavía no he explicado… ¿Ya? ¿No te mosquea el uso de la palabra $this? ¿No sabes qué es?

Pues bien, la palabra $this es una pseudovariable, no forma parte de nuestra clase ni tenemos que definirla ni nada por el estilo, es una forma que nos da la sintaxis del lenguaje para poder acceder a elementos de una clase dentro de la misma clase ya sean propiedades o métodos y que solo funciona dentro de la clase.

Si intentas utilizar en cualquier lugar fuera de la clase te fallará.

Creando instancias de clases

Para crear la instancia de una clase y poder utilizarla en nuestro programa tendremos que utilizar la palabra reservada new.

$paqueteDeTabaco = new PaqueteDeTabaco();

Cualquier objeto se creará siempre y cuando tenga un constructor, pero ¿qué coño es un constructor?

Pues un constructor es el método que se encarga de construir el objeto, ¿obvio no? Un constructor se define tal que así:

function __construct() {
...
}

Al utilizar la palabra reservada new, internamente estamos llamando al constructor de la clase, aunque si te fijas en la clase del ejemplo, verás que no hay definido ningún constructor y esto es porque la clase utiliza el constructor por defecto, que al igual que con la pseudovariable $this no nos tenemos que preocupar de definir, ya nos lo provee el lenguaje.

Solo nos preocuparemos de definir siempre y cuando  queramos hacer algo específico en el proceso de construcción del objeto como por ejemplo inicializar variables o llamar a métodos de la clase.

Al igual que todo en la vida, todo lo que se crea se puede destruir y en la programación orientada a objetos no podría ser de otra forma. El lenguaje también nos provee de un método para destruir el objeto y esto es el destructor o la función destructora.

function __destruct() {
...
}

Generalmente utilizamos esta función para liberar memoria, aunque ese es un tema para otro post…

Otra cosa que podemos hacer con los objetos a parte de construirlos y destruirlos es clonarlos o lo que es lo mismo, hacer una copia de ellos mismos. Cuando se clona un objeto PHP hace una copia superficial de todas las propiedades del objeto. Si por cualquier caso una de estas propiedades es una referencia a otra variable el objeto clonado mantendrá esta misma referencia.

$paqueteDeMarlboro = new PaqueteDeTabaco();
$paqueteDeChester = clone $paqueteDeMarlboro;

Internamente al hacer una copia de un objeto estamos llamando al método mágico __clone().

Otro concepto importante en la programación orientada a objetos es la herencia.

Entendiendo la herencia

Entendiendo la herencia y digo entendiendo porque es un concepto bastante abstracto que tenemos que masticar muy detenidamente.

Volvamos al ejemplo del paquete de tabaco. Un paquete de tabaco es un concepto abstracto ya que nos imaginamos el concepto pero no somos capaces de identificar de que marca de tabaco se trata, si pertenece a tabaco negro o tabaco rubio o si se trata de cigarrillos hechos o de tabaco de liar.

Ahora si te imaginas un paquete de Ducados, otro de Marlboro y otro de Golden Virginia, estarás de acuerdo conmigo en que los tres son paquetes de tabaco y que entre ellos comparten ciertas características como la altura y la anchura del paquete pero se diferencian entre ellos del tipo de tabaco, de la presentación y de la marca.

Ademas estos tres paquetes pueden realizan acciones como abrir el paquete y/o saber cuantos cigarrillos quedan, sin embargo, por la fisionomía del packaging de los distintos paquetes, cada uno de ellos se pueden abrir de una forma diferente, por ejemplo…

Pues bien, si aplicamos esta lógica a la programación orientada a objetos, tendremos cuatro clases diferentes:

  • PaqueteDeTabaco.class.php
  • PaqueteDeDucados.class.php
  • PaqueteDeMarlboro.class.php
  • PaqueteDeGoldenVirginia.class.php

La clase PaqueteDeTabaco.class.php sería la clase padre y el resto de clases son las clases hijas que heredan de la clase padre. Mejor veamoslo con un dibujico…

Herencia en la programación orientada a objetos
Herencia en la programación orientada a objetos

Tal y como se ve en la imagen, cada una de las clases hijas comparten propiedades y métodos entre ellas gracias a la clase padre. Una instancia de la clase PaqueteDeDucados.class.php, otra de la clase PaqueteDeMarlboro.class.php y otra de PaqueteDeGoldenVirginia.class.php podrán utilizar el método abrirPaquete() y cualquiera de las tres podrán acceder al método cualEsLaAltura() para obtener el valor de la propiedad $altura de la clase padre y todo este gracias a la herencia.

Sin embargo, si preguntas al PaqueteDeDucados por su marca y tipo serán muy diferentes de las del PaqueteDeMarlboro.

$paqueteDeDucados->cualEsLaAltura();
$paqueteDeMarlboro->abrirPaquete();
$paqueteDeGoldenVirginia->comprobarSiHayTabaco();

Si nos ponemos puristas esto no sería del todo así ya que ambas clases hijas comparten marca y tipo de tabaco por lo que haciendo una buena refactorización deberíamos situar estas propiedades en la clase padre, pero para el ejemplo y para que sea mas visual nos vale.

Así pues, para que una clase herede de otra en PHP deberemos utilizar la palabra reservada extends en la definición de la clase.

Todos los métodos y propiedades de la clase padre pueden ser sobrescritos por las clases hijas. Esto quiere decir que, siguiendo el ejemplo, podemos re-definir el comportamiento de la función abrirPaquete() para una clase en concreto, por ejemplo para la clase del paquete de Golden Virginia ya que este tipo de tabaco no se vende en una cajetilla sino en un sobre y por lo que para abrir el paquete deberemos desenrollarlo en lugar de abrir la cajita, no se si me explico xD

Podremos sobrescribir un método padre siempre y cuando no haya sido definido como final.

Por otro lado, para acceder a una propiedad o llamar a un método padre desde una clase hija tenemos que utilizar la palabra reservada parent junto con el nombre del método.

https://gist.github.com/gorkamu/83780bea63001cf9c93ffc15a04ea721.js

Pues bien, como podemos ver en la clase de arriba, tenemos el método sacarCigarrillo() que pertenece a la clase padre pero que en este ejemplo de clase hija debemos re-definir ya que en el tabaco de liar los cigarros no vienen hechos sino que tenemos que coger un poco de tabaco, un papel y un filtro y liarlo.

A diferencia del resto de clases de paquetes de tabaco, el método sacarCigarrillo() nos devolvería un cigarro, sin tener que liarlo y por lo cual no haría falta sobrescribir este método.

 

Pues nada, obviamente quedan muchísimo mas conceptos por conocer y dominar en la programación orientada a objetos pero para ir entrando en faena creo que esta ha sido una buena primera aproximación.

Se que el tema ha sido largo y puede ser duro para una persona que nunca ha visto nada sobre lenguajes de programación así que si tienes algún tipo de duda o sugerencia puedes dejarme un comentario mas abajo o hacerlo a través de twitter a través del siguiente banner.

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

¡Hala a mamarla!

Anuncios

5 comandos GIT que deberías conocer

Que pasa chumachos!

Si estas leyendo esto en 2016 y no sabes que es GIT vas apañao. ¿Si te digo Sistema de Control de Versiones (CVS) te suena mas? ¿Si? ¿No? ¿No sabes no contestas? Bueno… en fin… vamos con una primera definición de la Wikipedia…

Git (pronunciado “guit”) es un software de control de versiones diseñado por Linus Torvalds, pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando éstas tienen un gran número de archivos de código fuente

Ufff…. esto tampoco lo deja muy claro, bueno intentaré realizar una explicación mas simple mediante ejemplos, ¿cómo si no?…

Imagina que estas trabajando en un proyecto junto a un compañero, escribes un pedazo de código, lo pruebas en desarrollo y lo subes a pre-producción. A la semana, tu compañero encuentra un bug en ese pedazo de código tuyo, lo encuentra y lo arregla pero no quiere borrar tu código porque cree que mas adelante puede refactorizarlo para hacer un código mas limpio así que lo comenta en bloque para que, aunque no sea funcional, poder revisarlo mas adelante.

Siguen pasando las semanas de desarrollo y las subidas semanales a pre y producción y obviamente tu compañero y tu seguís con esta practica de comentar código, llegará un momento en que no sabréis que versión del código tenéis cada uno y que versión de código esta desplegado en producción. Se trasca la magedia…

Pues esta realidad tan arcaica fue algo muy común en los desarrollos hasta que llegaron los Sistemas de Control de Versiones y aunque en un primer impacto está pensado para el código fuente y ficheros en texto plano no es algo determinante ya que puedes aplicarlo a cualquier tipo de fichero informático, aunque luego tengas que leer trazas en base64 al resolver conflictos xD

Así pues con GIT vas a poder mantener tantas versiones como quieras de un fichero pudiendo volver atrás en el tiempo para rescatar un cambio que hiciste incluso, y aquí viene lo chulo, podéis trabajar varias personas sobre el mismo fichero sin tener miedo a perder cambios o pisaros los unos a los otros.

Actualmente el BFS (Big Fucking System) de este tipo de software es GIT, es el rey de todos los sistemas de control de versiones y mas junto a la plataforma Github que sirve para alojar proyectos Open Source utilizando este sistema aunque por supuesto existen otros competidores en el juego como Subversion o SourceSafe aunque están a años luz del rey.

Así pues, una vez hechas las presentaciones vamos a ver los comandos git típicos que deberías conocer para desenvolverte con total fluidez a la hora de versionar tu trabajo y sobre todo qué es lo que puedes hacer con GIT.

 

Los comandos git de los campeones

Has escrito código nuevo y lo quieres guardar en el servidor para que el resto de los compañeros puedan descargar tu aportación, con la siguiente secuencia de comandos git lo puedes hacer muy facilmente.

git add fichero.php imagen.png script.sql
git commit -m 'Adding my first changes'
git push origin issue/rama

Con estos comandos lo que estas haciendo es añadir tres ficheros (fichero.php, imagen.png y script.sql) al área de preparación y le añades un comentario específico a ese commit, para que trackearlo y después puedas encontrarlo rápidamente si es que lo necesitas. Con el último comando, push, estas enviando tus cambios a la rama issue/rama que se encuentra en el servidor origin, nombre por defecto que le da GIT al servidor.

Estos comandos git te permiten enviar cambios al repositorio
Estos comandos git te permiten enviar cambios al repositorio

 

¿Fácil no? ¿Pero y si lo que queremos es descargarnos los cambios de un compañero que están alojados en otra rama del servidor? Pues con los siguientes comandos git podemos hacerlo…

git checkout issue/rama_de_tu_compi
git pull origin issue/rama_de_tu_compi

El primer comando te cambiará tu área de trabajo a la rama issue/rama_de_tu_compi y con el segundo traerá los cambios que no hayas descargado de esa misma rama.

Guay, el utilizar estos dos comandos a la perfección son la esencia de GIT ya que sino no vas a poder trabajar, vamos mas básico que esto no hay nada. Hacer cambios y confirmarlos y descargarse cambios. Fin.

Pero vamos a ver otros comandos git un poco mas complicados o de Pro Master, coño.

Imagínate que estas felizmente trabajando en tu rama issue/rama y has tocado varios ficheros pero justo ha entrado una incidencia crítica que tienes que resolver que exige que cambies de rama pero no quieres perder esos ficheros modificados, aunque tampoco quieres mandarlos al servidor porque aun no están preparados. Bueno pues GIT tiene unos comandos para guardar de manera temporal estos cambios y luego poder recuperarlos.

git stash
git stash list
git stash apply

El primer comando va a guardar esos cambios no confirmados de manera provisional en tu máquina local. Importante resaltarlo ya que no se envían al repostorio. Con el segundo comando verás un listado de los diferentes conjuntos de ficheros almacenados provisionalmente y correctamente etiquetados con un hash. El último comando es para volver a aplicar sobre la rama los cambios que habías guardado de forma temporal en tu ordenador.

Si ejecutas el stash apply como pone en el ejemplo, se aplicarán los cambios de todos los ficheros, si quieres solo aplicar algún cambio en concreto habrá que pasarle al comando el hash identificativo que antes veíamos con el stash list.

¿Hasta aquí bien verdad?

Ok, pues imagina que estas trabajando en el fichero fichero.php y en el momento de commitearlo la cagas y ejecutas un git add *, esto lo que hace es enviar todos los ficheros al área de preparación. Obviamente solo quieres enviar fichero.php y también se te ha añadido script.sql porque detecta un cambio que no quieres enviar. Okay, que no cunda el pánico.

Para sacar un fichero del área de preparación y deshacer los cambios ejecuta los siguientes comandos git.

git reset HEAD script.php
git checkout -- script.php

Ale, ya esta fuera del área y lo has dejado como si no lo hubieses modificado, ya puedes ir a por el commit 😉

jeje pero que exagerado, si hay un incendio primero hay que hacer un git add *
jeje pero que exagerado, si hay un incendio primero hay que hacer un git add *

 

Muy bien si ya has conseguido llegar hasta el punto de modificar algo y enviarlo al servidor, eso teóricamente significa que tus cambios están listos para ser incluidos en la rama master.

La rama master es la rama que mantiene el código o los cambios que van a producción, aquí se encuentra la versión oficial y definitiva de los cambios, con la rama master no se juega.

Así que si tus cambios ya están terminados y han sido aprobados acabarán aquí. Muy bien, haces el commit y el push y en el momento de solicitar un pull request para que incluyan tus cambios sobre master… Meeeck, error, aparecen conflictos y no se puede mezclar. Aaaahhh la puta, a todos nos ha pasado y da muchísimo por culo.

La principal causa de que no puedas mergear tus cambios sobre la rama master es que en el momento de realizar los cambios en tu máquina no estabas completamente actualizado y sincronizado con el código de master o lo estuviste en el momento de abrir la rama para comenzar a trabajar pero algún listo ha hecho cambios que tu no tienes por lo que te has quedado completamente desfasado. Anda que no jode…

Bueno pues es tan sencillo como ejecutar los siguientes comandos git.

git checkout master
git pull
git checkout issue/rama
git merge master
git commit -m 'Merging master branch into issue/rama to avoid conflicts'
git push origin issue/rama

Con esto lo que estas haciendo es volverte a bajar master y actualizarla para que una vez tienes todo el código sincronizado con el repositorio actualizar tu rama issue/rama mezclando el código de master con ella misma. Creo que se entiende bien ¿no? Los otros comandos git ya los hemos visto mas arriba…

Como todo, y a raíz de esto, unos te dirán que todas las ramas deben de salir desde la rama development y que únicamente saldrán desde master cuando se trate de un hotfix y otros empezarán todas sus ramas desde master… en fin, toda esta filosofía git depende de como este organizado el proyecto ya que la teoría de ramas da para mucho, muchísimo, para un artículo enterito casi casi xD

En fin, esto es lo bueno de trabajar con GIT, ofrece flexibilidad ilimitada para que cualquier equipo de trabajo pueda organizar y mantener su propio proyecto como le de la gana, aunque también te digo que hay unas recomendaciones y buenas prácticas que ya veremos en otro momento…

Pues nada chachos, hasta aquí mi artículo sobre comandos GIT y segundo listado del 2016, Gorka eres un bocazas si tenéis alguna duda sabéis que podéis dejarla en los comentarios o utilizar twitter a través del siguiente banner 😉

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

 

Hala a chuparla!

#2 Batalla de gallos: MongoDB vs MySQL

Seguimos con una nueva batalla, en este caso MongoDB vs MySQL. Vamos a ver que motor de persistencia es mejor y de entre las características de ambos cual ganará esta batalla de gallos.

Las bases de datos relacionales han sido el pilar de un montón de aplicaciones empresariales durante mucho tiempo y mas desde que se lanzó MySQL en 1995, esta ha sido la opción mas popular.

Ahora, sin embargo con la explosión de la minería de datos y el trabajo con grandes volúmenes de estos ha provocado que tecnologías en el campo de bases de datos no-relaciones hayan aparecido en el juego como requisito para el nuevo tipo de aplicaciones.

Así pues, bases de datos no-relaciones como MongoDB se utiliza para este tipo de aplicaciones, aumentando o reemplazando la infraestructura típica relacional.

¿Qué es MySQL?

MySQL es un Sistema de Gestión de Base de Datos (SGDB) Open-Source basado en entidades y relaciones. Si alguien no sabe que es el Open-Source no es nada mas y nada mas que código abierto, distribuido y desarrollado libremente. Cualquiera puede leer, utilizar y contribuir al código fuente de una aplicación Open-Source.

Pues bien, pese a ser software Open-Source, MySQL es mantenido y distribuido por Oracle pero si te apetece ver el código fuente de MySQL puedes forkearte algún repositorio de todos los que tienen en su cuenta de GitHub y echar un vistazo.

Tal y como hacen otros sistema de gestión de bases de datos, MySQL almacena los datos en tablas y estructuras utilizando un lenguaje específico para relacionarse y comunicarse con esos datos guardados. Este lenguaje se llama SQL (Structured Query Language). Como no es nada nuevo no voy a contar como utilizar SQL  sino que voy a dejar este tutorial de la W3SCHOOLS por si alguien viene de nuevas y si quiere conocer  además en qué se basa SQL, cual es el trasfondo técnico de cómo funciona, te diré que se trata del álgebra relacional, aquí tienes un paper introductorio sobre el cálculo y el álgebra relacional.

En diferentes trabajos (técnicos) que he tenido, he visto utilizar SQL no solo a informáticos sino también a gente de contabilidad y finanzas incluso al personal de marketing así que no es una mala idea que tengas unos mínimos conocimientos por si trabajas de forma directa o indirecta con ordenadores y volúmenes de datos.

En MySQL se definen tanto la estructura de la base de datos como las relaciones entre las diferentes entidades que van a existir según tus requerimientos dentro de un universo concreto de datos.

Si te cuesta visualizar la afirmación anterior o no la entiendes lo vas a ver muy claro con el siguiente ejemplo. Yo no sé si serás usuario de Netflix o no pero te voy a contar como funciona. La cuenta mas avanzada (y cara) del servicio de televisión bajo demanda permite mediante un único registro, un único email y una única cuenta bancaria o cuenta de Paypal ser utilizado hasta por cuatro personas diferentes.

Cuatro personas que van a acceder a la plataforma con sus propios dispositivos y que van a necesitar una cuenta de usuario para poder entrar. Si nos planteamos guardar este conjunto de datos podríamos hacerlo tal que así de una manera muy muy muy simplificada y sin tener en cuenta otras entidades y relaciones.

Relación de ejemplo en una base de datos relacionales como MySQL
Relación de ejemplo en una base de datos relacionales como MySQL

Como vemos aquí, tenemos la tabla de Usuario en la que almacenaremos datos relacionados sobre los usuarios, ¿lógico no? Un identificador que será un número único, el nombre de usuario, su email y su contraseña. Por otro lado tenemos la tabla Dispositivo en la que también tenemos un identificador, el tipo de dispositivo, su modelo y una referencia al usuario al que pertenece.

Tenemos así una relación, una relación 1:N en este caso, me explico.

Supongamos que el Rey de España es un viciado de las series y en un momento dado se hace una cuenta en Netflix. Al poco tiempo su mujer, la Infanta Cristina y Urdangarin se enteran y le solicitan un acceso a Felipe.

El Rey se conecta a la plataforma mediante su Mac Air, su mujer con un iPad, la infanta lo hace mediante su smartphone y Urdangarin desde una Smart TV. Así pues el conjunto de datos quedaría tal que así:

Vemos que el identificador de Usuario en la tabla Dispositivo es de 1 relacionándose así con el identificador de Usuario en la tabla Usuario. Con esto tenemos que la cuenta elRey se conecta a Netflix usando un Mac Air, un iPad, un Android y una LG.

Esto es lo que conocemos como bases de datos relacionales.

Aquí te dejo un curso completísimo sobre SQL de la Universidad de Standford.

¿Qué es MongoDB?

MongoDB es una base de datos Open-Source desarrollada por los chicos de MongoDB… y que se guía bajo el concepto de base de datos no relacionales. A diferencia de las bases de datos relacionales que exigían definir estructuras de datos fijas y estáticas que acababan tomando forma de tabla, en las bases de datos no relacionales los datos se guardan en forma de documentos en los que la estructura puede variar.

Así pues en uno de estos documentos podemos guardar  la información de la cuenta de Netflix del Rey junto a sus 4 dispositivos, pero además también podemos meter un conjunto de series y películas que le gusta a cada uno de los 4 dispositivos diferentes.

Y todo eso en un solo objeto.

Este tipo de almacenamiento junto a su forma de acceder y explotar los datos lo conocemos como NoSQL y es super rápido debido a que no tiene que ir a otras tablas a buscar información adicional para darnos una visión parcial o total de un universo de datos sino que cuando consultamos algo, todo lo referente a eso ya lo tenemos.

MongoDB utiliza esquemas de datos dinámicos, lo que significa que se pueden crear registros sin definir la estructura, tales como los campos o los tipos de datos de sus valores. Se puede cambiar la estructura de los documentos simplemente añadiendo nuevos campos o borrando los que ya tenemos.

https://gist.github.com/gorkamu/3305fd3e9977b1eabf2b95becc1b8d20.js

Los documentos no necesitan tener un conjunto idéntico de datos y la desnormalización es el pan de cada día de este tipo de bases de datos. MongoDB se diseñó para tener una alta disponibilidad y una gran escalabilidad por lo que su crecimiento horizontal es mas fácil y barato para los sistemas.

Así pues para consultar la información sobre el Rey de España lo haríamos tal que así:

db.Clientes.find({Nombre:"elRey"});

Accedemos a los datos utilizando JSON para hacer las consultas. Aquí tienes el link a la universidad de MongoDB para aprender mas como funciona este tipo de base de datos no relacional.

Terminología y Conceptos

Con esta tabla vas a ver como muchos conceptos de MySQL tiene su analogía con objetos de MongoDB. Estos son los conceptos típicos de cada sistema.

MySQL MongoDB
Tablas Colecciones
Registros Documentos
Columnas Campos
Joins Documentos embebidos o lincados

 

Comparativa de funcionalidades. MongoDB vs MySQL

Al igual que MySQL, MongoDB ofrece un rico conjunto de características y funcionalidades mucho mas allá de los ofrecidos en simples conjuntos de key-value.  Algunas de las cosas que puede hacer son las consultas Ad Hoc, indexar, hacer balanceo de carga o replicarse.

En la siguiente tabla se pueden ver las funcionalidades de MySQL enfrentadas a las de MongoDB.

MySQL MongoDB
Modelos de datos enriquecidos No Si
Esquemas dinámicos No Si
Datos tipados Si Si
Localidad de los datos No Si
Actualización de campos Si Si
Facilidad para los programadores No Si
Transacciones complejas Si No
Administración y auditoría Si Si
Distribución dinámica de datos No Si

 

Lenguaje de consultas

Ambos sistemas tienen un conjunto diferente de estructuras de lenguaje para poder consultar los datos. En la documentación de MongoDB y en la de MySQL encontraras amplia información para manejarte con estas bases de datos pero para muestra un botón (que asco le he tenido siempre a esta expresión)

Consultas típicas de MySQL

https://gist.github.com/gorkamu/35f6c2da75b6a4d1b286d10da79ca0d3.js

Consultas típicas de MongoDB

https://gist.github.com/gorkamu/4ea507a826703ba144703503523a2094.js

MongoDB vs MySQL: update queries performance
MongoDB vs MySQL: update queries performance

¿Cuándo utilizar MongoDB en lugar de MySQL?

Empresas de diferente tamaño y número de trabajadores están empezando a utilizar este tipo de bases de datos ya que les permite desarrollar aplicaciones mas rápido, manejar datos de muy diferente tipo y administrar aplicaciones de manera mas eficiente a escala.

Al utilizar bases de datos no relacionales como MongoDB eliminas la capa ORM, sistema de mapeo objeto-relacional, que se encarga de convertir los datos guardados en tablas en objetos dentro del código fuente, en Java los POJOs y en PHP los POPOs.

La estructura flexible de una base de datos no relacional significa que el conjunto y tipo de datos pueden crecer y evolucionar sin que afecte a los requerimientos de la capa de negocio.

También, las bases de datos NoSQL se pueden escalar de una manera relativamente sencilla y sin tiempo de inactividad a través de diferentes centros de datos distribuidos, proporcionando nuevos niveles de disponibilidad y accesibilidad en comparación con las bases de datos relacionales.

¿Cuando es mejor opción utilizar una base de datos relacional?

Aunque la mayoría de las aplicaciones modernas requieren un sistema flexible y escalable como MongoDB, hay casos de uso para el que una base de datos relacional sería mas adecuado.

Las aplicaciones que requieren complejas transacciones de datos como el sistema de un banco, en el fondo utilizan bases de datos relacionales, al igual que se dice sobre el COBOL…

Las bases de datos no relacionales no son un sustituto de las bases de datos relacionales, son un complemento que podemos utilizar para diseñar un sistema de respuesta ágil utilizando además Varnish como sistema avanzado de cache.

Volviendo con el ejemplo del banco, podríamos tener una primera capa que manejara datos a través de NoSQL  y que fuera la encargada de interactuar con el usuario y las distintas APIs y una segunda capa utilizando SQL y que se encargase de almacenar los datos bancarios cuando los usuarios hiciesen transferencias.

Entonces… ¿MySQL y MongoDB se pueden utilizar juntos?

Pues como he contado arriba con el ejemplo del banco, si. Pero existen muchísimos ejemplos de desarrollo híbrido. En la gran mayoría de casos se trata mas de saber cual es la herramienta concreta para tus necesidades.

Por ejemplo, muchas de las herramientas de ecommerce utilizan una mezcla de ambas tecnologías. Mostrar un catálogo dinámico de productos que tienen diferentes atributos es un buen ejemplo para usar la flexibilidad en la estructura y en los datos que nos aportan las bases de datos no relacionales.

Por otro lado, el sistema de pago del ecommerce, es probable que utilice bases de datos relacionales como motor de persistencia debido a las operaciones complejas que pueden darse en la lógica de negocio y debido al sistema de transacciones que nos brinda MySQL.

En otros casos, nuevos requisitos en la lógica de negocio empujan a las organizaciones a adoptar tecnologías basadas en MongoDB de cara a la próxima generación de sus aplicaciones internas.

Así pues, con estos ejemplos, es bastante normal pensar que MongoDB es mejor que MySQL debido a su modelo de datos flexible y su arquitectura escalable pero todo es cuestión de valorar las mejores herramientas que se adapten a tus requisitos y no adaptar una solución tan solo porque esta de moda.

 

Y con esto se acabó la segunda batalla de gallos de tecnologías. Deja un comentario o ponme un tweet a través del siguiente banner con las tecnologías que quieres que enfrente en la próxima batalla 😉

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

Hala a mamarla!

Cómo añadir nuevos emoticonos a Spark

Para el que no lo sepa, Spark IM es un cliente de chat open source para Linux basado en Java. Este cliente recupera la vieja esencia de MSN Messenger y te permite añadir amigos y hablar con ellos en tiempo real. Normalmente se utiliza en entornos corporativos en los que todavía no se ha implementado otras soluciones mas completas como HipChat o Slack. Sin embargo Spark te permite tener el control total del software al tener que instalar un servidor dedicado junto a Openfire para las salas de chat.

Pues bien, en días tontos de oficina, me di cuenta que los emoticonos que trae por defecto Spark son bastante limitados y me planteé si había alguna posibilidad de añadir nuevas caritas a nuestras conversaciones.

 

El elemento motivacional de todo esto realmente fue la “pseudo-necesidad” de añadir a roto2 al chat para poder vasilar con los compañeros de oficina, así que me pasé las horas muertas de después de comer investigando y haciendo ingeniería inversa a este cliente y me encontré con la forma definitiva para añadir nuevos emoticonos.

Al instalar Spark como cliente, por lo general se crea un directorio oculto que contiene todos los recursos que va a necesitar el programa como los emoticonos, los temas o el icono de la aplicación, es de agradecer que no estuvieran embebidos en el jar del software… 🙂

Cada instalación es un mundo pero lo común de cada una de ellas es el directorio xtra que contiene todos estos recursos.

Pues bien, como os decía, en una de esas tardes tontas de poco trabajo me dediqué a realizar un bash script de instalación que añade tantos emoticonos al cliente como tu quieras. A continuación os dejo el repositorio en github para que lo podáis clonar e instalar.

gitHub-download-button

El proyecto en sí contiene un par de emoticonos de ejemplo que puse en mi instalación. Como no podía ser de otra forma, nuestro dios roto2 está incluido 😉

Para instalar los emoticonos tan solo tienes que darle permisos de ejecución al script y hacerlo correr de la siguiente forma:


$ sudo chmod 775 install.sh

$ ./install.sh

Con esto ya sería suficiente para instalar los emoticonos por defecto que seleccioné, sin embargo si quieres añadir nuevos emoticonos has de saber un par de cositas.

  • Los nuevos emoticonos han de tener formato y extensión PNG
  • Los nuevos emoticonos han de tener tamaño 16×16
  • Los nuevos emoticonos han de estar en el directorio ico/ del proyecto antes de ejecutar el script
  • Para que todos los clientes vean los nuevos emoticonos, todos los clientes han de tener los nuevos emoticonos en su directorio de recursos.

Si echáis un vistazo al script de instalación veréis que hace uso de un par de comandos chulos de Linux como por ejemplo el comando locate para localizar el directorio de instalación o el comando awk para añadir los nuevos iconos el fichero de recursos.

Es bastante posible que se pueda optimizar el script y sobre todo mejorar la parte de awk pero sin embargo, acutalmente el script cumple su función y eso es lo importante 😉

Para todo el desarrollador manitas, sentíos libres de haceros contributors del proyecto, clonarlo y mejorarlo, forkearlo o mandarlo a tomar por culo jeje

Y sin mas dilación… ¡Hala a cascarla! 😛

Cómo embeber Youtube en una aplicación Ionic

Que pasa churritas?

Hoy vengo con un post técnico y corto, una chuleta de referencia en el desarrollo de aplicaciones móviles hechas con el framework Ionic. Anteriormente, en otros posts ya he hablado de este framework.

Si todavía no sabes qué es o no has empezado a juguetear con el puedes leerte este post sobre cómo crear una app con Ionic, si ya has hecho algo puedes leer otro post un poco mas técnico sobre cómo consumir un webservice desde AngularJS.

En cualquier caso, en este post vamos a ver cómo embeber un vídeo de youtube en una aplicación móvil hecha con Ionic y lo más importante, que funcione cuando hagamos el build de la app y la distribuyamos en el market.

Cómo embeber youtube en una aplicación Ionic

Hago este post porque en uno de los últimos desarrollos que estoy haciendo tuve que insertar el iframe de Youtube en la aplicación móvil y vale, lo lógico parece insertar el código que nos da el mismo Youtube cuando vemos un vídeo dentro del html de nuestra aplicación Ionic y a correr.

Si hacemos esto obviamente nos funcionará cuando estamos desarrollando y al haer un ionic serve para ver la aplicación en el navegador podremos disfrutar sin ningún tipo de restricción del vídeo de Youtube. Esto es porque al estar en local y con conexión directa a Internet no hay ningún problema en realizar dicha conexión a Youtube pero el problema viene cuando intentamos seguir este mismo paso una vez que ya hemos empaquetado y firmado la aplicación y la ésta ya se encuentra instalada en un dispositivo.

Iframe de Youtube en HTML

Y es que Android tiene unas políticas de seguridad que por defecto bloquea todas las conexiones saliente que realice tu app a no ser que indiques lo contrario.

Pues bien, para poder llevar a cabo esto y dar permisos de conexión a Youtube a nuestra app tenemos que hacer varias cosillas:

  • Instalar el plugin cordova-plugin-whitelist
  • Hacer un filtro trusteer
  • Dar estilos

Instalando el plugin de Whitelist

Según su documentación oficial:

Listas blancas de dominio es un modelo de seguridad que controla el acceso a dominios externos sobre los cuales su aplicación no tiene ningún control. Cordova ofrece una política de seguridad configurable para definir los sitios externos pueden accederse. De forma predeterminada, nuevas aplicaciones están configurados para permitir el acceso a cualquier sitio. Antes de su aplicación a la producción, debe formular una lista blanca y permitir el acceso a la red específica dominios y subdominios.

Ya estes haciendo la aplicación con Apache Cordova o con el framework Ionic, tendrás que indicarle a la app los dominios a los que quieres dar permiso para hacer una conexión saliente, esto se hace definiendo la política de acceso en el fichero config.xml de la siguiente manera:

<access origin="http://youtube.com">

En cualquier caso, para instalar este plugin con ejecutar el siguiente comando será mas que suficiente:

ionic plugin add https://github.com/apache/cordova-plugin-whitelist.git

Bien, el siguiente paso es crear un filtro que haga de Trusteer con los dominios a utilizar.

Hacer un filtro que haga de Trusteer con los dominios a utilizar xD

Este es el código que utilizaremos para hacer el filtro trusteer:

.filter('trustAsResourceUrl', ['$sce', function($sce) {
    return function(val) {
        return $sce.trustAsResourceUrl(val);
    };
}]);

Cómo veis, utilizamos el objeto $sce. Realmente $sce es un servicio que nos provee de un mecanismo para darle a AngularJS los bindings necesarios en un contexto concreto los valores que han de ser marcados como seguros para ese contexto. El contexto en este caso es la aplicación y el valor del binding es Youtube por lo que con esto le estamos diciendo a AngularJS que Youtube es un origen confiable y seguro para nuestra aplicación.

Dándole estilos al reproductor de Youtube

Por último para que el iframe sea totalmente responsive en nuestra aplicación tenemos que darle ciertos estilos porque sino a lo mejor en un dispositivo de 5 pulgadas se ve de puta madre pero cuando pasamos a una table de 10 pulgadas el reproductor se va a la wea. Así que copiad los siguientes estilos:

.video-container {
    position: relative;
    padding-bottom: 56.25%;
    padding-top: 30px; height: 0; overflow: hidden;
}
 
.video-container iframe,
.video-container object,
.video-container embed {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}

Y con esto es todo, si has seguido el tutorial al pie de página ya serás capaz de embeber vídeos de Youtube en tus aplicaciones Ionic/AngularJS pero recuerda que el servicio $sce no solo funciona con Youtube, funciona con cualquier origen que indiques, no es algo exclusivo del gigante de contenidos multimedia.

En un par de días liberaré el código de la aplicación que decía que estaba haciendo y en la que utilizo el servicio $sce y los iframes de Youtube para que podáis echarle un vistazo.

En cualquier caso, si te has liado con el post o tienes cualquier duda puedes utilizar este banner para preguntarme a través de Twitter.

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

Y sin más…

Hala a cascarla!!

Hacer un vhost en un Nginx sobre Vagrant

Qué pasa chumachos? Tenéis ganas de aprender a hacer un vhost sobre servidores Nginx? Si? Pues allá vamos.

Hoy os vengo con otro post técnico. En este artículo veremos cómo hacer un vhost en un servidor Nginx montado sobre un Vagrant. Toma ya menudo jaleo de palabras xD. Si las conoces y no estas con cara de WTF continúa leyendo.

Lo primero que necesitaremos será tener instalado Vagrant. Pero para el que no lo sepa, vamos a ver qué es Vagrant y qué dice su documentación oficial:

Create and configure lightweight, reproducible, and portable development environments.

O dicho de otro modo, con Vagrant montaremos una máquina virtual en la que tendremos instalado un servidor web (Nginx), PHP, Mysql y el resto de software que nos haga falta.

Para instalar Vagrant solo nos tenemos que venir a la página de descargas y seleccionar el paquete que necesitemos para nuestros sistemas operativos. En mi caso elegí el paquete para arquitecturas de 64 bits con Debian. Esto te descarga un .deb con el que instalar Vagrant de forma super sencilla mediante el Gestor de Software de Linux.

Siguiente paso, instalar VirtualBox, pero…

¿qué es VirtualBox?

Pues VirtualBox es el software que vamos a utilizar para montar esa máquina virtual en la que desplegar el entorno de desarrollo. También hay otro software para la creación de máquinas virtuales como por ejemplo Vmware, pero para hacerlo funcionar bien sin problemas con Vagrant usaremos VirtualBox.

Para descargar VirtualBox os tenéis que venir a la página de descargas y buscar el binario que necesitéis o que os pida vuestro ordenador por eso que es muy importante que conozcáis la arquitectura que tengáis.

Una vez que ya tengáis instalado VirtualBox y Vagrant instalado os podéis clonar esta vagrant-box que ya viene preparada para desarrollar plugins y temas para WordPress. Este es el software que trae la máquina:

  • Ubuntu 14.04 LTS (Trusty Tahr)
  • WordPress Develop
  • WordPress Stable
  • WordPress Trunk
  • WP-CLI (master branch)
  • nginx (mainline version)
  • mysql 5.5.x
  • php-fpm 7.0.x
  • memcached
  • PHP memcache extension
  • PHP xdebug extension
  • PHP imagick extension
  • PHPUnit
  • ack-grep
  • git
  • subversion
  • ngrep
  • dos2unix
  • Composer
  • phpMemcachedAdmin
  • phpMyAdmin (multi-language)
  • Opcache Status
  • Webgrind
  • NodeJs
  • grunt-cli
  • Mailcatcher

Con esta máquina solo te tienes que preocupar de levantarla y liarte a programar. Fin.

Trabajar con Vagrant

Comando para hacer un vhost en una box de Vagrant

Pues venga, vamos a levantar la máquina y configuramos todo, con vagrant up hacemos precisamente eso. Mientras esperas a que se levante la máquina y se inicialice todo puedes irte a preparar un café porque esto tarda un ratito…

Una vez haya acabado nos vamos a conectar a la máquina mediante ssh. Vagrant mola porque tiene un comando para hacerlo, no deja de actuar como un alias asi que guay, Vagrant ssh. Ea, ya está.

Comando para conectarse a una box de Vagrant

Dentro de la máquina podemos navegar por el árbol de directorios y hacer cualquier cosa que hagamos en nuestro ordenador normal. Tenemos que saber que el directorio del servidor web está en /srv/www/ y allí es donde vamos a crear la carpeta para guardar nuestro proyecto. Ejecutamos:

mkdir /srv/www/gorkamu

La configuración para hacer el virtual host de nuestro proyecto “gorkamu” tenemos que ponerla en /etc/nginx/custom-sites/default.conf 

Este es un ejemplo de una configuración típica de un virtual host pensada para desarrollar para WordPress.


##########################################################
# Custom wordpress configuration
#
# These server configurations are to:
# - local.gorkamu.dev
#
################################################################
server {
    listen 80;
    listen 443 ssl;
    server_name local.gorkamu.dev *.local.gorkamu.dev ~^local.gorkamu.d+.d+.d+.d+.xip.io$;
    root /srv/www/gorkamu;
    include /etc/nginx/nginx-wp-common.conf;
}

Hala! Pues ya lo tenemos. Reiniciamos el servidor nginx con cualquiera de los siguientes comandos:

# /etc/init.d/nginx restart
# /etc/init.d/nginx reload
# service nginx restart
# service nginx reload
# nginx -s reload
# /path/to/full/nginx -s reload
# /usr/local/nginx/sbin/nginx -s reload

Si queréis saber cuales son las diferencias de utilizar un servidor Nginx o un Apache echadle un ojo a este link. muy interesante 😉

Hala, que os den!

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.

Cómo instalar Android Studio en Linux

¡Hey!
¿Cómo están? Aquí estoy yo otra vez con un artículo sencillito y de utilidad. El programa del que voy a hablar hoy ya tiene unos meses de antigüedad pero no había tenido necesidad de utilizarlo hasta ahora.
Por temas relacionados con un proyecto, me ha tocado instalar Android Studio en Linux, mas concretamente en Elementary OS, la distro que yo utilizo y como bien sabéis esta basada en Ubuntu. Es algo bastante sencillito pero no esta de más que lo repasemos y lo dejemos en el limbo del Internet como una guía rápida.

¿Qué es Android Studio?

Android Studio es el IDE especializado para desarrollos de Android que presentó Google en su conferencia I/O 2013. ¿Y qué se puede hacer con este IDE? Bueno, como su nombre sugiere, programar aplicaciones para Android. Android Studio esta basado en InterlliJ IDEA de JetBrains. Los que me conocéis sabéis que siento predilección por todos los IDEs desarrollados por JetBrains, ya sea para java o php. Mucha gente opina que Eclipse es el mejor IDE en el mercado pero eso es porque no han probado un IDEA, ya que estos programas de desarrollo están a años luz de Eclipse.

Con Android Studio se pueden ver en directo los cambios que estamos haciendo en el diseño de la aplicación y además viene con diferentes resoluciones para que podamos testear como queda la aplicación en cada dispositivo, vamos un responsinator para Android, ¡genial!

Instalar Android Studio en Linux

Lo primero que tendremos que hacer será descargarnos el IDE y el JDK para poder desarrollar. El programa lo podemos descargar desde la página oficial de Developers de Android.

Para el JDK tiraremos de consola y vamos a instalar la versión la versión libre de Java.

sudo apt-get install openjdk-7-jdk openjdk-7-jre

Para estar seguros que se ha instalado bien podemos comprobarlo con el siguiente comando.

java -version

Cuando hayamos terminado este proceso, nos tocará descomprimir el archivo que nos hemos descargado, en este caso un .tar. Esto lo tenemos que hacer bajo el directorio /opt así que de nuevas tiraremos de consola.

sudo tar xzvf android-studio-bundle-130.737825-linux.tgz -C /opt

Por último y no es que sea indispensable sino más bien recomendado, vamos a crear un lanzados para Android Studio. Con esto conseguimos poder anclar el programa en el dock de Elementary o que aparezca en el Unity Dash de Ubuntu. Esto es muy fácil, tan solo se trata de copiar y pegar lo que aparece a continuación.

Abrimos la consola y tecleamos lo siguiente.

sudo gedit /usr/share/applications/android-studio.desktop

Cuando se nos abra el programa escribimos las siguientes líneas:

[Desktop Entry]
Version=1.0
Type=Application
Name=Android Studio
Icon=/opt/android-studio/bin/idea.png
Exec=&quot;/opt/android-studio/bin/studio.sh&quot; %f
Comment=Develop with pleasure!
Categories=Development;IDE;
Terminal=false
StartupWMClass=android-studio

Si no quieres tirar tanto de código ni estar escribiendo, hay una segunda opción y es crear el lanzador directamente desde el mismo programa. Esta opción la tenemos en la ventana principal, la que te da las opciones para crear un proyecto, pues en Configure > Create Desktop Entry.

Con esta opción se estará creando lo mismo que hemos hecho más arriba de manera manual.

 Configurar Android Studio

La primera configuración obligatoria pasa por establecer las variables de entorno y creando la ya tan famosa JAVA_HOME. Esto lo hacemos editando el fichero /etc/environment y añadiendo la siguiente línea.

JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-i386

Como vamos a desplegar nuestros desarrollos sobre Android, parece lógico que necesitemos el kit de desarrollo para Android. Es bastante frecuente que cuando te dispones a descargar el SDK de Android, también conocido como ADT (Android Development Toolkit) te lo ofrezcan con un Eclipse ya configurado para desarrollar, pero como en este ejemplo utilizamos el propio IDE de Android tan solo bajaremos el kit de desarrollo, para ello lo descargamos desde aquí y lo descomprimimos en la carpeta que queramos.

Tenemos que volver a repetir el proceso de establecer las variables de entorno, pero en este caso necesitamos añadir los directorios tools y platform_tools a la variable $PATH. Esto lo volvemos a hacer desde el fichero /etc/environment/

Vale, ya estamos casi. Algunas utilidades del SDK nos van a correr bajo 32 bits. Si nuestro sistema operativo es de 64 bits vamos a necesitar instalar la siguiente librería.

sudo apt-get install ia32-libs

La última instalación que necesitaremos será ANT. No me quiero explayar mucho en esto, pero tan solo diré que ANT, es el phing para Java.

sudo apt-get install ant
Indicando a Android Studio dónde esta el ADT
Indicando a Android Studio dónde esta el ADT

Por útlimo le tenemos que decir a Android Studio donde se encuentra el kit de desarrollo para Android. Esto lo hacemos abriendo sus opciones de configuración desde la pantalla inicial, Configure > Project Defaults > Project Structure y en la primera caja de texto introducimos la ruta de donde hemos dejado el ADT de Android.

Y eso es todo, ya tenemos la instalación y configuración básica de Android Studio en nuestro sistema operativo. Esta claro que aún se puede poner muchas más cosas pero para comenzar no esta nada mal.

¡Hasta que volvamos a olernos!