2012-12-28

Mupen64+ con GUI en Ubuntu 12.04 y 12.10

Menuda sorpresa me he llevado cuando intenté instalar Mupen64+ en Ubuntu 12.04 y resulta que ya no tiene interfaz gráfica. Correrlo desde la consola no me preocupa lo que en realidad si me molesta es el hecho de no poder configurar el Joypad y no poder abrir ROMs que están comprimidas en archivos .zip.

Estaba seguro de que antes había visto la interfaz gráfica de Mupen64 en Ubuntu y al principio no supe si era que me faltaba un paquete o alguna otra cosa. Buscando en los foros de Ubuntu descubrí que efectivamente la interfaz gráfica había desaparecido de la versión de Mupen64+ en los repositorios de Ubuntu.

En algunas entradas del foro sugieren usar interfaces gráficas de terceros como CuteMupen (una interfaz gráfica hecha para Mupen64+ hecha en Qt). La probé pero es un lío configurarla y además tampoco me permitió configurar el "Joypad".

Al final estaba a punto de darme por vencido cuando se me ocurrió que tal vez podría instalar el mismo paquete que usaba en Natty Narwhal y dio resultado, nuevamente tengo la misma amigable interfaz gráfica de antes y puedo configurar el "Joypad" y por supuesto puedo cargar ROMs que están comprimidas en archivos .zip.

Para hacerlo fui a los repositorios de Ubuntu y busqué el paquete de Mupen64+ en la distribución Oneric, el resultado fue un solo paquete:

mupen64plus (1.5+dfsg1-16)

Lo descargué y lo instalé usando el comando:

sudo dpkg -i mupen64plus_1.5+dfsg1-16_i386.deb

Al hacerlo Ubuntu me notificó que faltaban algunas dependencias, en mi caso los paquetes `libsdl-ttf2.0-0', `libxdg-basedir1' y `liblzma2'. Los primeros dos los instalé sin problema usando apt-get install:

sudo apt-get install libsdl-ttf2.0-0
sudo apt-get install libxdg-basedir1

Sin embargo liblzma2 parece que fue removido de los repositorios de Ubuntu 12.04.

Por suerte aún está disponible en los repositorios de Oneric: liblzma2 (5.0.0-2), así que lo descargué y lo instale:

sudo dpkg -i liblzma2_5.0.0-2_i386.deb

Y ¡ya está! Mupen64+ con interfaz gráfica:

2012-08-28

PHP - File Synchronization Script

Edit

2013-01-24

The code was moved to GitHub: sergio-bobillier/php-file-sync

Also I added a new feature:

USE_CHECKSUM
It will cause the script to use a checksum to compare files. This way the script won't copy files that haven't changed even if their modification dates differ. (Can be slow in some cases).

Fron now on all changes will be posted to GitHub so check the repository there to stay up to date.



Edit

2012-11-05

Some bug fixes.

  • When deleting a whole directory each file being deleted is listed
  • Fixed a bug that caused that when removing a whole directory only the last file in the directory was listed instead of the directory itself.



In brief:


Synchronizing files between two or more computers have never been easier, now you can synchronize files between various locations using a cloud service like Dropbox as hub. However this services although useful have their limits, for me the biggest one is size, 5 GBs are not enough for my music so I decided to write a little script to keep my music in sync between my Desktop and my Laptop computer.

The script is very simple and is well documented so for those of you that just want to watch the code here it is:

PHP - File Synchronization Script on GitHub

How to use:


To use the script:

Note:
Please do not put the script in one of the folders you are going to sync, this will cause unexpected results. Put it somewhere else like in the parent folder or your home directory.

  1. Copy settings-sample.php as settings.php and edit it to fit your needs. The options you can tweak are:
  2. debug mode: This mode will cause the script to print all the actions it takes to the console so you can know what it is doing or check what it is going to do before it actually does it.
  3. simulate: This will cause the script not to take any real actions, the script wont copy, delete or overwrite any file.
  4. After you have adjusted all the settings you can run the script by typing this command in your terminal:

    $ php -f sync-files.php

Tip:
You can set the script to debug mode and simulate at the same time and send all its output to a file to check what the script is going to do before running it for real. I know is hard to trust an script written by someone else specially if you are entrusting it with your precious tunes. ;)

To do it use this command:

$ php -f sync-files.php > sync-result.txt

Then check the contents of sync-reuslt.txt

When running the script for the first time the script guarantees you that after sync is done both locations will have the exact same files and folders. After the first synchronization the script will save a file called .last-sync with the timestamp of the last synchronization in the path it was run.

After the script ran for the first time and the .last-sync file is saved the script will keep the two paths synchronized in subsequent runs, this means that the script will copy any new files you create in any of the two paths to the other, if you delete a file in one of the locations it will be deleted from the other, also if you modify a file in one location the most recent version of the file will be copied to the other path and off course if you rename or move files the script will carry on this changes to the other path.

About the script


Here are some details about the script if you are interested:

What it does:


The script is very simple, what it does is basically this:

  1. It scans all files and folders in the first location, for each file it checks if the same file exists in the other path, if the file does not exists then:
    • If the file was modified after than the last synchronization it copies the file to the other location (Assuming it is a new file)
    • If it was not modified after the last synchronization the script deletes it from the current path. (Assuming it was deleted from the other path)
  2. If the same file exists in both paths then:
    • If the file is a directory then the script recursively synchronizes the directories in both paths
    • If the file is a regular file then it is copied to the other path (overwriting the other file) if it is newer than the file in the other path
  3. Then it does all this the other way around

Off course the script performs some checks to avoid going wildly overwriting and deleting files all the way but yes, this basic algorithm let the script keep the two paths in sync. Note for example that if you rename a file the script will think that the file with the old name was deleted and will delete it from the other path and will think that the file with the new name is a new file and will copy it to the other path, so that is the way it handles renaming and moving.

You can tell of course that the script is very simple and in some particular cases it wont be able to handle all the modifications well and will cause data loss, for example if the same file is changed in both locations the one that was last modified will be kept and the other will be overwritten.

How the script came to be:


As I explained above I have my music in both my Desktop and Laptop computers, at first I just copied the music from my Desktop to my Laptop, using a simple linux command it is easy to only copy files that were new or have been modified since the last time the copy was made.

The problem arises when you start adding, modifying or removing files in both locations, the cp command cannot handle that and thus you need a more elaborated tool.

So I wrote the script and started using it to keep my music in sync between my two computers. Then I realized that the script might be useful for someone else or maybe for a different purpose like keeping files in sync between two servers running a web application or something like that.

Finally


The script is very primitive, currently it is performing just fine to keep my music in sync but I know that it can be improved to better handle more complex modification to files, like merging files that were modified in both locations or warning about conflicts between files.

Also I haven't fully tested it in all particular cases so I can't guarantee that you wont lose a file or two or some modifications you made to a file in one of the locations, that is why I added the simulate and debug modes.

Any comments and suggestions are welcome, feel free to leave yours in the comment section below. Also if you want to use the script in your own application please feel free to do it, don't worry about licenses or giving credit or anything like that, sharing the knowledge is the way of the future.

2011-10-09

[English] PHP: gd library > 2.0 (2.0.1 / 2.0.34) en Ubuntu

Foreword

I noticed that some English speaking people were reading and even making comments on the original (spanish) post. My first guess is: google translator but as good as it may be it is still an automatic translated document and I think I can do better than a blunt headed computer (at least when it comes to translating), also I though it might bring more people into reading the article. So here it is the English version of it:

Introduction

Ubuntu is a very popular operating system, in the last year its popularity has grown a lot because it is a stable and reliable operating system with regular updates. Its popularity has grown not only in desktops and laptops but also in web servers, however, one must admit that from time to time Canonical has some flaws, sometimes they leave very useful software packages out of their official repositories, sometimes they make mistakes when creating packages, create them in a weird way or leave out the latest updates for some software.

This is exactly the case with the gd library for PHP. The gd library is a graphics library that provides various functionalities like scaling, rotating, trimming, among others. Some plug-ins with advanced graphical effects like ImageFlow use this library to achieve those effects, like the reflections. Some CMS, like Drupal use this plug-in to create picture galleries.

ImageFlow in particular needs gd library version 2.0.1 to work and when it doesn't find it, it doesn't work at all, instead of images we get an error message like this one:

ImageFlow requires GD 2.0.1 or higher (2.0.28 recommended)

The problem is that in the Ubuntu systems, even in the last version (11.04) the gd library version that gets installed when you install the php5-gd package is 2.0 and no matter how many times you run apt-get update you never get an updated version of the library since Canonical (or the community member who maintains the package to be precise) haven't updated the library.

When searching through the network there is a lot of people asking how can they solve this issue, not only in Ubuntu forums but in other sites. There is, among the proposed solutions, one which consists in adding the Debian repositories to the sources.list file and then install php5-gd from there. The problem with this solution is that the dependencies in Debian repositories are not the same that in Ubuntu repositories and some times doing this results in things that stop working like the Plesk control panel, because when installing php5-gd other packages get changed too.

Also when trying to install from the Debian repositories some times another problem arise:

Dependency error:
 php5-gd depends on libjpeg > 15b but 15bubuntu1 will be installed
E: Broken packages

Obviously we have the right library version but the problem is that dpkg fails to compare the versions and so the installation can simply fail, and although we could force the installation from apt-get this could leave us to other problems. We could damage the local repositories or even end with a PHP installation that doesn't work at all.

I have found another solution that worked really well for me and I wanted to share it with the Ubuntu community. I really hope that It will work for you as good as it did for me, so, here we go:

Updating the gd library


Uninstalling the current version of php5-gd

The first thing we have to do is uninstall the current version of php5-gd, if we have one installed, that is, to check if there is a version currently installed we use this command:

dpkg --get-selections | grep php5-gd

We will get something like:

php5-gd      install

If the previous command doesn't show any output it means that there is no version of php5-gd installed so you can just go ahead with the following step "Installing Alien". If the library is installed you must remove it completely first, to do so use this command:

sudo apt-get --purge remove php5-gd

When uninstalling the library the system may tell you that there are some packages that were installed with it and that are no longer needed and will suggest you to use apt-get autoremove to get rid of them. PLEASE DON'T DO IT, leave the packages installed because in any case we are going to install another version of the gd library and so the packages will probably be needed again.

Installing Alien

Alien is an special utility that can be installed in the linux systems that use packages and lets you convert .deb (Debian Packages) to .rpm (RedHat and SuSe Packages) and vice versa. We are going to use this utility in the next step so we install it like so:

sudo apt-get install alien

Once we have Alien installed we are ready to go and search for an updated gd library

Get an updated version of the gd library

The CentOS operating system is a RedHat branch and it has the updated version of the gd library and so we are going to use this operating system's packages to bring an updated version of the library to our Ubuntu system. The fist thing we will need is the exact version of PHP we have installed, to get this information we execute this command:

sergio@fate:~$ php --version
PHP 5.3.2-1ubuntu4.8 with Suhosin-Patch (cli) (built: Apr 27 2011 05:07:22) 
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
sergio@fate:~$

We see here that the installed version of PHP is 5.3.2, now we are going to pay a visit to CentOS' Repositories and we are going to search for the correct gd library for our PHP 5 installation. We use the search to locate the right php5-gd package for our PHP version and architecture (32 or 64 bits) and we are going to download it, in my case that would be:

wget ftp://ftp.icm.edu.pl/vol/rzm1/linux-opensuse/distribution/11.3/repo/oss/suse/i586/php5-gd-5.3.2-1.31.i586.rpm

What we are going to get is a .rpm package. Now we have to use Alien to convert it to a .deb package, so we do:

sudo alien -d php5-gd-5.3.2-1.31.i586.rpm

Alien will process the package and convert it to a .deb package that we can install:

php5-gd_5.3.2-2.31_i386.deb generated

Now we have to install it like we do with any other Debian package:

sudo dpkg -i php5-gd_5.3.2-2.31_i386.deb

The location where Ubuntu stores the PHP 5 extensions is a bit weird and somewhat curious opposed to CentOS so we will have to move some files to make them available for our Ubuntu PHP 5 installation, we do so like this:

sergio@fate:~$ cd /usr/lib/php5
sergio@fate:/usr/lib/php5$ ls
20090626+lfs  extensions  libexec  maxlifetime
sergio@fate:/usr/lib/php5$ cd extensions
sergio@fate:/usr/lib/php5/extensions$ ls
gd.so
sergio@fate:/usr/lib/php5/extensions$ sudo mv gd.so ../20090626+lfs/gd.so

Basically what we are doing here is moving the library gd.so from the "extensions" directory to the "20090626+lfs" directory which is the directory where Ubuntu puts PHP extension (I told you it was weird) so that PHP can find it.

In your version of Ubuntu the name "20090626+lfs" may be a little different but you'll know which folder it is by the unusual name

Finishing the installation

Well, so we already have a recent version of the gd library, but, we are not done yet, that library is not totally functional, now we have to take care of some details that arise from using other operating system's packages

For the next step we have to make sure that PHP is logging it's error to a file that we can check, to do so we go to the /etc/php5/apache2 directory and open the php.ini file

There we search for a line like this one:

;error_log = php_errors.log

We remove the semicolon (;) at the beginning of the line and replace php_errors.log with the full path to the file we want PHP to log it's errors to, for example I used:

error_log = /var/log/php5/errors.log

We save the file, then we have to make sure that Apache can write on the PHP log file so use these commands to do so:

sergio@fate:/etc/php5/apache2$ cd /var/log
sergio@fate:/var/log$ sudo mkdir php5
sergio@fate:/var/log$ cd php5
sergio@fate:/var/log/php5$ sudo touch errors.log
sergio@fate:/var/log/php5$ sudo chmod o+w errors.log
sergio@fate:/var/log/php5$ 

Now we restart the Apache web server and check the PHP error log file:

sergio@fate:/var/log/php5$ sudo /etc/init.d/apache2 restart
 * Restarting web server apache2
 ... waiting                                                         [ OK ]

sergio@fate:/var/log/php5$ tail errors.log
[30-Apr-2011 22:19:44] PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626+lfs/gd.so' -
libpng14.so.14: cannot open shared object file: No such file or directory in Unknown on line 0
sergio@fate:/var/log/php5$ 

There we see that there is an error, PHP tells us that we are missing the libpng14.so.14 library, so we are going to look for it on the CentOS' repositories. There we use the search with the option that says Search for rpms which contain given file name (1) e.g. libhistory.so to locate the package with the library we need.

Once we locate the correct package for our architecture (32 or 64 bits) we are going to download the package like we did before:

wget ftp://mirror.switch.ch/pool/1/mirror/opensuse/distribution/11.4/repo/oss/suse/i586/libpng14-14-1.4.4-2.1.i586.rpm

We get the RPM package and once again we use Alien to conver it to a Debian package:

sudo alien -d libpng14-14-1.4.4-2.1.i586.rpm
...
libpng14-14_1.4.4-3.1_i386.deb generated

Then we install the library:

sudo dpkg -i libpng14-14_1.4.4-3.1_i386.deb

After installing the library we restart the Apache Web server and check the PHP error log file once again. If we encounter another missing library we will have to repeat the previous procedure to install it from the CentOS' repositories. When you see no more errors in the PHP error log then the installation is done

Verifying the installation

Now we check that the installation is working properly using the phpinfo function and checking that the installed gd library is version 2.0.34:

GD Supportenabled
GD Versionbundled (2.0.34 compatible)
FreeType Supportenabled
FreeType Linkagewith freetype
FreeType Version2.3.12
T1Lib Supportenabled
GIF Read Supportenabled
GIF Create Supportenabled
JPEG Supportenabled
libJPEG Versionunknown
PNG Supportenabled
libPNG Version1.4.3
WBMP Supportenabled
XPM Supportenabled
XBM Supportenabled

Conclusion

Using the Android utility we managed to update the gd library for PHP. Until Canonical updates the library version in the official Ubuntu repositories this is a good way around the problem.

I certainly hope that this post was useful to you. For me it meant an entire day working trying to find a way to update the library while keeping PHP, Plesk and the rest of the software installed on the server working.

2011-09-09

Apagar el equipo y hacer una captura de pantalla unos segundos antes

Bitelia publicó el día de hoy esta entrada [Descarga del día] AudioBookSleep, cuenta atrás para el cierre del sistema, un programa Windows que permite introducir un tiempo (en minutos) después del cual el sistema se apagará pero no sin antes dejar una captura de pantalla unos instantes antes de que ocurra el cierre del sistema.

Yo me quedé pensando si no sería posible hacer lo mismo en Linux y pensé que tal vez con un script del shell se podría lograr, así que me di a la tarea y escribí un pequeño script de shell que permite apagar el sistema y hacer una captura de pantalla un segundo antes de que se lleve a cabo el cierre del sistema, aquí está:

#!/bin/bash
seconds=$[$1 * 60]
seconds_shot=$[$seconds - 2]
shutdown -P $1 &
sleep ${seconds_shot}s
shot_filename=$(date +'%Y-%m-%d %H.%M.%S').png
scrot "$shot_filename"

Basta con guardar este texto en un archivo llamado shutdown.sh, luego darle permisos de ejecución:

chmod u+x shutdown.sh

Y luego podremos usarlo así:

sudo ./shutdown.sh 60

Nota: Hay que llamar al script usando sudo por que el comando shutdown solo puede ser ejecutado por el root.

Damos el tiempo en minutos y un segundo antes de que se realice el shutdown el script del shell ejecutará el comando scrot que tomará un screenshot y lo guardará en un archivo cuyo nombre será la fecha y hora en la que fue tomado.

cool! :)

2011-05-01

PHP: gd library > 2.0 (2.0.1 / 2.0.34) en Ubuntu

Introducción

Ubuntu es un sistema operativo muy popular, en estos últimos años ha crecido muchísimo en popularidad por ser un sistema operativo estable confiable y con actualizaciones regulares. Su popularidad ha crecido mucho no solo en los sistemas de escritorios y portátiles sino también en los servidores Web, sin embargo, hay que admitir que a veces Canonical tiene algunas fallas, a veces dejan por fuera de sus repositorios software muy útil, otras veces empaquetan mal o de manera extraña y otras veces no ponen en sus repositorios las versiones más actualizadas del software.

Este es el caso de la librería gd para PHP. La librería gd es una librería gráfica que proporciona varias funciones como escalado, rotación, recortado y otras más. Algunos plug-ins con efectos especiales gráficos como el ImageFlow utilizan esta librería para lograr los efectos especiales, como el reflejo en las imágenes, adicionalmente, algunos CMS(s) como Drupal utilizan este plug-in para crear galerías fotográficas.

El ImageFlow necesita de la versión 2.0.1 de la librería gd para funcionar y cuando no la encuentra no funciona en lo absoluto, en lugar de imágenes recibimos un mensaje como este:

ImageFlow requires GD 2.0.1 or higher (2.0.28 recommended)

El problema es que en los sistemas Ubuntu, aún en la última versión (11.04) la librería gd que se instala al instalar el paquete php5-gd es la 2.0 y por más que corramos apt-get updrade nunca obtendremos una versión más actualizada de la librería ya que canonical no la ha actualizado.

Al buscar a través de la red hay un montón de personas que preguntan como pueden solucionar este problema, no solo en los foros de ubuntu sino en otros lugares. Hay por ahí algunas soluciones que consisten en agregar los repositorios de debian al sources.list e instalar php5-gd desde ahí. El problema es que las dependencias en los repositorios de debian no son iguales a las de los repositorios de ubuntu y a veces hacer eso resulta en cosas que dejan de funcionar, como el Plesk por que al instalar php5-gd se cambian otros paquetes.

Adicionalmente al instalar desde los repositorios de debian nos podemos encontrar con mensajes como este:

Problemas de dependencias:
 php5-gd depende de libjpeg > 15b pero 15bubuntu1 será instalada
E: Paquetes rotos

Obviamente tenemos una librería funcional pero el problema es que el dpkg falla al comparar las versiones y por eso la instalación puede simplemente fallar, y aunque podríamos forzar la instalación desde el apt-get esto podría llevarnos a tener problemas después. Podríamos tirarnos los repositorios o hasta terminar con un php que no funciona en absoluto.

Yo he encontrado una solución que funcionó muy bien para mi y por eso quiero compartirla con la comunidad ubuntu. Espero les funcione igual de bien que a mi, aquí vamos:

Actualizar la librería gd


 

Desinstalar la versión actual de php5-gd

Lo primero que haremos es desinstalar la versión actual de php5-gd, si ya tenemos alguna instalada, para saber si hay una instalada podemos usar este comando:

dpkg --get-selections | grep php5-gd

A lo que el sistema responderá con:

php5-gd      install

Si el comando anterior no muestra ninguna salida significa que no tienes instalada la librería php5-gd por lo que podrás continuar con el siguiente paso. Si está instalada deberás desinstalarla por completo haciendo uso del siguiente comando:

sudo apt-get --purge remove php5-gd

Cuando desinstales la librería el sistema te dirá que hay ciertos paquetes que se instalaron con ella y que ya no son necesarios y te sugerirá que corras apt-get autoremove para quitarlos, NO LO HAGAS, deja los paquetes ahí por que igual vamos a instalar luego la librería gd nuevamente así que probablemente serán necesarios.

Instalar Alien

Alien es una utilidad especial que se puede instalar en los sistemas linux que utilizan sistemas de paquetes y que permite convertir paquetes deb (de debian) a rpm (de RedHat y SuSe) y viceversa, vamos a emplear esta utilidad, así que la instalamos así:

sudo apt-get install alien

Una vez está instalado Alien estamos listos para ir a buscar la librería gd actualizada.

Obtener una versión actualizada de la librería gd:

El sistema operativo CentOS que es una ramificación de RedHat si tiene la versión actualizada de la librería gd por lo que usaremos los paquetes de este sistema operativo para traer una versión actualizada a la librería a nuestro ubuntu. Lo primero que necesitamos saber es que versión de php5 tenemos, para lo cual ejecutamos:

sergio@fate:~$ php --version
PHP 5.3.2-1ubuntu4.8 with Suhosin-Patch (cli) (built: Apr 27 2011 05:07:22) 
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
sergio@fate:~$

Vemos que es la 5.3.2, ahora vamos a ir a visitar el repositorio de paquetes de CentOS y vamos a buscar la librería gd adecuada para nuestra versión de php5. Usamos el search para localizar el paquete php5-gd correcto para nuestra versión de php5 y nuestra arquitectura (32 o 64 bits) y lo descargamos, en mi caso;

wget ftp://ftp.icm.edu.pl/vol/rzm1/linux-opensuse/distribution/11.3/repo/oss/suse/i586/php5-gd-5.3.2-1.31.i586.rpm

Lo que obtendremos será un paquete .rpm. Ahora debemos usar el alien para convertirlo a un paquete .deb, para lo cual:

sudo alien -d php5-gd-5.3.2-1.31.i586.rpm

Alien procesará el paquete y lo convertirá a un paquete .deb:

php5-gd_5.3.2-2.31_i386.deb generated
Ahora debemos instalarlo como cualquier paquete debian corriente:
sudo dpkg -i php5-gd_5.3.2-2.31_i386.deb

La organización de las extensiones de PHP 5 es un poco diferente entre ubuntu y CentOS, así que deberemos mover la librería al lugar correcto para que funcione con el PHP, lo hacemos así:

sergio@fate:~$ cd /usr/lib/php5
sergio@fate:/usr/lib/php5$ ls
20090626+lfs  extensions  libexec  maxlifetime
sergio@fate:/usr/lib/php5$ cd extensions
sergio@fate:/usr/lib/php5/extensions$ ls
gd.so
sergio@fate:/usr/lib/php5/extensions$ sudo mv gd.so ../20090626+lfs/gd.so

Básicamente, aquí lo que hemos hecho es mover la librería gd.so del directorio extensions al directorio 20090626+lfs que es donde ubuntu almacena las extensiones de php5

Terminar la instalación

Bien, ya tenemos instalada una versión reciente de la librería gd, pero aún no es totalmente funcional, ahora debemos encargarnos de algunos detalles que surgen como resultado de usar paquetes de otro sistema operativo.

Para el siguiente paso debemos asegurarnos de que PHP esté registrando los errores en un archivo de registro que podamos consultar, para ello, vamos a /etc/php5/apache2 y abrimos el archivo php.ini

Allí buscamos una línea como esta:
;error_log = php_errors.log
Le retiramos el punto y coma (;) al inicio de la línea y colocar allí la ruta a un archivo donde se escribirá el registro de los errores de PHP, por ejemplo:
error_log = /var/log/php5/errors.log

Guardamos el archivo, luego debemos asegurarnos de que el Apache pueda escribir en el archivo que hemos elegido:

sergio@fate:/etc/php5/apache2$ cd /var/log
sergio@fate:/var/log$ sudo mkdir php5
sergio@fate:/var/log$ cd php5
sergio@fate:/var/log/php5$ sudo touch errors.log
sergio@fate:/var/log/php5$ sudo chmod o+w errors.log
sergio@fate:/var/log/php5$ 

Ahora reiniciamos el apache y consultamos el archivo de registro de errores:

sergio@fate:/var/log/php5$ sudo /etc/init.d/apache2 restart
 * Restarting web server apache2
 ... waiting 
                                                                                                                                                                           [ OK ]

sergio@fate:/var/log/php5$ tail errors.log
[30-Apr-2011 22:19:44] PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626+lfs/gd.so' - libpng14.so.14: cannot open shared object file: No such file or directory in Unknown on line 0
sergio@fate:/var/log/php5$ 

Allí vemos que hay un error, nos dice que nos hace falta la librería libpng14.so.14, vamos a ir a buscarla al repositorio de CentOS. Allí usamos el search con la opción Search for rpms which contain given file name (1) e.g. libhistory.so para localizar el paquete con la librería que necesitamos.

Una vez lo ubiquemos seleccionamos el paquete correcto para nuestra arquitectura (32 o 64 bits) y descargamos el paquete como antes:

wget ftp://mirror.switch.ch/pool/1/mirror/opensuse/distribution/11.4/repo/oss/suse/i586/libpng14-14-1.4.4-2.1.i586.rpm

Obtendremos el RPM y nuevamente usamos el Alien para convertirlo a un paquete de debian:

sudo alien -d libpng14-14-1.4.4-2.1.i586.rpm
...
libpng14-14_1.4.4-3.1_i386.deb generated
Luego instalamos la librería:
sudo dpkg -i libpng14-14_1.4.4-3.1_i386.deb

Luego de esto reiniciamos el apache y comprobamos nuevamente el archivo de errores del PHP. Si encontramos otra librería que haga falta tendremos que repetir el procedimiento anterior para instalarla. Cuando el PHP no presente más errores habremos terminado con la instalación.

Comprobar la instalación:

Ahora comprobamos la instalación usando la función phpinfo y verificamos que la librería gd instalada sea la 2.0.34:

GD Supportenabled
GD Versionbundled (2.0.34 compatible)
FreeType Supportenabled
FreeType Linkagewith freetype
FreeType Version2.3.12
T1Lib Supportenabled
GIF Read Supportenabled
GIF Create Supportenabled
JPEG Supportenabled
libJPEG Versionunknown
PNG Supportenabled
libPNG Version1.4.3
WBMP Supportenabled
XPM Supportenabled
XBM Supportenabled

 

Conclusión

Usando la utilidad Alien hemos logrado actualizar la librería gd para php. Hasta que canonical actualice la versión de los repositorios de ubuntu esta es una buena forma de quitarnos el problema de encima.

Espero que esta entrada les haya sido de mucha utilidad. Para mi significó un día entero de trabajo buscando la manera de actualizar la librería.

2011-04-25

What a good Mid-Rate Lineage II server should have

I've been playing Lineage II since C1 I started in this 1x server. Ever since then a lot has changed and I'm not talking about the game client only but about myself. I have moved to other servers and I have experienced Low rate, mid rate and high rate and the one I like the most without any doubt is Mid rate it has the best of the other two experiences.

The best mid-rate server I have ever played is Sieghart in Lineage II Teh Game. That server no longer exists because Lineage II Teh Game have been through a lot of changes and it doesn't have a Mid-rate server anymore, it only has the original Bartz low rate server and the high rate Aria server.

Without any doubt Sieghart taught me a lot it gave me more experience that all the other servers together, It was there where I first raided an Epic Boss, the first time I played olympiads and the first time I became hero. It was also the very first time I enjoyed being in a clan and playing with friends. Sadly the guys from Teh Game closed the server because they did a really bad update and they had no way to roll the server back to what it was before that shameful decision (that is my guess) but it doesn't change the fact that on it's peak that was without a doubt the best Mid-rate server ever made.

After Sieghart closed I moved on to Phoenix and I have to admit that I had a really good experience there although I think I ended up hating Greek people because they where so cocky and arrogant and in the top of that they were cheaters and made almost any kind of dirty tricks to prove that there was no one better than them... off course a lot of them where just bad players, curse them! but anyways, I had a good time playing in Phoenix. Sadly it was also wiped because the GMs did a poor job when it came to balance the server they did a lame job with landing rates and made sloppy work when it came to fix those faults also I think they wiped out the server because a lot of newbie guys where crying because they had no way to reach the level old players had attained, in the end I think it was all for nothing.

Now they opened Aria which is not a bad server just it doesn't have what I find fun about a server it is totally PvP driven and I don't like PvP that much, so I decided to leave.

Ever since I have been looking around the web trying to find a good Mid-rate server as close to Sieghart as possible but to no avail, nowadays It seems like any noob can create a Lineage II server and thus you see some things around that ¬.¬ there are no words to describe such failed servers.

There are guys around the web trying to create Mid-rate servers that are more like High-rate servers others trying to create Mid-rate servers with crafting which is a feature for low-rate servers. OMG What are they thinking? I can't believe they really think they will succeed with those crappy servers. And last but not least people who tries to force server balance with stupid mods like making Epic bosses accessible only through castles (yeah, like that is going to work -.- It's like they have never played in other servers before). I say, that is why your servers are boiling with peaks of 11 players on-line! Good job ¬.¬

Okay, so here is what I think a good Mid-rate server should have. If this description resembles Sieghart it is because that was a really good Mid-rate server. So here it goes:

  • First of all the rates. It is MID-RATE, that means above 30x and under 100x. Please don't make me loose my time going in your "mid-rate" server site to see that it is a 1000x server THAT IS NOT MID-RATE BY GOD'S SAKE!!!!
  • Crafting: We DON'T want to craft that is for low rates! We just want to buy our equipment from the NPC Shop as we level up. It is okay to make high level equipment and S/As hard to obtain but PLEASE, PLEASE don't make us craft it totally sucks!
  • Adena and XP balance: Please don't make me reach level 61 with D grade equipment that is something I hate about official L2, It totally sucks! Please, please, just take a character and level it up and adjust the adena drop rate or prices in the NPC shop accordingly. (I guess there are a lot of GMs who level up by command and don't even bother on testing the drop rates or adjusting the prices).
  • NPC Buffers: This is not so hard I don't know why so many servers fail with this. It is a Mid-rate server there should be a NPC buffer in towns we don't want to log 5 accounts just to level up and there are no big clans with a lot of support characters in Mid-rate servers. And please, by god's sake don't go over to the other end, please don't put Songs, Dances or Third class buffs in NPC buffers is mid-rate not high rate. If the server is starting it is okay but as the server grow up those buffs should be removed from NPC buffers. Is a mid-rate not high rate PvP server.
  • Farming zones: Please don't fuck everything up modding the mobs to drop special items to buy things from the NPC Shop it totally sucks! Don't restrict farming areas, some of us who have experience in the game have special areas to level up our characters depending on the class and we DON'T want to be restricted by noobs like you that think that all areas are provided equal.
  • Custom Currency: In a Mid-rate server it should be a custom currency with an appropriate exchange rate to Adena. Medals worked really well in Sieghart and obtaining them through events was a really cool feature. It was also a nice feature to make champions drop some of this custom currency but only on high levels (80 and above) to avoid low level bot characters farming for a lot of them.
  • High level equipment and S/As: Please, we don't want to level up a crystal to put acumen on our Sword of Miracles which we will be using for only an hour while we level up to 76. In a mid-rate servers weapons should be sold with S/A on them up to a certain grade after which you have to get it in the retail way (leveling up a crystal). In a Freya server for example I think you should be able to buy S/A weapons on the NPC Shop up to S grade, maybe S80.
  • Please avoid custom weapons and armors we don't want to play low rate but that doesn't mean we want to play a totally customized game, we don't want titanium or crystal or triumph sets, we are okay with the sets NCSoft made.
  • Features page: Please when making the server website add a feature page in which I can see what kind of game-play should I expect from the server. I care more about NPC Shop and Buffers and custom farming areas that the physical setting of the machine that runs the server.
  • Events: Please add events to the server. Good events, like those in Lineage II The Game, TvT, CTF, KoH, FOS not crappy events like races and chest events (those are good for a GM event not for automated events). Events are crucial in this kind of servers because we want to PvP from time to time.
  • Please don't customize Sub class and Noblesse quests. If you think your server doesn't have the population to allow players to do subclass quest then make it free. As for noblesse please don't customize this quest this quests are one of the things that I appreciate from low-rate and retail.

This is is for now. If I think of something else I will add it here. As I go around the web searching for a good Mid-rate server I will post my findings here (only the ones I make from now on). You never know what else can you find around and I would like to make fun of fail servers.

2011-04-07

MacOS X en VirtualBox -- Mi experiencia personal --

Bueno, primero que nada decir que esto no pretende ser un tutorial, lo que funcionó para mi puede no funcionar para nadie más, nada es seguro cuando se trata de hacer correr este sistema operativo en PCs y más aún sobre máquinas virtuales. Así pues esta es mi experiencia personal, puede que funcione para ustedes como puede que no


 

Que hace falta:

Antes de comenzar deben contar con lo siguiente:

  • Un procesador Intel de 64 bits que tenga la tecnología Intel VT (Puedes verificar si tu procesador cuenta con esta tecnología en la Lista de procesadores de Intel que la soportan)
  • Una tarjeta madre que soporte la tecnología Intel VT (Puedes verificar si tu tarjeta madre soporta la tecnología en la Lista de tarjatas madre Intel que la soportan)
  • Un sistema con un hardware razonablemente poderoso, 2 GB de RAM o más, procesador de doble núcleo de 2 Ghz o más rápido
  • VirtualBox 4.0 o posterior
  • Una copia del iBoot
  • Una copia (sin parchar) del MacOS X Snow Leopard [Si tienes una copia parchada este tutorial no te aplica]

 

Cómo empezar

Lo primero que necesitas es activar la tecnología Intel VT en tu tarjeta madre. La mía venía con esta característica desactivada y según he leído vienen por defecto así.

Para activar la tecnología Intel VT debes:

  1. Reiniciar tu equipo
  2. Cuando aparezca la pantalla de incio de la Board debes presiona F2 para ingresar a la utilidad de configuración de la BIOS
  3. En la opción de Seguridad (Security) localiza la opción y activa la tecnología Intel VT
  4. Si tu tarjeta madre cuenta con extensiones como VT-d, VT-i o VT-c no dudes en activarlas también ya que mejorarán muchísimo el desempeño de la máquina virtual.

  5. Guarda los cambios en la configuración y abandona la utilidad de configuración
  6. Apaga tu equipo y enciéndelo de nuevo. (OJO, esto es importante, debes apagar el equipo, no solo reiniciarlo, debes apagarlo completamente o los cambios no surtirán efecto)

Si estás preocupado por las repercuciones que activar la tecnología Intel VT podría tener en el desempeño normal de tu equipo en las tareas cotidianas no te preocupes, no tiene ningún impacto en aplicaciones que no estén relacionadas con Virtualización, en algunos lugares dice que puede reducir la velocidad de las máquinas virtuales en el VirtualBox pero la verdad yo no he visto tal comportamiento en mis máquinas virtuales.

Configurar la máquina virtual

  1. Ingresa al VirtualBox y crea una nueva máquina virtual
  2. Dale a la máquina virtual una buena cantidad de memoria, 1 GB o más
  3. Crea un nuevo disco duro para la máquina virtual. Dependiendo de lo que pretendas hacer en la máquina virtual y de la cantidad de espacio de la que dispongas selecciona un tamaño adecuado para el disco duro virtual.
  4. Listo, ya está lista la máquina Virtual

Configurar la máquina Virtual

Debes configurar la máquina Virtual pues la configuración predeterminada del VirtualBox no funcionará de entrada. Las configuraciones que debes alterar son:

  1. Fíjate que esté seleccionado el Chipset ICH9, que esté habilitado el I/O APIC y que esté deshabilitada la opción EFI:
  2. Únicamente debes darle una CPU a esta máquina virtual o te encontrarás con inestabilidades cuando esté corriendo.
  3. Luego en la pestaña de Aceleración asegúrate de marcar la opción Intel VT. [Según he leido la opción de Paginación Anidada solo funciona en los Intel Core i7 pero si la dejas activa y tu procesador no es compatible el VirtualBox no la toma en cuenta, yo la dejé activa en cualquier caso]
  4. Aumenta la memoria de vídeo que le das a la máquina virtual. Si quieres puedes activar la opción de Aceleración 3D y probar a ver que tal te va, si mejora el rendimiento puedes dejarla activada, si te causa problemas puedes retirarla.
  5. Finalmente deberás montar la imágen del iBoot en la unidad de CD de la máquina virtual, sin el iBoot no podrás arrancar el instalador del MacOS X

Un comentario sobre EFI

Un pequeño paréntesis en el procedimiento. EFI es un sistema de arranque desarrollado por Intel y es el que utilizan los Mac, entonces ¿por que no dejamos el EFI activado? La razón es que al tratar de arrancar la máquina virtual en modo EFI el Kernel del MacOS X hace una verificación de procesador y al no detectar un procesador conocido lanza un Kernel Panic y no continua arrancando, al menos eso me pasó a mi y por eso tuve que usar el iBoot.

Si alguien aquí logra arrancar en modo EFI sin que el MacOS lance el Kernel Panic por favor haga un comentario con el procesador que tiene y si tuvo que hacer alguna configuración adicional para poder arrancar.

Instalar MacOS X

  1. Arranca la máquina Virtual, lo primero que aparecerá será el iBoot:
  2. Mientras estás en el iBoot utiliza el menú de la máquina virtual para montar el CD del MacOS X y luego presiona F5 (en la máquina virtual), verás que aparecer el CD en el menú del iBoot. Luego presiona Entrar para arrancar el instalador
  3. Selecciona el idioma para el instalador:
  4. Haz clic en "Continuar" y acepta los términos de la licencia para iniciar el instalador
  5. El instalador te pedirá que selecciones un disco duro para instalar el sistema pero no verás ningún disco duro en la lista, haz clic en el menú utilidades y selecciona Utilidad de Discos
  6. En la utilidad de discos selecciona el disco duro en la lista de la izquierda, luego pásate a la pestaña "Borrar" y haz clic en el botón "Borrar" para borrar el disco duro, esto creará tabla de particiones, y partición nueva todo de forma automática.
  7. Una vez el disco haya sido borrado Haz clic en el menú Utilidad de Discos y selecciona "Salir de la Utilidad de Discos" u oprime Windows+Q para volver al instalador, ahora si verás el disco en la lista de discos duros:
  8. Selecciona el disco duro y haz clic en instalar para empezar la Instalación, la instalación tardará aproximadamente 30 minutos.

Cuando termine la instalación la máquina virtual se reiniciará (Si no se reinicia sino que ves un mensaje de error diciendo que debes apagar el equipo en varios idiomas reiníciala desde el menú de VirtualBox).

Al iniciar nuevamente la máquina virtual no arrancará, verás un mensaje que dice que no se han encontrado sectores de arranque. Debes entonces volver a montar el iBoot en la unidad de CD y reiniciar la máquina virtual, verás entonces lo siguiente en el iBoot:

Oprime la flecha derecha y selecciona la manzana, luego presiona Entrar para arrancar el sistema operativo.

Me ha ocurrido a veces que el sistema operativo no arranca sino que aparece ese odioso mensaje en varios idiomas diciéndome que debo apagar el equipo, en ese caso apago la máquina virtual desde el menú del VirtualBox y la vuelvo a arrancar y arranca bien, es un tanto caprichudo ese sistema operativo al estar corriendo en una máquina virtual.

Después de que la máquina virtual vuelva a arrancar deberás introducir información como tu nombre, correo electrónico y demás, nada del otro mundo, también deberás escoger una distribución de teclado. Por difícil que resulte creerlo el MacOS NO tiene la distribución de teclado latinoaméricano así que tendrás que conformarte con la distribución Español de España.

Actualizaciones del Sistema

Una vez instalado el MacOS X si quieres actualizar el sistema a la última versión debes tener en cuenta lo siguiente. Si actualizas el sistema seleccionando el menú de la manzana y luego haciendo clic en Actualizaciones de Software lo que sucederá es que al reiniciar el sistema luego de la instalación perderás el ratón. Por alguna razón al actualizar el sistema operativo la máquina virtual es incapaz de reconocer el ratón del host y créeme manejar un MacOS X sin el ratón es toda una odisea.

Así pues, si quieres actualizar el sistema te recomiendo que sigas estos pasos:

  1. Bájate el último Update Combo para el Snow Leopard de la página oficial de Apple. Al momento de escribir este post el último Update Combo era el 10.6.6
  2. Bájate el MultiBeast, que es un paquete para post-instalación que trae varias utilidades como Extensiones de Kernel para sonido, para tarjetas de red, un bootloader, etc.
  3. Instala el Combo update que bajaste de Apple. Cuando la instalación termine el instalador te pedirá que reinicies la máquina, NO LO HAGAS.
  4. Instala el MultiBeast y selecciona entre las opciones que te presenta una que se llama "EasyBeast", que es la más simple.
  5. Después de que se instale el MultiBeast ahí si podrás reiniciar la máquina y tendrás el Sistema Operativo actualizado y no habrás perdido el Mouse.

Luego de hacer el procedimiento anterior ahí si podrás utilizar la actualización de software del sistema para actualizar el iTunes y el resto del software.

iWork

Instalé iWork 09 pero no funcionó aunque el programa corre no veo lo que escribo en Pages, los otros programas ni me molesté en probarlos.

Corrí las Actualizaciones de Software y actualicé tanto el sistema operativo como el iWork y definitivamente no funcionó.

Open Office por el contrario funciona muy bien, mi consejo es, no usen iWork, usen Open Office, hace lo mismo y funciona mejor.

Comentarios finales

Algunos comentarios finales:

Antes que nada debes recordar que el MacOS está corriendo en una máquina virtual y por lo tanto tiene algunas cosas que no funcionan como funcionan en un Mac real, tiene glitches gráficos, o se puede congelar repentinamente.

Segundo, no tienes soporte para sonido, el sonido dentro de la máquina virtual es horrible, se oye cortadísimo y muy lento, si quieres puedes intentar instalar este kext para el sonido AC97, yo aún no lo he intentado

Otra cosa que no he podido hacer es hacer que el sistema operativo corra a más de 1024x768, hay una solución en la documentación del VirtualBox pero el problema es que solo funciona cuando el sistema arranca en modo EFI y como ya expliqué más arriba el sistema no está arrancando en modo EFI así que esa solución no funciona

Siempre que arranques el sistema debes tener el iBoot montado en la unidad de CD para poder bootearlo, pero una vez que el sistema arranca ya puedes cambiar la imagen de CD sin ningún problema.

Nunca podrás usar el sistema operativo para hacer cosas que requieran una gran exigencia gráfica, osea, si pretendías editar vídeo con Adobe Premiere olvídate, mejor anda y comprate un Mac real

A mi el sistema nunca me apaga, siempre que trato de apagarlo me sale el mensaje ese de los varios idiomas así que a la final tengo que forzar a la máquina virtual a apagarse. Tampoco puedo entrar al Diálogo "Acerca de este Mac" cuando trato de hacer eso la interfase gráfica muere. (Se parece mucho a cuando se reinicia el servidor X en Linux)

Conforme experimente más y vaya encontrando soluciones a los problemas que he descrito aquí postearé nuevas entradas al respecto. Por ahora espero que se diviertan experimentando con este sistema operativo, que por cierto es hermano de Linux =), Así es, también tiene un kernel Unix

2010-09-20

Final Fantasy XII ¡¡¡¡APESTA!!!!

No quisiera tener que decir esto de un Final Fantasy pero Final Fantasy XII ¡¡¡¡APESTA MUCHO!!!!

Se suponía que el sistema del juego estaba pensado para dar al jugador la sensación de estar jugando un MMORPG pero ¡HUY NO! ¡LA CAGARON! La cámara es absurdamente errática, la enfoco hacia mi objetivo, me muevo y la cámara se mueve para donde le da la gana y no me deja ver al enemigo o a los NPCs.

Aparte te dan la oportunidad de moverte durante los combates lo cual no sirve de nada por que igual los bichos te siguen pegando, no puedes atacar cuando tu quieres sino que debes esperar a que se llene la barra de acción ¿para que quiero correr durante el combate si no puedo atacar cuando quiero y a pesar de correr no puedo evitar los ataques del enemigo? Y como si todo eso fuera poco cuando me muevo la HDP cámara se mueve más y más cada vez en ángulos más complicados en los que puedo ver menos que antes,

Nunca jugué Final Fantasy XI, que si es un verdadero MMORPG pero si se parece en algo al Final Fantasy XII entonces debe apestar también.

2010-06-22

Samsung Corby - Primeras Impresiones

Bueno, después de casi un mes de estar usando mi Samsung Corby ya puedo escribir un poco sobre como me ha parecido el dispositivo, sus defectos y virtudes.

Lo mejor

Sin lugar a dudas la Batería, la batería es excepcionalmente buena, tiene una duración increíble, aún usando el teléfono como reproductor de música portátil la batería tarda entre 4 y 7 días en reducir su carga al 50%, igual yo no recibo muchas llamadas pero el hecho de no tener que estar cargando el celular me parece estupendo. No sé como le hicieron los de Samsung pero crearon un aparato con un consumo de energía muy eficiente eso me parece super.

Las funciones del equipo


Comparado con mi anterior Sony Ericcon no tiene muchas más cosas, básicamente son las mismas funcionalidades, cámara de 2 mega píxeles, reproductor de música, radio FM, alarma, cronómetro, calculadora, juegos y aplicaciones Java y navegador web. Tiene adicionalmente un montón de accesos para las redes sociales, facebook, twetter, flicker, etc aunque la verdad yo no uso ninguna de ellas.

En cuanto al almacenamiento externo es mucho mejor que el Sony Ericcon por que las tarjetas Micro SD son la mitad de costosas que las tarjetas M2 que utiliza el Sony Ericcon así que de una vez me decidí por comprarle una Micro SD de 4 GB (Suficiente para llevar mi música favorita a todas partes)

El manos libres es más bien deficiente, yo no sé por que al presionar el botón del micrófono la llamada no se contesta, en varias ocasiones he tenido que sacar el teléfono del bolsillo por que la llamada no se activa con el manos libres.

Tiene un diccionario Inglés-Español, Español-Inglés de Collins muy bueno. Es una lástima que no se puedan instalar más idiomas.

La calidad de la señal es muy buena yo no he tenido problemas de interrupción de llamadas o de mala calidad del audio aún en el elevador de mi edificio aún no he probado el sótano pero tampoco nunca he visto que pierda llamadas por que el teléfono se ha quedado sin señal.

Lo malo

Lo malo de este equipo, bueno, algunas interfaces no están bien planeadas y eso hace que la experiencia de uso sea más bien frustrante, por ejemplo, si uno quiere eliminar una canción de la lista de reproducción tiene que colocarle una marca de verificación a esa canción y cuando la lista es muy larga esa simple tarea puede ser tediosa además que a veces uno no se da cuenta y otra canción por ahí quedó marcada y uno no se da cuenta y se eliminan las dos.

La pantalla táctil tiene un grabe problema al desplazar las interfaces en pantalla, por ejemplo para hacer scroll en los contactos, por que los contactos suben o bajan cuando uno pasa el dedo suavemente sobre la pantalla pero por ejemplo si uno tiene los dedos húmedos es muy difícil deslizar la lista, lo mismo pasa con el menú o los escritorios del Widget.

El teléfono vibra muy suavemente aún en el nivel de intensidad más alto por eso cuando el teléfono está en silencio uno puede pasar por alto llamadas por que simplemente nunca se da cuenta de que están entrando.

2010-06-13

Conectarse a un Servidor de Lineage II a través de un Túnel SSH (Cont.)

Bueno, ya habíamos visto en la entrada anterior sobre este tema como conectarse a un servidor de Lineage II a través de un túnel SSH burlando un Firewall. En esta entrada concluiré ese tema explicando como realizar la conexión cuando el servidor modifica el cliente en lugar de modificar el archivo de hosts.

En realidad esta entrada también explica una manera de redireccionar cualquier conexión que vaya a una determinada IP a una IP diferente usando un túnel SSH. Esta facultad es especialmente útil por ejemplo cuando queremos saltar Firewalls o cuando tenemos programas viejos que ya no tienen mantenimiento y tienen una IP quemada en el código que no podemos cambiar y necesitamos que se conecten a una IP diferente, entre otras posibilidades.

De que trata esta entrada

Esta entrada explica la manera de usar un túnel SSH para desviar conexiones que van a determinada IP de modo que vayan a una IP diferente de nuestra elección. Para explicar dicho tema haré uso de un ejemplo, una conexión a través de un Firewall usando un túnel SSH para conectarse a un servidor de Lineage II que modifica el cliente.

En este ejemplo en particular realizaremos una conexión al servidor Ludmila, un servidor que al momento de escribir esta entrada era un servidor low rate (7x) que corría con Lineage II - CT1 Hellbound

Para mas información sobre el tema que se está tratando en esta entrada por favor lean las entradas anteriores del blog sobre el mismo tema.

Antes de empezar

Antes de poder hacer uso de esta técnica se necesita alguna información, en particular necesitamos las direcciones IP y los puertos a los que el cliente necesita conectarse para poder realizar el redireccionamiento IP. Esta información la puedes conseguir muy seguramente en la página del servidor en el que juegas o tal vez preguntando en el foro de este mismo, no obstante, enseñaré aquí una ténica para obtener esta información por nuestra propia cuenta monitoreando las conexiones activas del PC.

Antes de intentar lo que describiré a continuación trata de minimizar lo más posible las conexiones que tu PC tiene con la red, cierra los programas que usan internet como Messenger, Skype, Outlook, etc. Lo ideal si puedes es que no haya ninguna conexión activa.

Seguidamente abre una consola y ejecuta:

netstat -n -p tcp

Verás en la consola algo como esto:

Bueno, ahora vuelve a escribir el comando en la consola pero NO presiones Entrar, esto es, la consola debe estar lista para ejecutar el comando. Luego abre el cliente de Lineage II y escribe tus datos de inicio de sesión, luego da clic en Login o presiona Entrar y rápidamente presiona ALT+TAB para cambiar a la consola y presiona Entrar para que se ejecute el comando que estaba preparado en la consola.

Inmediatamente verás aparecer la nueva conexión con su IP y puerto. Bien, ya tenemos la información del servidor de autenticación. Seguidamente selecciona el servidor en la lista de servidores y dale a Connect, cuando veas la lista de personajes ejecuta nuevamente el comando y verás aparecer la IP y el puerto del servidor del juego, algo como esto:

Ok, ya tenemos las IPs y puertos que necesitaremos para establecer la conexión, estos son:

  • 190.224.162.71:666
  • 190.224.162.71:7777
  • 190.224.162.74:2106

No importa si en tu caso el cliente se conecta a más o menos destinos lo importante es que anotes las IPs y los puertos que necesitarás redireccionar.

Preparar la tarjeta de red

Lo siguiente que haremos será preparar la tarjeta de red para desviar las conexiones que normalmente irían a través de la puerta de enlace de vuelta a nuestro equipo. Ya expliqué como hacerlo en la entrada anterior, aquí solo mostraré un screenshot de como se ve la página de configuración avanzada de IPv4:

Nótese que he agregado las dos direcciones IP del servidor del juego que hemos detecto (190.224.162.71 y 190.224.162.74) además de la IP de conexión de la red local (192.168.0.174) dejando la tarjeta de red con un total de tres direcciones IP.

Crear el Túnel SSH

Lo siguiente que haremos será crear el Túnel SSH. Para hacerlo volveré a utilizar el Putty ya que es lo más fácil. Los pasos base para establecer la conexión ya los he explicado en las entradas anteriores así que aquí solo mostraré un screenshot de como se ve la configuración de los túneles:

Listo, una vez configurados los túneles le damos al botón Open y establecemos la conexión con el equipo relevador. Una vez establecida la conexión Putty estará escuchando en los puertos 666, 7777 y 2106 listo para hacer el redireccionamiento IP al servidor real del juego.

Abrimos el juego y nos conectamos como si nada. Felicitaciones!

Algunos comentarios finales

Así concluye este pequeño tutorial sobre SSH Tunneling para saltar Firewalls. A pesar de que esto puede parecer un conjunto de tutoriales escritos con cierto desdén por las reglas y con la intención de permitirle a quien los lea violar políticas de una empresa o una institución educativa en realidad no es así.

Este material se escribió con el propósito de poner a disposición de otros un conocimiento que no está muy a la luz. Y a pesar de que lo que aquí se explica podría usarse con fines ilegales y maléficos también tiene muchas aplicaciones beneficiosas, puede sacar de un aprieto a un profesional de IT en algún caso.

También muestra las debilidades que algunos sistemas tienen y demuestra que cerrar puertos en un Firewall no es garantía de que se evitarán conexiones no deseadas.

Yo siempre estoy abierto a comentarios y los recibo con mucho gusto. Por favor si tienen comentarios, dudas, preguntas, o lo que sea no duden en dejar un comentario en la entrada o enviarme un correo electrónico.

2010-06-11

The Core (El Núcleo)

Bueno, esta película realmente es mi tipo de película, mucha acción y emoción y mucha tecnología (incluida tecnología informática, que es mi favorita) Plausible desde el punto de vista de la ciencia ficción, de hecho algunos científicos piensan que el campo magnético de la tierra está haciéndose mas débil y que con el tiempo lo perderemos por completo como le sucedió a marte, incluso se ha dicho que estamos cerca a una inversión del campo magnético.

Creo que hubo más muertes de las necesarias y muy estúpidas, en especial la primera de ellas, de este comandante, del que no recuerdo el nombre, se murió por estar de sapo ahí afuera, además, debieron haberse metido todos de nuevo en la nave cuando vieron que la lava empezaba a entrar a la geoda, la lava se habría encargado de destruir los cristales, incluyendo el que tenía atascada a la nave.

Me molestó un poco del final ese escape todo ficticio del profesor y la comandante, hubiera sido mejor que los dejaran morir una muerte honorable, como la de los astronautas de Impacto Profundo.

Me quedó la duda de la forma en la que refuerzan la última explosión, el tipo simplemente pone el núcleo del reactor al lado de la bomba y ya ¿eso si es posible? es decir, ¿colocar más plutonio al lado de una bomba atómica si incrementa el poder de la explosión aunque ese plutonio este protegido por capas de metal y además aislado del núcleo explosivo de la bomba nuclear?

Bueno, la película me entretuvo y además tenía buenas gráficas, solo creo que se pasaron un poco con la ficción.

2010-06-08

Conectarse a un Servidor Lineage II a través de un Túnel SSH

Bueno, antes que nada muchas gracias a Manuel Gulias por leer las entradas anteriores e interesarse en el asunto y también por tomarse el tiempo para escribirme y despertar de nuevo mi interés en este cuento del tunneling.

Como ya saben estos temas ya los había tratado en el blog en estas dos entradas:

Por eso mismo no voy a explicar aquí los detalles de configuración del servidor SSH y etc. solo me voy a concentrar en hablar de el tema que quedó pendiente que es la conexión al game server.

De que trata esta entrada

Esta entrada es un tutorial que pretende de la forma más gráfica posible ilustrar una manera de conectarse a un servidor de Lineage II y poder jugar cuando se está detrás de un Firewall que no permite la conexión directa a los puertos en los que funciona el juego haciendo uso de un túnel SSH.

Para poder hacer uso de esta técnica hay que tener un equipo relevador por fuera del firewall que esté configurado para servir el protocolo SSH por un puerto que sea accesible para el equipo que está dentro del firewall. Para mayor información sobre este tema leer la entrada: Saltar Firewalls usando OpenSSH

Un comentario más, esta técnica solo funciona con los servidores que no modifican el cliente sino que alteran el archivo de hosts para lograr la conexión. Es posible que funcione con un servidor que altere el cliente pero eso no está cubierto en esta guía

Preliminares

Bueno antes que nada, para usar la técnica que explicaré a continuación el equipo que está dentro del firewall debe tener una dirección IP estática, por lo que si el equipo está recibiendo una dirección por DHCP habrá que tomar nota de las direcciones que el DHCP entrega y luego fijar estos parámetros en la configuración, a continuación veremos como hacerlo:

Vamos por Inicio → Panel de Control.

Allí, bajo la categoría "Redes e Internet" damos clic en el vínculo "Ver el estado y las tareas de red"

y en la ventana que se abre en el panel de la izquierda seleccionamos "Administrar conexiones de Red"

Ahora veremos una ventana con las conexiones de red con las que cuenta nuestro equipo, vamos a dar clic con el botón secundario del ratón en la conexión que usamos y a seleccionar "Estado" en el menú que se despliega:

En la venta que se abre seleccionamos "Detalles"

Aquí deberemos tomar nota de los siguientes datos: IPv4 Dirección IP, IPv4 Mascara de subred, IPv4 Puerta de enlace predetermina, IPv4 Servidores DNS. Estos datos los necesitaremos más adelante así que los anotaremos por allí en algún lugar y luego cerramos todas las ventanas que abrimos.

Información del servidor

Bien, también vamos a necesitar del servidor al que nos vamos a conectar la siguiente información:

  • Dirección IP del servidor de autenticación
  • Dirección IP del servidor del juego
  • Puerto del servidor de autenticación (normalmente 2106)
  • Puerto del servidor del juego (normalmente 7778)

Esta información se puede sacar normalmente del archivo de hosts que la mayoría de servidores alteran. El archivo de hosts está en C:\windows\system32\drivers\etc

Para este ejemplo nos vamos a conectar al servidor L2TheGame, la información de dicho servidor es:

  • Servidor de autenticación: 78.46.17.80
  • Servidor del juego (Phoenix [500x]): 78.46.17.80
  • Puerto del servidor de autenticación: 2106
  • Puerto del servidor del juego: 7778

Tip:

Lo mejor para realizar esta ténica de tunneling es jugar el Lineage II abriendo directamente l2.exe (que está en la carpeta system) para así evitar pasar por el servidor del nProtect y el l2patcher. Es lo que yo recomiendo y es así como llevaré esta guía.

Modificación del archivo de hosts

Lo primero que haremos será modificar el archivo de hosts. El archivo de hosts está en C:\windows\system32\drivers\etc, como se trata de un archivo de sistema para poder modificarlo tendrás que ejecutar el bloc de notas con privilegios de administrador (Clic derecho → Ejecutar como administrador) y abrir el archivo.
En el archivo verás tres líneas parecidas a estas:

# The patch edited this three lines...
78.46.17.80 l2authd.lineage2.com
84.246.123.71 l2patcher.lineage2.com
216.107.250.194 nProtect.lineage2.com

Solo modificaremos la primera línea, agregaremos un # al inicio y luego agregaremos otra línea debajo de ella, el archivo debe verse entonces así:

# The patch edited this three lines...
# 78.46.17.80 l2authd.lineage2.com
127.0.0.1 l2authd.lineage2.com
84.246.123.71 l2patcher.lineage2.com
216.107.250.194 nProtect.lineage2.com

Ahora probaremos que la resolución de DNS para el servidor l2authd.lineage2.com haya sido cambiada al localhost (127.0.0.1), para ello abrimos una ventana de consola y ejecutamos:

ping l2authd.lineage2.com

A lo que el sistema debe responder:

Haciendo ping a l2authd.lineage2.com [127.0.0.1] con 32 bytes de datos:

Respuesta desde 127.0.0.1: bytes=32 tiempo<1m TTL=128
Respuesta desde 127.0.0.1: bytes=32 tiempo<1m TTL=128
Respuesta desde 127.0.0.1: bytes=32 tiempo<1m TTL=128
Respuesta desde 127.0.0.1: bytes=32 tiempo<1m TTL=128

Estadísticas de ping para 127.0.0.1:
    Paquetes: enviados = 4, recibidos = 4, perdidos = 0
    (0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
    Mínimo = 0ms, Máximo = 0ms, Media = 0ms

Configurar la tarjeta de red

Bueno, aquí es donde viene todo el secreto de esta entrada y en lo que se diferencia de las anteriores. Vamos a configurar una doble dirección IP en nuestra tarjeta de red, para ello vamos de nuevo a Inicio → Panel de Control

Nuevamente seleccionamos "Ver el estado y las tareas de red" bajo la categoría "Redes e internet"

y nuevamente en el vínculo "Administrar conexiones de red"

nuevamente clic con el botón secundario del ratón sobre la conexión y esta vez seleccionamos "Propiedades" en el menú que se despliega:

Buscamos y seleccioamos en la lista el "Protoclo de Internet versión 4 (TCP/IPv4)" y damos clic en el botón "Propiedades"

Seleccionamos "Usar la siguiente dirección IP" y damos clic en el botón "Opciones avanzadas..."

Arriba donde dice "Direcciones IP" damos clic en "Agregar"

Primero agregaremos la dirección IP normal del equipo (la que anotamos en la sección "Preliminares" más arriba), también introduciremos la máscara de subred y damos clic en Aceptar. Luego volvemos a dar clic en el botón "Agregar" y agregamos otra IP. En este caso agregaremos la dirección IP del servidor del juego, en el caso del ejemplo 78.46.17.80 y para acompañarla la máscara de subred 255.255.255.0

Ok, ahora en donde dice "Puertas de enlace predeterminadas" damos clic en el botón agregar y agregamos la puerta de enlace predeterminada de nuestra conexión (que anotamos en la sección "Preliminares") dejamos que windows se encargue de la métrica por lo que dejamos la casilla seleccionada

Ahora damos clic en la pestaña DNS

luego, donde dice "Direcciones de servidor DNS por orden de uso" damos clic en "Agregar" y agregamos los servidores DNS de nuestra conexión:

Damos clic en "Aceptar" en todas las ventanas abiertas hasta que lleguemos nuevamente a la ventana donde aparecen las conexiones de red. Antes de continuar debemos probar que aún podamos acceder a Internet, para hacerlo abrimos el navegador y buscamos cualquier página de Internet, si podemos verla, estamos listos para seguir adelante.

También sería bueno verificar que la tarjeta de Red quedó con ambas direcciones IP. Para ello abrimos una consola y ejecutamos:

ipconfig

Y verificamos que la conexión tenga ambas direcciones IP:

Adaptador LAN inalámbrico Conexión de red inalámbrica:

   Sufijo DNS específico para la conexión. . :
   Vínculo: dirección IPv6 local. . . : fe80::389d:74c8:67ee:f52c%11
   Dirección IPv4. . . . . . . . . . . . . . : 78.46.17.80
   Máscara de subred . . . . . . . . . . . . : 255.255.255.0
   Dirección IPv4. . . . . . . . . . . . . . : 192.168.0.174
   Máscara de subred . . . . . . . . . . . . : 255.255.255.0
   Puerta de enlace predeterminada . . . . . : 192.168.0.1

Crear el túnel

Bueno, ahora llegó el momento de crear el túnel SSH que nos hará saltar el firewall. Para este ejemplo utilizaremos el Putty por que tiene interfaz gráfica pero igual serviría el SSH normal por consola.

Abrimos el Putty:

Donde dice "Host Name (or IP Address)" escribimos la dirección IP del equipo relevador (el equipo que está por fuera del firewall). Si el equipo relevador está sirviendo por un puerto diferente al 22 (por ejemplo el 80 como lo discutimos en las entradas anteriores) habrá que especificar ese puerto en la casilla de al lado.

Luego en el árbol de la izquierda vamos a Connection → SSH → Tunnels

Primro nos aseguramos que la casilla de verificación "Local ports accepts connections from other hosts" esté marcada y luego debajo de donde dice Add new forwarded port vamos a escribir los siguientes datos:

Source port: 2106
Destination: 78.46.17.80:2106

Nos fijamos que "Local" y "Auto" estén seleccionados y damos clic en "Add"
En este paso acabamos hacer el túnel para el servidor de autenticación, por lo que deberás remplazar 78.46.17.80 por la dirección IP del servidor de autenticación del server donde juegas.

Seguidamente agregaremos el forwarding para el servidor del juego:

Source port: 7778
Destination: 78.46.17.80:7778

Nos fijamos que "Local" y "Auto" estén seleccionados y damos clic en "Add"

Al terminar la ventana del Putty debe verse más o menos así.

Aclaración:

En el caso del servidor Phoenix de L2 TheGame tanto el servidor de autenticación como el servidor del juego están en la misma máquina (tienen la misma IP), sin embargo para muchos servidores de Lineage II esto no es así. Fíjate que hayas hecho el forwarding a las direcciones correctas o la conexión fallará.

Bueno, ahora te recomiendo que guardes la sesión del Putty para usarla cada vez que quieras jugar y también por si algo fallara para que puedas corregir los errores sin tener que volver a escribirlo todo. En el árbol de la izquierda selecciona el primer Item (Session) y donde dice "Saved sessions" escribe un nombre para la sesión, por ejemplo "L2" y luego haz clic en "Save".
La siguiente vez que abras el Putty podrás hacer clic en la entrada de la lista y luego en "Load" y Putty cargará nuevamente todos los parámetros (incluidos los túneles).

Conectar y probar

Ok. Al parecer ya todo está listo para conectar y divertirse. Haz clic en el botón "Open" del Putty para establecer la conexión, logea con un nombre de usuario y una constraseña válidas.

Antes de iniciar Lineage fíjate que Putty esté preparado para hacer el Port Forwarding. Para ello abre una consola y ejecuta:

ipconfig -n -a -p tcp

Deben aparecer dos puertos abiertos en escucha, el 2106 y el 7778:

  TCP  0.0.0.0:2106    0.0.0.0:0    LISTENING
  TCP  0.0.0.0:7778    0.0.0.0:0    LISTENING

Si todo va bien hasta aquí solo restará abrir el cliente de Lineage II y conectarse y ya debes poder jugar normal. Felicidades!

Detalles técnicos

Ahora explicaré un poco por que funciona lo anterior. Como habran notado usamos la característica que tiene Windows de permitir más de una dirección IP en la misma tarjeta de red (aunque también se podría haber hecho con dos NICs si esa característica no estuviera disponible).

Lo que hicimos fue colocar la dirección IP del servidor del juego en la tarjeta de red con una máscara de subred de 255.255.255.0 y es allí donde radica el secreto de este asunto

Cuando una sistema va a establecer una conexión con otro sistema lo primero que hace es hacer un AND binario entre su propia dirección IP y su máscara de subred, en nuestro caso:

078.046.017.80
255.255.255.0
---------------
78.46.17.0

Luego toma la dirección la que se va a conectar y hace un AND binario con su máscara de subred, en nuestro caso:

078.046.017.80
255.255.255.0
---------------
78.46.17.0

Si las dos direcciones resultantes de las operaciones anteriores son diferentes el sistema sabe que debe tratar de enviar la solicitud de conexión a través de la puerta de enlace por que la dirección de destino está en otra red, más, si son iguales (lo que sucede en este ejemplo) el sistema sabe que la dirección de destino está dentro de su propia red así que no trata de enviar la solicitud a través de la puerta de enlace sino a través de la red local.

Como establecimos que nuestra dirección IP es 78.46.17.80 cuando la solicitud es enviada a través de la red local quien la recibe es nuevamente nuestra propia tarjeta de red.

Así pues, lo que hemos hecho aquí es engañar de cierta forma al sistema para que envíe una petición que normalmente enviaría a través de la puerta de enlace de vuelta a nuestro sistema y hemos hecho que Putty escuche conexiones entrantes en el puerto 7778 (como si hubiera un servidor de Lineage II corriendo en la máquina local)

Lo que sucede en resumen es:

  1. Abrimos el cliente de Lineage y escribimos nuestros datos de acceso
  2. Lineage resuelve la dirección l2authd.lineage2.com, como hemos agregado una entrada al archivo de hosts que dice que esa dirección es la 127.0.0.1 Lineage II envía una petición de acceso al localhost en el puerto 2106
  3. Putty está escuchando en el puerto 2106 cuando llegá la petición Putty la reenvía con ayuda del equipo relevador al servidor real de autenticación de Lineage II (el cliente no nota la diferencia)
  4. La autenticación sucede y Lineage II muestra la lista de servidores que el servidor de autenticación envió de vuelta.
  5. Seleccionamos un servidor para conectarnos
  6. En este caso Lineage II no trata de resolver ninguna dirección sino de establecer una conexión directa con el servidor. Pone una petición en la red que va a la dirección IP del servidor del juego (en el caso del ejemplo 78.46.17.80)
  7. Windows hace la operación binaria que mencionamos anteriormente y concluye que esa dirección está dentro de la red local. Pone la petición y esta regresa de vuelta a la tarjeta de red.
  8. Putty está escuchando en el puerto 7778 de modo que recibe la petición y la reenvía con ayuda del equipo relevador al servidor del juego real. Se establece la conexión y Lineage II muestra los personajes que hay en nuestra cuenta.

Mientras que juguemos Putty, y el servidor SSH que corre en el equipo relevador mantendrán establecida la conexión permanentemente. El cliente de Lineage II no notará la diferencia y el Firewall pensará que la conexión va a un puerto admitido.

Ten en cuenta que puede haber lag extra:

Recuerda que las conexiones SSH van encriptadas, por lo que tu equipo debe encriptar los datos antes de enviarlos al equipo relavador y luego este a su vez debe desencriptarlos para enviarlos al servidor del juego, adicionalmente estás agregando un nodo más a la conexión. Todo lo anterior puede causar lag extra por lo que la experiencia nunca será igual a la que tendrías con una conexión directa.