12 de julio de 2016

Instalación y configuración básica de NginX en Ubuntu



Introducción a NginX

La principal ventaja de NginX como servidor web es que consume muchos menos recursos al servir contenido estático, y esto lo convierte en una excelente opción para funcionar como proxy inverso o como balanceador de carga para otros servidores como Apache, optimizando la entrega de contenidos.

Lo que hace que Nginx sea diferente a otros servidores web es su arquitectura, que permite responder a millones de peticiones por segundo aprovechando al máximo los núcleos o hilos de ejecución del servidor con una configuración muy simple.

Fuente: https://raiolanetworks.es/blog/nginx/

Instalar NginX en Ubuntu

La instalación de NginX en Ubuntu es casi trivial, sólo hay que ejecutar el siguiente comando:

sudo apt-get install nginx
Si introducimos la URL http://localhost en un navegador de la máquina donde lo hemos instalado, tenemos que apreciar algo así:


Cambiar el puerto por defecto

Para cambiar el puerto por defecto tenemos que modificar el fichero de configuración “/etc/nginx/sites-available/default”

sudo vim /etc/nginx/sites-available/default
Y donde pone “listen 80” ponemos “listen 88”:

Entonces reiniciamos el servidor:

sudo service nginx restart
Si introducimos ahora la URL http://localhost:88 en un navegador de la máquina donde lo hemos instalado, tenemos que apreciar algo así:


Cambiar página web por defecto

Para cambiar la página por defecto de NginX en Ubuntu, nos tenemos que ir a “/usr/share/nginx/html” y modificar el fichero “index.html”:

sudo vim /usr/share/nginx/html/index.html
En este caso simplemente cambiaremos el <title> y el <body> poniendo “Hola nginx!”

Si volvemos a introducir la URL http://localhost:88 en un navegador de la máquina donde lo hemos instalado, tenemos que apreciar algo así:


Opinión personal

Sin ser experto ni en Apache (ver mi articulo "Instalación y configuración básica de Apache en Ubuntu") ni en NginX, la sensación que me ha dado es que NginX es un poco más sencillo de configurar, ahora bien, parece menos versátil.

Yo no he hecho ninguna prueba de carga, pero en muchas de las comparativas que he buscado, como la que pongo abajo, muestran como en temas de rendimiento gana NginX:


Fuente: http://www.theorganicagency.com/apache-vs-nginx-performance-comparison/

Creo de todas formas que el principal indicador a tener en cuenta es el ascenso global en el uso de NginX como servidor web. La cuota de mercado de NginX en el millón de sitios más concurridas es del 24% en diciembre de 2015, sólo por debajo de Apache. Pero ese dato aislado tiene mucho más valor en contexto, viendo la evolución de dicho porcentaje en los últimos 7 años, en donde no ha parado de subir, mientras que el resto de servidores no ha parado de bajar.

Fuente: http://news.netcraft.com/archives/2015/12/31/december-2015-web-server-survey.html

Conclusión: si tuviese que instalar un servidor para servir páginas web, creo que yo, hoy por hoy, me decantaría por NginX.
Leer más

5 de mayo de 2016

Los paquetes imprescindibles del editor Atom

Beautify (para formatear nuestro código)


MiniMap (para mostrar un mapa del documento en la parte derecha)


FileIcons (pone iconos y colores a los distintos tipos de archivos)


Pigments (colorea los colores)


GitTimeMachine (para ver diferencias con las distintas versiones de un archivo)


Leer más

21 de abril de 2016

SSH Tunneling (port forwading) en Linux


Tenemos este escenario (localhost > VPN > 192.168.2.155 > 192.168.2.131):

- Desde localhost, mediante un servicio VPN (podría no tener una VPN y el ejemplo valdría igual, pero en mi caso había un VPN en medio) puedo conectarme mediante SSH al servidor que (en la red de la VPN, aunque como he dicho podría estar en una red local) tiene una IP 192.168.2.155.

- Desde este último servidor puedo acceder al puerto 389 de otro servidor con IP 192.168.2.131.

- El problema es que desde localhot necesitaría acceder al puerto 389 del servidor con IP 192.168.2.131 pero no tengo acceso a dicha IP desde localhost.

Solución: usar SSH Tunneling (port forwading)

A continuación explico como lo he hecho en un CentOS 7, aunque debería funcionar, salvo los últimos puntos donde hablo del firewall, en otras distribuciones Linux:

1.- Hago un ssh al servidor 192.168.2.155:

usuario@localhost$ ssh root@192.168.2.155

2.- Una vez dentro ejecuto el siguiente comando:

root@192.168.2.155$ ssh -f -L 192.168.2.155:9389:192.168.2.131:389 192.168.2.155 -N

3.- Con este comando redirigimos lo que llegue al servidor 192.168.2.155 por el puerto 9389 al puerto 389 del servidor 192.168.2.131.

4.- Podemos ver este proceso ejecutándose lanzando el siguiente comando:

root@192.168.2.155$ ps -ef | grep ssh
root 1234 1 0 10:24 ? 00:00:00 ssh -f -L 192.168.2.155:9389:192.168.2.131:389 192.168.2.155 -N

5.- Si queremos parar el proceso de redirección, deberíamos ejecutar el siguiente comando:

root@192.168.2.155$ kill -9 1234

6.- Para comprobar que efectivamente el servidor 192.168.2.151 está escuchando por el puerto 9389 ejecutamos el siguiente comando:

root@192.168.2.155$ netstat -punta
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address      Foreign Address State  PID/Program name    
tcp        0      0 192.168.2.155:9389 0.0.0.0:*       LISTEN 4843/ssh

7.- Normalmente para que un servidor pueda escuchar por un determinado puerto tenemos que abrir dicho puerto en el firewall, y en este caso (un CentOS 7) tenemos que ejecutar el siguiente comando:

root@192.168.2.155$ firewall-cmd --zone=public --add-port=9389/tcp --permanent

8.- Y una vez hecho esto reiniciar el firewall con el siguiente comando:

root@192.168.2.155$ firewall-cmd --reload

9.- En otras distribuciones Linux para abrir un puerto en el firewall se hace mediante iptables.


10.- Para comprobar que el firewall está correctamente configurado podemos ejecutar el siguiente comando:

root@192.168.2.155$ iptables -nL | grep ACCEPT | grep NEW

11.- Que nos debería mostrar algo así (fijaros, que como estamos conectados por SSH el puerto 22 está abierto):

root@192.168.2.155$ iptables -nL | grep ACCEPT | grep NEW
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ctstate NEW
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9389 ctstate NEW

12.- Ahora, si nos vamos a nuestra máquina local, podremos acceder al puerto 389 del servidor 192.168.2.131 a través del puerto 9389 del servidor 192.168.2.155 gracias al túnel SSH que hemos creado y lo podemos comprobar haciendo un telnet en la máquina local:

usuario@localhost$ telnet 192.168.2.155 9389
Trying 192.168.2.155...
Connected to 192.168.2.155.
Escape character is '^]'. 
Leer más

2 de enero de 2016

Mis propósitos para el 2016


Después de hacer mi retrospectiva del 2015, toca ahora plasmar mis propósitos para este 2016:

1. Primero, dar lo mejor de mi en nueva etapa profesional como Asesor Técnico Docente en el área TIC de la Dirección Genaral de Infrastucturas y Servicios de la Consejería de Educación, Juventud y Deporte de la Comunidad de Madrid.

2. Segundo, aprobar el Máster Universitario en Ingeniería del Software para la Web que me he matriculado en la Universidad de Alcalá.

3. Tercero, seguir colaborando con CIFF como profesor del Máster en Big Data y Business Analytics.

4. Cuarto, conseguir que la gente de la comunidad se involucre en Hackathon Lovers buscando voluntarios y colaboradores.

5. Quinto, me encantaría seguir siendo ponente, ya sea en algún meetup, en el OpenExpo, en el t3chfest, en el Codemotion...

6. Sexto, seguir ayudado a mi gran amigo Fernando con Pronoide.

7. Séptimo, seguir realizando algo de deporte. Me he propuesto hacer deporte dos veces por semana, ya sea correr y/o nadar.

8. Octavo, quiero retomar un poco el inglés. Me conformo con ver series en Inglés, y practicar con Duolingo.

9. Noveno, quiero seguir con mi política de compartir. Aumentar mis aportaciones a mi Blog, mi GitHub, my SlideShare, etc.

10. Y por último, pero no por eso menos importante, no descuidar a mi familia y amigos.
Leer más

1 de enero de 2016

Retrospectiva del 2015


Como otros años, hoy voy a hacer una retrospectiva de lo que ha sido para mi el 2015, indicando los que, a mi parecer, han sido los hechos más relevantes:

1. He trabajado con un formidable equipo en el CRIF de las Acacias. Me ha enriquecido, no solo como profesional si no también como persona. Desde aquí un fuerte abrazo para Víctor, Ana, Mariluz, Jorge, Mayte, Esteban y Guadalupe.

2. He co-organizado 8 hackathones con HackathonLovers. Con ello hemos creado comunidad y conseguido que esta sea conocida.

3. Gracias a Chusa, conseguimos audiencia con el Ministro de Justicia. La verdad es que me hizo mucha ilusión.

4. He sido mentor en Tetuan Valley Startup School, y en el Coder Dojo de Majadahonda. Aunque en la segunda mitad de año, he tenido que dejarlo, pues ya no me daba la vida para más.

5. Estoy colaborando con CIFF como profesor del Máster en Big Data y Business Analytics. Sólo estoy dando el módulo "Data Science Toolkit", pero estoy muy contento. Gracias Miguel Ángel por brindarme esta estupenda oportunidad.

6. He impartido como profesor 2 cursos:

  1. "JavaScript Avanzado"
  2. "Git, GitHub y Markdown"
7. Me he matriculado en el Máster Universitario en Ingeniería del Software para la Web en la Universidad de Alcalá. La verdad es que me está llevando más tiempo del que yo pensaba, sobre todo por las prácticas.
 
8. He recibido 2 cursos como alumno:

  1. "Robótica: conectando con el mundo físico"
  2. "Tutores para la formación en Red"
9. He sido ponente en 5 eventos:

  1. Ponencia en el t3chfest: "CasperJS – Navega con el Piloto Automático" (SLIDES)
  2. Ponencia en The API Hour: "Hackeando hackathones". (SLIDES)
  3. Mesa Redonda en OpenExpo: "Hacia la Cultura Libre".
  4. Ponencia en JustiApps: "Introducción al desarrollo de Apps para los no informáticos" (SLIDES)
  5. Ponencia en el Codemotion: "Navega con el Piloto Automático con CasperJS" (SLIDES)
10. Y por último, pero no por eso menos importante, he ayudado a mi gran amigo Fernando con Pronoide. Mis aportaciones a Pronoide este año han sido menores, pero de mayor calidad, y mi relación con Fernando ha evolucionado muy positivamente.


Después de haber hecho un breve resumen de lo que ha sido para mi este año, voy a chequear los propósitos que me marqué para el 2015 y ver cuales de ellos he conseguido:

1. Primero y más importante, no descuidar a mi familia y amigos.

A medias. Como todos los años siempre pienso que debería pasar aún más tiempo con mis familiares y amigos. A ver si en el 2016 esto mejora. 

2. Segundo, seguir realizando algo de deporte.

A medias. He tenido temporadas mejores y temporadas peores. A ver si este 2016 soy más constante ya sea saliendo a correr y/o yendo a nadar.

3. Tercero, ponerme en serio con el inglés.

No conseguido. No he tenido tiempo de ver casi series y/o películas, ni de practicar con el Duolingo. En 2016 debería invertir esta tendencia.

4. Cuarto, junto con Jorge Árevalo y Carlos Azaustre, llevar a Hackathon Lovers al siguiente nivel.

A medias. En este 2015 hemos co-organizado 8 hackathones. Hemos ido cogiendo fama y seguidores. Y aunque Jorge se ha involucrado mucho este año, Carlos ha pasado a un segundo plano. Como objetivo para el año que viene, conseguir que gente de la comunidad se involucre con nosotros.

5. Quinto, continuar con mi formación, ya sea recibiendo o impartiendo cursos.

Conseguido. He recibido 2 cursos como alumno, he impartido otros 2 cursos como profesor, me he matriculado de un Máster, y soy profesor en otro.

6. Sexto, seguir en mi progresión de convertirme en un programador full stack.

A medias. He mejorado mucho en mis conocimientos de JavaScript, de GIT y GitHub, pero todavía me queda tanto por aprender...

7. Séptimo, me encantaría seguir siendo ponente, ya sea en algún meetup, en el t3chfest, o en el Codemotion.

Conseguido. He sido ponente en el t3chfest, en The API Hour, en OpenExpo, en JustiApps y en el Codemotion.

8. Octavo, quiero seguir siendo mentor tanto en Tetuan Valley Startup School, como en el Coder Dojo de Majadahonda.

A medias. He si mentor tantoen Tetuan Valley Startup School, como en el Coder Dojo de Majadahonda, pero solo la primera mitad del año, luego he tenido que dejarlo, porque la vida ya no me daba para más.

9. Noveno, quiero seguir con mi política de compartir.

Conseguido. Es el año que más aportaciones a mi Blog, mi GitHub, my SlideShare, he hecho.

10. Y por último, pero no por eso menos importante, quiero seguir ayudado a mi gran amigo Fernando con Pronoide.

Conseguido. Mis aportaciones a Pronoide este año han sido menores, pero de mayor calidad, y mi relación con Fernando ha evolucionado muy positivamente.

Resumen:

Conseguido: 4 (40%) A medias: 5 (50%) No conseguido: 3 (10%)

Bueno, aunque mejorable, yo creo que ha estado bastante bien. ʘ‿ʘ
Leer más

27 de diciembre de 2015

Instalación y configuración básica de Apache en Ubuntu

Instalación de Apache

Para instalar Apache2 en Ubuntu (12.04) simplemente hay que ejecutar:

sudo apt-get install apache2
Una vez ejecutado, si apuntamos a http://127.0.0.1 en un navegador donde lo hemos instalado, deberíamos ver algo así:


Cambiar el puerto por defecto de Apache

Para cambiar el puerto por defecto, el 80, por el 8000, tenemos que editar el fichero:

sudo vim /etc/apache2/ports.conf
Como podemos ver en la imagen de a continuación:


Para que los valores surjan efecto tenemos que reiniciar el servidor con el siguiente comando:

sudo service apache2 restart
Ahora, para poder ver la página por defecto del Apache, tendremos que teclear http://127.0.0.1:8000/html/ en un navegador donde lo hemos instalado, como vemos a continuación:


Cambiar la página por defecto de Apache

Ahora vamos a cambiar la página por defecto. Para ello tenemos que editar el fichero "/etc/www/html/index.html":


Ahora tecleamos http://127.0.0.1:8000/html/ en un navegador donde lo hemos instalado y veremos lo siguiente:


Leer más

25 de diciembre de 2015

Ver las cabeceras HTTP en Firefox


A continuación vamos a ver como instalar el plugin "Live HTTP Headers" en Firefox para poder ver las cabeceras HTTP:

Instalación plugin “Live HTTP Headers” en Firefox

Lo primero que tenemos que hacer es instalar el plugin, y para ello lo que tenemos que hacer es ir al menú complementos, como vemos en la captura de pantalla siguiente:


Una vez dentro de la sección de complementos pinchamos en “Explorar todos los complementos”, como podemos ver en la captura de pantalla siguientes:


Se nos abre una página externa en una pestaña nueva en donde podemos buscar el plugin introduciendo su nombre en al cuadro de búsqueda para tal fin:


Una vez localizado el plugin tenemos que pinchar primero en “+ Agregar a Firefox” y luego en el botón “Instalar”.


Luego tendremos que reiniciar el navegador para que los cambios tengan efecto.

Información sobre las cabeceras de una página

Una vez instalado el plugin, si entramos en una página web, por ejemoplo: http://asanzdiego.blogspot.com.es/ y pinchamos en cualquier lugar de la página con el botón derecho del ratón, y luego pinchamos en el menú contextual sobre la opción “Ver información de la página”, como aparece en la captura de pantalla siguiente:

Entonces nos aparece una venta nueva con información de la página. Para ver la información sobre las cabeceras tendremos que pinchar en la pestaña que pone “Cabeceras”, como podemos ver a continuación:


Captura de las cabeceras de una petición GET

El plugin tiene también la opción de ver las cabeceras HTTP que se van enviando y recibiendo a medida que se navega por los sitios web en tiempo real. Para ello tenemos que pinchar en el menú “Herramientas > Live HTTP headers”, como vemos en la siguiente captura de pantalla:


Si nos metemos ahora en https://duckduckgo.com/ y hacemos una búsqueda, podemos observar, en la ventana del plugin como la petición realizada ha sido mediante un GET:


Captura de las cabeceras de una petición POST

Así mismo, si nos metemos en https://twitter.com/ e introducimos usuario y contraseña y pinchamos en el botón “Iniciar sesión”, como vemos a continuación:


Entonces podemos ver en la ventana del plugin, como esta vez la petición ha sido mediante un POST, como podemos ver a continuación:

Leer más

21 de diciembre de 2015

Instalación y configuración de PostgreSQL y PgAdmin en Ubuntu



1. Instalamos 'ProgreSQL':

sudo apt-get install postgresql

2. Ponemos la contraseña al usuario 'postgresql':

2.1. Nos metemos en la consola de postgresql:

sudo -u postgres psql postgres


2.2. Cambiamos la password:

\password postgres


2.3. Salimos de la consola de postgresql:

\q


3. Instalamos y configuramos 'PgAdmin':

3.1. Instalamos el paquete 'pgadmin3':

sudo apt-get install pgadmin3


3.2. Añadimos la extensión 'adminpack'

3.2.1. Instalamos el paquete 'postgresql-contrib':

sudo apt-get install postgresql-contrib

3.2.2. Nos metemos en la consola de postgresql:

sudo -u postgres psql

3.2.3. Ejecutamos el siguiente comando:

CREATE EXTENSION adminpack;

3.2.4. Salimos de la consola de postgresql:

\q


3.3. Modificamos el fichero de configuración 'pg_hba.conf':

3.3.1. Editamos el fichero 'pg_hba.conf':

sudo vim /etc/postgresql/current/main/pg_hba.conf

3.3.2. Buscamos esta línea:

# Database administrative login by Unix domain socket
local   all             postgres                                peer

3.3.3. Cambiamos 'peer' por 'md5':

# Database administrative login by Unix domain socket
local   all             postgres                                md5
4. Añadir usuarios que no sean del sistema:

4.1. Editamos el fichero de configuración 'pg_hba.conf':

sudo vim /etc/postgresql/current/main/pg_hba.conf

4.2. Añadimos la siguiente línea para que puedan entrar desde tu red local (192.168.1.0):

# TYPE   DATABASE   USER   IP-ADDRESS   IP-MASK         METHOD
host     all        all    192.168.1.0  255.255.255.0   md5

4.3. Añadimos usuarios:

sudo -u postgres createuser -D -A -P myuser

-D sin permiso para crear bases de datos
-A sin permiso para crear usuarios
-P se pregunta su password mediante consola

5. Arrancar, parar, reiniciar, recargar:
 
sudo /etc/init.d/postgresql start
sudo /etc/init.d/postgresql stop
sudo /etc/init.d/postgresql restart
sudo /etc/init.d/postgresql reload
Leer más

7 de diciembre de 2015

Recursos de mi "Curso de GIT, GitHub y Markdown"


Hoy enlazo las slides de mi "Curso de GIT, GitHub y Markdown" cuyo contenido es el siguiente:

  1. Acerca de
  2. Introducción
  3. Uso básico de Git
  4. Uso básico de GitHub
  5. Uso avanzado de Git
  6. Uso avanzado de GitHub
  7. Markdown
Leer más

3 de diciembre de 2015

Mis impresiones sobre el seminario "reinventar la educación" de #emadridnet


Ayer estuve en el seminario de #emadridnet sobre tecnologías y metodologías para reinventar la educación.

La primera ponencia: "Avances en soporte inteligente para el aprendizaje colaborativo" la impartió Seiji Isotani, Tecnólogo Educativo, Científico e Innovador.

Habló del Aprendizaje Colaborativo Apoyado por Ordenador (CSCL), un área de investigación que estudia cómo la tecnología puede ser usada para mejorar el aprendizaje colaborativo.

Estas son algunas de las ideas que extraje de la charla:
  • El como se seleccionan los grupos y la secuenciación de las actividades influyen en el aprendizaje colaborativo.
  • También influyen las emociones de los participantes, de hecho, los estudios indican que, en el aprendizaje colaborativo, los estudiantes pasan más tiempo resolviendo los conflictos socio-emocionales que realizando las tareas encomendadas.
  • A los alumnos no les suelen gustar trabajar en grupo, entre otras cosas porque no quieren perder el sentimiento de propiedad personal.
  • Se están haciendo estudios para intentar detectar los sentimientos de los estudiantes, mirando que escriben, la frecuencia de tecleo y el como mueven el ratón.
    La segunda ponencia: "Reinventando la educación" la impartió Anant Agarwal, CEO de edX.

    Habló de como están cambiando los MOOCs en general y edX en particular, el panorama de la educación, y cual cree que va a ser según él futuro de la educación.

    Estas son algunas de las ideas que extraje de la charla:
    •  Los objetivos de edX son:
      • Expandir el acceso a una educación de calidad.
      • Mejorar le educación en los campus.
      • Avanzar en la investigación educativa.
    • Algunos datos de edX:
      • 20 millones de inscritos
      • 6 millones de estudiantes
      • 196 países
      • en el primer curso de edX:
        • se matricularon 154763 estudiantes 
        • de los cuales 7157 certificaron
    • La estructura de los cursos de edX (vídeo corto seguido de tarea corta) promueven un aprendizaje activo.
    • El feedback inmediato mejora el aprendizaje.
    • La duración ideal de los vídeos en un MOOC es de entre 6 y 9 minutos.
    • Los test A/B no solo se pueden usar en marketing, sino también en MOOCs para mejorar los cursos.
    • Según Anant, el futuro de la educación es el Blended Learning, donde se combina la enseñanza presencial con la enseñanza en línea.
    Leer más