Oct
29Super Nintendo Portable
Filed Under (Vida) by admin on 29-10-2008
Tagged Under : Juegos, Nintendo Portable, SNES, Super Nintendo
Esto alegró mi dÃa y me recordó viejos tiempos (por lo del Super Nintendo) =)
Oct
29Esto alegró mi dÃa y me recordó viejos tiempos (por lo del Super Nintendo) =)
Oct
26Recientemente me tocó configurar un servidor para tener máquinas virtuales mediante XEN. Anteriormente sólo habÃa trabajado con un poco con VMWare ESXi y XenServer (la versión “comercial” de XEN), el problema es que se tenÃa que instalar en un servidor remoto que solo se tiene acceso mediante ssh.
Con algo de trabajo y pruebas (y con las buenas herramientas de ServerBeach, que sólo le faltan una vista a la consola para diagnosticar kernel panics) por fin pude instalarlo.
Debian tiene una versión de Xen, pero es la 3.0.3 que para mi gusto es demasiado vieja (se liberó en 2006) y la versión Lenny (testing) tiene la versión 3.2, pero también algo “inestable” a mi gusto para un servidor de batalla.
Como dije después de hacer varias pruebas logré instalar la versión Xen 3.3 utilizando el kernel que viene en Debian preparado para Xen.
Una breve descripción de Xen, es que está separado en varias partes, en primer lugar Xen tiene un kernel modificado para llevar a cabo la virtualización, la ventaja es que la versión 3.3 utiliza la versión 2.6.18 que es la que viene con Debian.
Después la parte “fuerte” de Xen es el denominado hypervisor que es un servidor que se encarga de hacer la virtualización propiamente dicha. Después vienen las máquinas virtuales que utilizan por lo general otro kernel que se denomina domU (y el kernel de la máquina base se denomina dom0).
Pues bien, para lograr esto simplemente primero instalé la imagen del kernel apropiado y compilar solamente el hypervisor de Xen 3.3
En pasos simples:
#Instalar la imagen del kernel con parche para xen apt-get install linux-image-2.6.18-6-xen-amd64 #Descargar el código fuente de xen wget http://bits.xensource.com/oss-xen/release/3.3.0/xen-3.3.0.tar.gz tar zxvf xen-3.3.0.tar.gz cd xen-3.3.0 #Compilar solamente el hypervisor make xen make install-xen #Compilar los archivos ejecutables como xm y herramientas de red make tools make install-tools #Hacer que Debian cree las entradas correspondientes en los rc.X #para que cuando el servidor se inicie ejecute los servidores de Xen update-rc.d xend defaults 20 21 update-rc.d xendomains defaults 21 20 #Hacer que grub reconozca el nuevo kernel con la configuración de Xen 3.3.0 update-grub
Con eso deberÃan de ver una entrada en el grub como:
title          Xen 3.3.0 / Debian GNU/Linux, kernel 2.6.18-6-xen-amd64 root           (hd0,0) kernel         /xen-3.3.0.gz module         /vmlinuz-2.6.18-6-xen-amd64 root=/dev/sda6 ro console=tty0 module         /initrd.img-2.6.18-6-xen-amd64 savedefault
Que deberÃa de bootear con el hypervisor 3.3
Incluyo algunas ligas de sitios (en inglés) que me ayudaron muchÃsimo para entender algo más de Xen
Oct
21Desde que se dio a conocer un video (de un programa japonés para variar) donde una ardilla o perro de la pradera hace una “cara dramática” han salido decenas de videos sobre este personaje, algunos ejemplos:
Todo viene de este video
Â
Oct
10Debido a que de la tarjeta American Express me mandaron un CD de Putumayo por mi primer “aniversario” con la tarjeta me puse a buscar música de Putumayo, tiene excelentes compilaciones el de Cuba es genial.
La que me ha gustado más es Al Vaiven de mi carreta, una excelente canción sobre el trabajo >=)
Después pondré una canción de su compilación “Music from the Tea Lands” (Música de las Tierras de Té)  que tiene también un muy buen sonido, muy tranquilo
Â
Oct
08Hace poco Zend publicó la certificación de Zend Framework:
http://www.zend.com/en/services/certification/framework/
Estoy algo divergente entre si es una buena opción o no
Buena opción:
Â
Mala opción
Â
Oct
07Algo muy risible en un tele-juego: “entraron dos llamadas a la vez y si no se calla la otra no puede uno hablar”, porque habia un retraso entre cuando habla por telefono a cuando se escucha en la televisión.
Esto me lo mandó Nexus
Oct
05El viernes un cliente me pidió un favor de ayudarle a terminar de instalar un script de un amigo en su servidor.Â
Todo parecÃa ser un simple problema con la importación de MySQL por los acentos, aunque eso solucionó parcialmente aún tenÃa un error en la parte medular del sistema, en cuanto abri el archivo que estaba dando el error me arrepentà de hacerlo y mi mente se volcó a recordar hace cinco años o tal vez seis cuando se programaba de esa manera =)
Con ese ejemplo me vino a la mente una frase célebre de mi buen amigo Nexus en esas épocas cuando estaba aprendiendo a programar en PHP, mi geek interno terco siguió programando con las antiquÃsimas $HTTP_POST_VARS a pesar de que se habÃan desalentado utilizar esas variables y se reemplazó por las variables tipo: $_POST ó $_GET
Recuerdo que cuando Nexus vio un código mio que tenÃa el $HTTP_POST_VARS me dijo en un chat con (me parece Carlos Cortez): “Programas a la manera viejita jajajaja”. Claro por orgullo después de eso nunca volvà a tocar $HTTP_POST_VARS
Aqui tengo unos consejos para que no solamente sea fácil programar, depurar y para otros leer tu código. También para evitar que PHP siga siendo visto como un lenguaje de “bajo presupuesto” (por aquello que muchos prefieren Java por lo ‘empresarial’)
Â
Tip: PHP dejó de ser un lenguaje de Script hace años
Lo digo en completo tono sarcástico, si bien PHP no se puede compilar no hay razón para meter todo dentro de un solo archivo como print’s con funciones, prácticamente se debe separar de preferencia en un modelo MVC si no puedes hacerlo, entonces al menos hazlo en VE (Vista-Espaguetti donde vas a meter tanto modelo como controlador)
Â
Tip: register_globals está muerto
Por eso me dio miedo abrir el archivo, necesitaba register_globals. Para el que no sepa que es register_globals es simplemente que cuando mandamos parámetros a un script como por ejemplo: prueba.php?variable1=hola&variable2=mundo PHP convierte automáticamente esas dos variables en $variable1 y $variable2 con su respectivo contenido.
Qué fácil, ¿No?. Pues en realidad no, cuando el mundo no se percataba del error fatal de hacer esto, parecÃa que PHP era tan fácil de programar, vaya no necesitabas ni siquiera  vincular los parámetros.
Poco después un balde de agua fria cayó sobre todos nosotros… el problema es que cualquier tipo con algo de sesos puede simplemente pasar variables y asignar valores de la aplicación. En el caso de una aplicación que no inicializara las variables (el 99% para ser sinceros) podÃa sufrir porque era fácilmente “hackeada” sin necesidad de hacer mucho.
Por eso rápidamente se eliminó register_globals y se dejó como un parámetro opcional, pero muy opcional. Tanto que en PHP 6 va a desaparecer definitivamente.Â
register_globals no ayuda, no hace más rápido el desarrollo; simplemente destruye todo lo bueno que podrÃa tener una aplicación, porque en primer lugar es difÃcil saber cuales variables son parámetros del usuario y cuales son variables internas. También hace fácil explotar un sistema (creo que ya lo habÃa dicho
).
La solución para esto… reescribe tu aplicación.
Â
Tip: die() está muerto
¿Alguien se ha preguntado porqué existe esta construcción del lenguaje de PHP?, supongo que es un legado de los viejos dÃas cuando PHP era un lenguaje de script.
die() permite simplemente eso: hace que el script muera. Muchos lo hacÃan para verificar una situación intolerable como al abrir una conexión a una base de datos y que no se pudiera conectar; como no se pueden mostrar datos entonces simplemente le decimos al usuario: “perdon pero aqui nos detenemos” un ejemplo es el siguiente:
<?php
mysql_connect($host, $usuario, $password) or die('No pude conectarme a la base de datos');
?>
¿Cuál es el problema?, muy simple la función die funciona tan perfectamente que el script se muere ahi. Por lo que el usuario simplemente verá una pantalla blanca con un texto crÃptico. En el peor de los casos mostrará una parte de la página y la “cortará” donde se haya ejecutado esta instrucción.
No seas perezoso, utiliza construcciones de if() para separar bloques de instrucciones en vez de suicidarte.
Si aún asà quieres hacer un die() o un exit() al menos manda a llamar a una plantilla especial que muestre el error con la mayor parte del mismo estilo de la página que vas a mostrar, te lo agradecerá el usuario.
Â
Â
Tip: include y require es un arma de dos filos
También un legado de aquellos dÃas es que un script luzca como:
<?php include 'cabecera.php'; ?> <?php print "Hola mundo 'plantilla'; ?> <?php include 'pie_pagina.php'; ?>
En aquellos dÃas estas eran nuestras plantillas, cabecera.php mostraba el código inicial de HTML y pie_pagina.php cerraba ese código HTML, qué facil, ¿verdad?
Pues no, el problema de este método es que en primer lugar las variables son globales y compartidas, por lo que si haces el código espaguetti anterior es un total NO.
Por ejemplo es fácil sobreescribir variables dentro de un archivo “plantilla” y el error se propaga a las otras “plantillas”.
Otro problema es que hacen difÃcil seguir un flujo real de plantillas (si no quieres una parte tienes que reescribir todo en lugar de simplemente cambiar por ejemplo la distribución de los objetos en una plantilla general. También es fácil de romper todo el HTML por una etiqueta fuera de lugar
Una vez más, no seas perezoso y utiliza un manejador de plantillas como Smarty
Ahora bien del lado de programación un include() por lo regular es utilizado para incluir pedazos de código tales como funciones, clases, etc. Pero lamentablemente también es utilizado para incluir pedazos de código que tienen el mismo uso que funciones!!
Eso es algo totalmente prohibido, no se porque no utilizas funciones o mejor aún una clase.
Â
Tip: mysql_connect y sus vicios
Un legado también de aquellos dÃas es que se programaba de la siguiente manera:
<?php
include 'configuracion_db.php';
mysql_connect($host, $usuario, $password) or die('No pude conectarme a la base de datos');
?>
donde configuracion_db.php era simplemente:
<?php $host = 'localhost'; $usuario = 'mi_usuario'; $password = 'mi_password'; ?>Â
El primero se incluia prácticamente como cabecera para todas las páginas porque necesitaban acceso a la base de datos, y también se incluia dentro de otros bloques dentro de la misma página.
O peor aún, incluir en cada archivo los parámetros de configuración. Esto último es simplemente un caos y es no saber programar, asà que toma un curso de programacion básica en otro lenguaje antes de programar en PHP
Para el primer caso si bien es válido, es simplemente malo debido a que otro script puede fácilmente sobreescribir esas variables (o el mismo script por error). Aunque es utilizado, es muchÃsimo mejor utilizar un patron de diseño llamado: Singleton
El Singleton es un patron de diseño muy simple, en términos de orientación a objetos es un método estático de una clase que regresa siempre la misma instancia de la clase. Es decir solamente existirá un objeto en todo el sistema y que lo creará ese método estático normalmente llamado: obtenerInstancia()
En lenguaje de funciones es simplemente una función que regresará la misma variable (tendrá la misma dirección de memoria) cada vez que se llame, asà que en lugar de hacer el primer ejemplo utiliza este:
<?php
function obtenerConectorMysql() {
   static $conector_mysql = null;Â
   if ($conector_mysql == null) {
     //aqui insertar las instrucciones para obtener el host, usuario y password,Â
     // por ejemplo de un archivo o simplemente escribirlas aqui
     $conector _mysql = mysql_connect($host, $usuario, $password);
   }Â
   return $conector_mysql;
}
Â
Esto simplemente crea la primera vez que se llame el conector_mysql, después simplemente lo regresa por lo que no se crean diferentes instancias, es la misma conexión a MySQL
Si lo quieres hacer mediante clases, puedes utilizarlo algo similar como una llamada a una función estática o “envolverlo” en la clase que tengas para manejar la base de datos.
Tip: La seguridad no es para sitios de comercio o bancos solamente
Mucha gente piensa que debe hacer “seguro” un sitio solamente si va a tener operaciones monetarias. Nada más fuera de la realidad.Â
Todos los sitios necesitan seguridad para evitar que los ataques logren su resultado: hacer “explotar” la aplicación.
Evitando los errores más comunes tendrás una aplicación que si bien no es tan segura como la de la CIA (lease con sarcasmo) evitará el 90% de los ataques comunes.
include() o acceso al archivo (como fopen() )cookie, utiliza sesiones. Si lees datos de una cookie nunca asumas que por ser cookie es dificil de alterarmysql_escape_string(), si utilizas un framework la mayorÃa de ellos tienen una función para hacer esto (que terminan llamando a algo similar a la primera función)Â
Tip: PHP5 no es una opción, es obligatorio >=)
No veas a PHP5 como una “extensión” o una versión más. El propósito de PHP5 es hacer una transición entre el mundo de scripts de código espaguetti a un sistema de clases muy bien separadas.
Aunque PHP5 aún permite programar sin clases y con solo funciones; si tienes la oportunidad no dudes en utilizar PHP5 con clases con todo lo nuevo que trae. La guia de estudio de Certificación Zend es un buen inicio.Â
PHP5 tiene un gran potencial y está esperando para ser plenamente utilizado, algunos frameworks ya están utilizando plenamente su potencial, entre ellos Zend Framework que es altamente recomendable.
Â
Último tip: MVC es lo único para web
Si vas a desarrollar una aplicación en PHP que contenga todo lo que una aplicación web contiene (contenido en HTML, bases de datos, procesamiento, etc) simplemente utiliza un framework que tenga un diseño de MVC; los más conocidos son Zend Framework (mi recomendación nuevamente) y CakePHP, también están otros en rápido ascenso como Simfony y Code Igniter
También son de uso popular los CMS como drupal y joomla/mambo, aunque ellos no proveen directamente el modelo MVC si proveen el modelo Vista-Espaguetti por lo que con un poco de trabajo extra puedes lograr algo similar a MVC
Â
En resumen PHP es un lenguaje muy poderoso y con historia; por lo que es fácilmente quedarse con las primeras formas de programar, pero con todos los nuevos desarrollos ahora si se puede empezar a hablar de un PHP a nivel empresarial (ya formalmente
)
Â
Oct
02Una excelente cancion de Blues, a ver si al pollo se le quita el gusto por ese insipido Jazz >=)
Oct
02Aqui les dejo un comando cuya finalidad es actualizar la hora y fecha actual utilizando un servidor de tiempo (ptocolo NTP):
/usr/sbin/ntpdate time.nist.gov
obviamente necesitan privilegios de administrador para ejecutarlo y necesitan que su configuración de linux esté en la zona horaria correspondiente