martes, 26 de enero de 2016

¿Cómo traduzco mi app o web a más idiomas?

Si desarrollas aplicaciones, ya sea en formato web, móvil, o escritorio, y quieres distribuirlas internacionalmente, te preguntarás cómo puedes traducir tu aplicación a varios idiomas. Esa misma pregunta me hice hace unos años cuando empecé a desarrollar apps y juegos para móviles. Desde entonces, trabajo con ICanLocalize. Hay muchas webs que ofrecen estos servicios, pero acabé eligiéndoles a ellos por la relación calidad/precio, y la sencillez de operación.

ICanLocalize te permite tanto traducir textos simples (para la descripción de tu app en el App Store, por ejemplo), como traducir los ficheros de recursos de tu proyecto. Puedes asignar traductores a tus proyectos, de forma que al actualizar tu app, será el mismo traductor el que traduzca los nuevos strings, manteniendo el estilo y con la ventaja de que ya conoce tu app. Además, si quieres estar seguro de obtener el mejor resultado posible, puedes solicitar la revisión por parte de un segundo traductor.

Como he comentado antes, el precio de ICanLocalize es muy competitivo, y puedes conocer cuánto te costaría realizar las traducciones de forma instantánea, tras subir tus strings. De esta forma, por muy poco, puedes distribuir tu aplicación por todo el mundo, sin preocuparte de las traducciones de los textos.

miércoles, 30 de diciembre de 2015

Clonezilla no reconoce el disco externo USB

Hoy me ha ocurrido que, al ejecutar Clonezilla para restaurar una imagen, éste no reconocía el disco duro externo donde estaba almacenada dicha imagen. Así que para solucionarlo, tras ejecutar Clonezilla, basta con salir al shell, y montar el disco manualmente:
sudo mkdir /mnt/usb
sudo mount /dev/sdc1 /mnt/usb
Clonezilla trabaja con las imágenes en el directorio /home/partimag, así que lo que haremos será montar en dicho directorio (crear un enlace simbólico también debería servir), el directorio donde se encuentren las imágenes a restaurar (o vayamos a crear):
sudo mount --bind /mnt/usb/clonezilla_backups /home/partimag
Ahora entramos a Clonezilla:
sudo clonezilla
Y elegimos la opción "use existing /home/partimag"

¿Qué configuración de PC gaming montar para jugar en 2016?

Recientemente he montado un PC para juegos, por lo que creo que compartir dicha configuración podría ser útil para quien esté pensando en hacer lo mismo. Cada componente está elegido pensando en obtener un buen rendimiento, sin "tirar" el dinero. Esta es la configuración elegida:


Procesador: Uno de los procesadores más utilizados para PC's gaming es el 4790K. Sin embargo, he elegido un 6600K. El rendimiento es muy similar al 4790K, y a parte de ser más barato, y tener las mejoras que vienen con Skylake, me aseguro de que haya disponibilidad de componentes (ram, placa...) en un futuro próximo. Estaba la opción de elegir el 6600 (sin K), pero prefiero tener la posibilidad de overclock (por un poco más de dinero, puedo sacarle más rendimiento). El 6700K es mejor que este, pero hay mucha diferencia de precio (155€) y no ofrece casi más rendimiento en juegos (¿2 o 3 FPS más? no vale la pena...). Como se ha dicho cientos de veces, un i7 no se aprovecha para jugar, con un i5 va más que sobrado.


Placa base: Quería una que permitiera overclock (socket Z170). Tras leer algunas reviews, estaba entre la Asus Z170 Pro Gaming, y la MSI Z170 M5. Son muy similares, y las dos me ofrecían lo mismo, así que escogí la más económica, la ASUS.


RAM: ¿8GB o 16GB? Con 8GB por ahora vamos sobrados para jugar. Sin embargo, cogí 16GB porque había poca diferencia de precio, y quizá pronto empecemos a ver juegos que requieran más RAM. De hecho, el Star Wars Battlefront recomienda 16GB. G.Skill actualmente ofrece calidad a buen precio, así que esa ha sido la marca elegida.


Disco duro: Los SSD empiezan a ser asequibles. Con un disco SSD vamos a conseguir que, tanto el sistema operativo, como los juegos, carguen muy rápido, y todo vaya muy fluido. 250GB quizá se nos queden cortos (teniendo en cuenta que juegos como GTA V ya ocupan 50GB). Así que con 500GB es la cantidad elegida.


Tarjeta gráfica: Lo primero a determinar es: ¿a qué resolución voy a jugar? En mi caso, creo que a 1080 es más que suficiente. La cantidad de dinero que hay que gastar para jugar a más resolución, a una cantidad aceptable de FPS, no compensa. Muchos juegos ni siquiera tienen texturas a suficiente resolución como para aprovechar 2K o 4K, por lo que jugar a esas resoluciones significaría mover más píxeles obteniendo el mismo resultado que con 1080.

Si en procesadores gaming el 4790K es el más común, en tarjetas gráficas lo es la nVidia GTX 970. Tiene muy buena fama, ya que el rendimiento por precio de esta tarjeta es muy bueno. Más que suficiente para jugar a más de 60 FPS todos los títulos actuales a 1080. ¿Me servirá para los próximos años? Yo creo que sí; la mayoría de juegos son ports de consola, y una GTX 970 supera con creces la potencia gráfica de las consolas, ¿van a sacar una nueva PlayStation o XBox a corto plazo? Pues eso...
Un problema conocido de la GTX 970 es que realmente solo posee 3.5 GB de RAM "útiles". Para cargar las texturas necesarias para jugar a 1080, de momento, es suficiente, ¿será suficiente para un futuro? Yo pienso que sí, ya que la GTX 970 está muy extendida (como decía, tiene muy buena fama), y si los desarrolladores de juegos quieren venderlos, ya harán por que funcione con dicha gráfica.

Por encima de la GTX 970, tenemos la GTX 980. Hay de diferencia más de 200€, y la diferencia de rendimiento no es tan grande como para pagar ese dinero. La GTX 980 Ti sí que rinde mucho más que la 970, algo así como el doble, pero, claro, vale el doble.... Una 970 es más que suficiente para "hoy". Si compro una 980, o 980 Ti, sería por poder tener un rendimiento aceptable para más adelante... lo cual considero que no merece la pena: en lugar de gastar 200€ o 300€ más en la tarjeta gráfica, merece la pena guardar ese dinero, y cuando necesitemos más potencia (digamos... ¿2 o 3 años?) con ese dinero (y además podemos añadir lo que nos den por nuestra tarjeta de segunda mano) podremos comprar una tarjeta muchísimo más potente que un SLI de dos 980 Ti actuales.

Estuve también viendo las tarjetas gráficas de AMD. Yo no soy pro-nvidia, ni pro-amd. Hasta ahora he tenido una AMD HD 6850, y me ha dado muy buen resultado. Sin embargo, para este PC he elegido nVidia. ¿Por qué no AMD? Bien, la alternativa AMD a la GTX 970 era la R9 390. A favor de la R9 390: 8GB de RAM, rinde mejor a resoluciones superiores a 1080, se comenta que cuando empiecen a salir juegos con DirectX 12 mejorará su rendimiento. A favor de GTX 970: modelo muy extendido, menor consumo, algunos juegos están mejor optimizados para tarjetas nVidia (vease el conocido caso de "Project Cars"). Como decía antes, no veo problema en los 3.5GB de RAM de la 970, así que eso me da igual. Lo que sí que me importa es el rendimiento con Project Cars, ya que era uno de los juegos a los que más ganas le tenía, y más tiempo le voy a dedicar. Además, la 970 está más que probada, los drivers son muy estables, y sé que me va a dar muy buen resultado. ¿Que la R9 390 será mejor en un futuro con DirectX 12? Pues no lo sé... quizá sí, o quizá no, pero hoy por hoy, para mí la 970 es mejor opción. Aunque comprar una R9 390 también hubiera sido una opción muy válida.

Ahora bien ¿Qué ensamblado de GTX 970 comprar? Al final me he decidido por la Gigabyte G1 Gaming, que viene un poco de overclock de fábrica, y es la que nos va a ofrecer mejor rendimiento. Los ventiladores Windforce son muy silenciosos, y mantienen la gráfica a una buena temperatura.


Fuente: Una buena fuente es muy importante para que todo funcione correctamente. Para una GTX 970, se recomienda como mínimo una fuente de 500W, así que vamos a escoger una con un poco más de potencia, y así nos aseguramos un correcto funcionamiento, y sabemos que nos servirá para cuando cambiemos la gráfica (si ésta necesita más potencia). Vamos a elegir una con certificación "80 Plus" para asegurarnos una buena eficiencia. ¿Marca? Quería una Seasonic (calidad asegurada), pero al no haber stock en el momento de la compra final, me decidí por la Antec HCG-620, que realmente por dentro es una Seasonic M12II-620.



Ventilador y disipador para la CPU: Necesitamos un ventilador que enfríe suficiente para poder hacer overclock al 6600K. Y además, quiero que sea silencioso. Estuve viendo el Noctua NH-D15, que es uno de los mejores del mercado. Pero... ¿90€ por el ventilador? mmm creo que no necesito gastar tanto. Así que después de ver varios modelos, y leer varias reviews, di con el Cooler Master Hyper 412S. Tiene muy buena fama, y no es para menos, ya que consigue muy buenas temperaturas haciendo overclock, y es muy silencioso. Sin duda, por 40€, muy buena compra.



Caja: En cuanto al tamaño, ha de permitir que quepa la placa ATX, ha de tener hueco para la longitud de la tarjeta gráfica, y para la altura del disipador de la CPU. Quería una caja con una estética exterior sencilla, y que además fuera silenciosa (por ello descarté que tuviese uno de los lados transparentes). Tras mucho buscar, encontré la NOX Hummer ZN, que cumplía todos los requisitos: formato ATX, cabe la gráfica, cabe el disipador de la CPU, estética como me gusta, y los laterales están recubiertos de un material para insonorizar.
La caja posee 3 ventiladores que se pueden conectar a los controles que trae para regular la velocidad. Aunque yo los he conectado a la placa base, y puedo controlar la velocidad desde la BIOS.


Tras montar y probar el PC, tengo que decir que estoy muy contento con él. Ejecuta cualquier juego perfectamente, funciona muy fluido, y me ha sorprendido mucho que prácticamente no hace ruido. Sin duda, creo que ha sido una muy buena compra.

Si tienes alguna duda o sugerencia, puedes dejar un comentario más abajo :)

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