martes, 13 de enero de 2015

Migrar una base de datos MySQL de un servidor a otro

Para pasar la base de datos de un servidor a otro, lo más sencillo es crear un fichero SQL que enviaremos al servidor de destino mediante SCP.
  1. Crear backup en servidor de origen:
    mysqldump -u root -p --opt base_de_datos > base_de_datos.sql
  2. Copiar backup al servidor de destino:
    scp -P puerto base_de_datos.sql usuario@servidor:~/
    "-P puerto" se puede omitir si usas el puerto por defecto de SSH.
    La copia en este caso se realiza al home del usuario (~/)
  3. Restaurar backup en servidor de destino:
    mysql -u root -p base_de_datos < base_de_datos.sql
Durante el proceso de restauración podemos abrir una sesión de MySQL (mysql -u root -p) y ejecutar show processlist; para ver qué sentencias va ejecutando, y así poder saber en qué punto de la restauración se encuentra.

Si vamos a restaurar una base de datos de tamaño considerable, podemos modificar algunas variables de /etc/mysql/my.cnf para conseguir un rendimiento mayor. En mi caso, en un servidor con 4GB de RAM, he conseguido reducir el tiempo de restauración de un backup, de 5GB, de 1 hora y 30 minutos a sólo 11 minutos. Estos son los ajustes realizados:

key_buffer_size                 = 1G
innodb_buffer_pool_size         = 1G
innodb_log_file_size            = 256M
innodb_flush_method             = O_DIRECT
innodb_flush_log_at_trzx_commit = 2

En mi caso, key_buffer_size aparecía en my.cnf como key_buffer.
Para cambiar el valor de innodb_log_file_size has de parar MySQL y borrar los ficheros de log (/var/lib/mysql/ib_logfile0, /var/lib/mysql/ib_logfile1...). En lugar de borrarlos, muévelos a una carpeta temporal y bórralos cuando te asegures que MySQL vuelve a iniciar correctamente tras modificar el valor de dicha variable.
Usa el valor 2 en innodb_flush_log_at_trzx_commit sólo para agilizar la restauración. Una vez terminada, deja su valor tal y como estaba.

Una vez hechos los cambios en my.cnf, reinicia MySQL. Puedes comprobar que has asignado correctamente los valores abriendo una sesión de mysql en el terminal y ejecutando show variables like '%nombre_variable%'; 

sábado, 10 de enero de 2015

Cómo configurar tu propio VPS desde cero

Este post describe los pasos sencillos para tener funcionando un servidor privado virtual completo (ssh, web, ftp, base de datos, email...) que posteriormente podremos gestionar usando ispconfig. Lo primero que hay que hacer es elegir un proveedor para el servidor vps. Hay muchos para elegir, entre los cuales, destaco los siguientes:
En mi caso, he escogido digitalocean.com. Si quieres ver más alternativas, aquí tienes un buen listado: http://www.comparevps.com

Para saber si has hecho una buena elección, una vez tengas tu servidor, siguiendo este tutorial podrás ejecutar un benchmark para comprobar el rendimiento del mismo: http://blog.diacode.com/testeando-el-rendimiento-de-tu-aplicacion-con-apache-bench. Si buscas en internet podrás encontrar benchmarks de distintos proveedores realizados por los usuarios.

A parte del servidor, necesitarás al menos un dominio. También hay muchos proveedores. Yo he elegido http://www.dondominio.com porque ofrece whois privado de forma gratuita.

A la hora de crear el vps, es recomendable asignar un FQDN como hostname (por ej: si tu dominio es midominio.com, puedes usar como hostname server1.midominio.com). Una vez contratado el servidor vps, nos habrán proporcionado la contraseña del usuario root para acceder por ssh. Así que empezamos:
  1. Lo primero que haremos será aplicar distintas medidas de seguridad, como cambiar el password de root, restringir su acceso por ssh, crear un usuario en el sistema y cambiar el puerto de ssh para evitar ataques: https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-12-04
  2. Ahora instalaremos ISPConfig (junto con el servidor web, base de datos, ftp, correo, etc...) siguiendo el tutorial indicado (según nuestra distribución): http://www.ispconfig.org/page/en/documentation.html
  3. Si tu servidor tiene poca memoria RAM (1GB o menos) podría interesarte desactivar ClamAV (aunque esto no es aconsejable, es preferible que aumentes la RAM): http://www.faqforge.com/linux/controlpanels/ispconfig3/how-to-disable-spamfilter-and-antivirus-functions-in-ispconfig-3. Cada vez que actualices ISPConfig tendrás que volver a hacerlo, ya que la actualización re-configura los servicios.
  4. Como medida de seguridad, vamos a proteger el directorio de phpmyadmin contra posibles ataques: http://www.howtoforge.com/protect-phpmyadmin-on-an-ispconfig-3-server-debian
  5. Otra medida de seguridad es desactivar el listado de directorios en apache. En Debian, basta con ejecutar como root: a2dismod autoindex y reiniciar apache.
  6. Ahora entramos a ispconfig, y accedemos al apartado System -> Interface -> Main Config. Modificamos la dirección de phpmyadmin con la nueva (si la hemos cambiado). En este apartado podemos ver los prefijos que se añadirán a cuentas FTP, bases de datos, etc...
  7. Accedemos a "clientes" y creamos uno nuevo (al menos uno para nosotros mismos). Ha de haber al menos uno para que al añadir, por ejemplo, cuentas FTP, no nos añada "default" como prefijo, sino que añada el nombre de usuario del cliente. Si no vamos a tener diferentes clientes podemos vaciar los campos "prefix" de la sección System -> Interface -> Main Config para que no nos añada prefijos según el cliente. Pero usando prefijos, y un cliente, estará todo más organizado y preparado para si tenemos clientes en un futuro.
  8. Seguidamente vamos a configurar las DNS para que nuestro dominio "apunte" a nuestro servidor vps (Si necesitas aprender conceptos básicos sobre DNS, este es un buen tutorial: https://www.digitalocean.com/community/tutorials/an-introduction-to-dns-terminology-components-and-concepts, y aquí otro https://support.google.com/a/answer/48090?hl=es). Aquí, entre otras cosas, podemos encontrar otro buen tutorial sobre DNS: http://www.cymru1.net/linux-vps/vps-hints-and-tips.php. Y aquí puedes comprobar tu configuración: http://www.intodns.com. Aquí tienes más formas de comprobar tus DNS: https://www.digitalocean.com/community/tutorials/dns-tips-and-tricks.

    Tenemos dos opciones:

    1. Si queremos usar nuestro proveedor de VPS como nameserver:
    Si has elegido DigitalOcean, en este caso tenemos que entrar a dondominio.com y añadir como nameservers de nuestro dominio ns1.digitalocean.com, ns2.digitalocean.com y ns3.digitalocean.com. Así que ahora DigitalOcean será el encargado de resolver las DNS. Así que ahora tenemos que acceder a nuestro panel de digitalocean.com y añadir el dominio y los registros correspondientes en la configuración DNS. Más info en: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean.
    Si has elegido Hetzner, has de usar "DNS Robot": http://wiki.hetzner.de/index.php/DNS_Robot/en

    2. Si queremos usar nuestro propio servidor:
    Tenemos que entrar a dondominio.com y añadir nuestro servidor vps como nameserver. Sería algo como ns1.midominio.com y ns2.midominio.com. Si el mismo dominio del nameserver es el que estamos registrando (midominio.com) entonces tenemos que crear "glue records" para asociar ns1.midominio.com y ns2.midominio.com a nuestro servidor.
    Una vez introducidos los nameservers, el servidor DNS de nuestro VPS (BIND) será el encargado de resolver las DNS, y podemos gestionar la configuración desde ISPConfig. Más info en: http://www.howtoforge.com/how-to-run-your-own-name-server-with-ispconfig-3-and-fast-hosts.
  9. Puedes usar estos scripts para hacer copias de seguridad de directorios y bases de datos MySQL: http://sviudes.blogspot.com.es/2014/07/scripts-para-crear-y-subir-backups-de.html. Y luego puedes usar Cron para programar la ejecución automática de dichos scripts (https://help.ubuntu.com/community/CronHowto). Cron nos enviará un correo con el resultado del script. Si queremos que el correo nos llegue a nuestro e-mail en lugar de a /var/mail: http://blog.bobbyallen.me/2013/02/03/how-to-redirect-local-root-mail-to-an-external-email-address-on-linux/
  10. Si necesitas un servidor VPN, PPTPD es muy sencillo de configurar y consume pocos recursos: https://www.digitalocean.com/community/tutorials/how-to-setup-your-own-vpn-with-pptp. Una vez conectado a tu servidor por VPN, puedes, por ejemplo, conectar a tu servidor SQL usando MySQL Workbench. Antes debes haber asignado permisos de acceso para tu ip ejecutando estas SQL:
    CREATE USER 'root'@'10.0.0.0/255.255.255.0' IDENTIFIED BY 'TU_PASSWORD';
    GRANT ALL ON *.* TO 'root'@'10.0.0.0/255.255.255.0';
    
Cuando creas un nuevo sitio web con ISPConfig, verás que crea varias carpetas para dicho sitio. Aquí puedes encontrar una breve descripción de para qué deberías usarlas: http://www.lapsum.com/hosting/dudas/donde-debo-subir-mis-archivos

Si después de tener todo el sistema instalado decides cambiar el hostname, aquí tienes cómo hacer: https://wiki.debian.org/HowTo/ChangeHostname

miércoles, 24 de diciembre de 2014

Cómo convertir una RaspberryPi en una consola de juegos retro


  • Descargar la imagen de la SD de RetroPie: http://blog.petrockblock.com/retropie copiar contenido a la SD siguiendo las instrucciones
  • Una vez arrancado el sistema (EmulationStation sobre Raspbian), pulsamos F4 para salir al terminal y ejecutamos: sudo raspi-config, y una vez dentro del programa:
    • Elegir "Expand Filesystem" para usar todo el espacio disponible de la SD
    • En Internationalisation options elegimos zona horaria, ajustes regionales y teclado
    • Salimos al terminal de nuevo
  • Ejecutamos: sudo ./RetroPie-Setup/retropie_setup.sh:
    • Elegir "SETUP"
    • Elegir "Register RetroArch controller" para configurar los gamepads para usar en los juegos.
    • Al hacer lo anterior, se habrá creado un fichero en /opt/retropie/emulators/RetroArch/configs/ (podemos identificarlo por la fecha de creación). En mi caso es USBGamepad.cfg. Este fichero contiene la configuración de los botones para usar en los juegos. En este fichero podemos añadir la combinación de botones que queremos usar para salir de un juego al menú usando el gamepad (respetando los espacios a ambos lados del signo igual):
      input_enable_hotkey_btn = "8"

      input_exit_emulator_btn = "4"

      Siendo los números correspondientes a los botones que quieras usar para formar la combinación para salir del juego.
    • Salir al terminal
  • Si tienes que configurar la wifi, lo más sencillo es entrar al escritorio con startx y lanzar este programa desde el menú: Internet -> wpa_gui
  • Renicia el sistema, y automáticamente volverá a entrar en EmulationStation y nos pide configurar el gamepad para usar en el frontend
  • Para copiar la ROM, accedemos a la carpeta compartida "roms" de la raspberry pi y copiamos las roms en los directorios correspondientes
  • Para que las ROMs aparezcan en EmulationStation basta con salir (F4) y volver a entrar ejecutando: emulationstation
  • Una vez dentro de EmulationStation, puedes pulsar el botón que has definido como Start para acceder al menú. Aquí puedes cambiar algunas cosas de la configuración, y bajarte las carátulas de los juegos.
  • Para configurar los controles en MAME: abre algún juego y luego pulsa la tecla tabulador para acceder al menú.
  • Si quieres quitar algunos emuladores de EmulationStation sólo tienes que editar el fichero /etc/emulationstation/es_systems.cfg y comentar los emuladores que no quieras ver.
Si estás usando un adaptador Retrobit para conectar tus mandos de consola original y no te funcionan las teclas de dirección izquierda y arriba, aquí tienes la solución: http://www.raspberrypi.org/forums/viewtopic.php?f=78&t=36564&p=487878&hilit=retrobit#p487878

Más info y datos sobre como configurar retropie: http://www.elotrolado.net/hilo_hilo-oficial-retropie_2022609

martes, 23 de diciembre de 2014

Cómo hacer y restaurar (o clonar) tarjetas SD con OSX

En el caso de que tengas una Raspberry Pi, y un Mac, te vendrá bien saber cómo hacer copias de tus tarjetas SD.

Lo primero es, por supuesto, introducir la tarjeta SD en el lector.

Lo siguiente es saber qué identificador se le ha asignado a la tarjeta SD:

diskutil list

Imaginemos que se le ha asignado el identificador /dev/disk2. En lugar de usar /dev/disk2 usaremos /dev/rdisk2 (acceso en modo RAW, es más rápido). Entonces para hacer una copia de seguridad basta con ejecutar:

sudo dd if=/dev/rdisk2 of=backup.dmg bs=1m

Y para restaurar una copia (Si da el error "Resource busy", hay que abrir la "utilidad de discos" y desmontar la partición montada):

sudo dd if=backup.dmg of=/dev/rdisk2 bs=1m

También podemos crear copias de seguridad comprimidas:

sudo dd if=/dev/rdisk2 bs=1m | gzip > backup.gz

Y luego restaurarlas así:

gzip -dc backup.gz | sudo dd of=/dev/rdisk2 bs=1m

martes, 2 de diciembre de 2014

Creando capturas de pantalla para promocionar tu app Android

Para hacer buenas capturas de pantalla, necesitaremos dos cosas:
En la web del primer punto, tenemos varios dispositivos a elegir, pero cada dispositivo sólo aceptará imágenes con una determinada relación de aspecto. Por lo que si nuestro terminal no tiene dicha relación de aspecto, o bien usamos el emulador de Android (¡muy lento!), o bien usamos esta app para cambiar el "aspect ratio" de la pantalla de nuestro terminal:
Las capturas realizadas, tras cambiar la relación de aspecto con esta app, tendrán dos barras negras. Podemos recortarlas, por ejemplo, usando ffmpeg (ver script más abajo).

En lugar de hacer las capturas de pantalla usando el terminal, es mucho más cómodo usar adb. Por lo que podemos usar este script para hacer la captura de pantalla, y recortar la imagen:

adb shell screencap -p /sdcard/screen.png
adb pull /sdcard/screen.png
adb shell rm /sdcard/screen.png

DATE=`date +%Y-%m-%d-%H-%M-%S`
./ffmpeg -i screen.png -vf "crop=720:1280:24:0" screen-$DATE.png

rm screen.png

En este script se está recortando la imagen a 720x1280, comenzando en x=24 porque la captura original está hecha con una resolución de 768x1280. Por tanto (768 - 720) / 2 = 24.

Una vez hecha la captura, con la barra de estado a nuestro gusto, la "pasamos" por el "Device Art Generator" y ya tenemos nuestra captura de pantalla perfecta:


lunes, 29 de septiembre de 2014

Learning AndEngine: Aprende a crear juegos para Android

Si estás pensando en desarrollar juegos para móviles, y en especial para Android, entonces AndEngine es el motor que necesitas, y este el libro para aprender a desarrollar con él: http://bit.ly/1udi1vz.

Con este libro (en el que he tenido el placer de colaborar como revisor técnico) aprenderás a desarrollar un juego desde cero, y todo explicado de forma clara, detallada y con ejemplos. Desde la idea, hasta la publicación en Google Play.