Problemas con la ATI Radeon y UbuntuHace unos meses que por fin pude instalar Ubuntu en mi Samsung R40plus a pesar de los problemas que inicialmente daba la ATI Radeon 1250. Seguidamente vinieron los cuelgues constastes, sobre todo cuando reproducía videos, así que buscando por foros he encontrado gente que lo ha solucionado desintalando la aceleración 3D de la ATI.
Lo he hecho y la cosa parece funcionar mejor, se me cuelga menos.
Desinstalar este componente es tan fácil como entrar en Sistema>Administración>Gestor de controladores restringidos. Ahí desmarcamos el "controlador para tarjetas gráficas ATI".
Al hacerlo reiniciamos el ordenador en modo recovery y cuando nos devuelva a la consola ejecutamos los siguientes comandos:
sudo -s
killall gdm
apt-get install xorg-driver-fglrx
depmod -a
aticonfig --initial
gdm start
Nos devolverá al entorno gráfico y apagaremos el ordenador. Con esto ya tendremos la ATI configurada sin aceleración 3D. La verdad es que se nota la diferencia de rendimiento, pero es mucho mejor esto a que se cuelgue cada dos por tres.
Ya se sabe, cuando solo hay drivers privativos es dificil sacar el máximo rendimiento y a veces incluso que termine de funcionar. Valga este post como recordatorio para futuros desastres en mi portatil.
27-06-2008 | Linux Mi nueva batería de Doramus está lista!Hoy mientras veía un video antiguo en el que tocaba la batería de mi último juego, DORAMUS, me han entrado ganas y me he puesto a terminar la nueva batería que me estaba armando.
El video antiguo:
Esta tarde, tras terminar la batería lo he celebrado con un tema sencillo:
Una vista rápida a Doramus:
22-06-2008 | bgMSX El avión de papelCuando lanzamos un proyecto en Internet lo que esperamos es una reacción en cadena. Puedes lanzarlo y llegar a adquirir tanta fuerza que se replique y sea visto en todo el mundo o puede fracasar de modo que solo lo lleguen a ver cuatro amigos y tres primos, algo más habitual de lo que parece.
Puedes lanzarlo de muchas maneras, todo depende de a quién vaya dirigido y los recursos de que dispongas. Hay mucho escrito pero en su mayoría orientado a empresas con un mínimo de recursos. Eso está muy bien, si los tienes, pero muchos solo contamos con un ordenador y unas pocas horas al día para esta tarea y tenemos que idear nuevas formulas para lanzar un proyecto sin morir en el intento.
Cuando el presupuesto es de 0 euros como en mi caso las vías para lanzar un proyecto se reducen a: subirlo a Internet y comunicarlo a varios medios y amigos. No hay dinero para banners, anuncios patrocinados ni por supuesto para tener presencia en medios tradicionales, pero es una fórmula más de todas las que hay, así que ahí la dejo para quien quiera aprovecharla o mejorarla.
15-06-2008 | Dieyes La bgMSX ha resucitadoEl otro día por fin pude recuperar la bgMSX de un coma profundo que duraba ya varios meses. Problemas de tiempo, trabajo y dolores de cabeza con el servidor como ya he explicado en la bg fueron los motivos de su desconexión de la red. Pero ahora poco a poco todo vuelve a la normalidad.
08-06-2008 | bgMSX Cover de Nude de RadioheadNo me gustan los post que tienen un video de YouTube y no aportan nada más, pero a pesar de eso lo voy a hacer. Las obras de arte lo merecen. Vía: Alt 1040 Big Ideas (Don´t get any) from 1030 on Vimeo 08-06-2008 | Vida Social Feedky, mi nueva frikadaHasta ahora cuando tocaba la hora de comer en la oficina con Mazius-Ma siempre uno de los dos (normalmente él) iba cargando vídeos de Youtube para amenizar el rato. Con las manos pringosas y la falta de ideas pulsábamos en el primer vídeo que aparecía de los simpsons o padre de familia y nos poníamos a comer sin prestar mucha atención, total, ese vídeo lo habíamos visto el día anterior y el otro, pero nos daba pereza buscar otra cosa mientras se nos enfriaba la comida.
31-05-2008 | PHP El Tenis no es lo mioLa semana pasada jugué por segunda vez en mi vida a Tenis (y tengo 31 años) aunque se puede decir que fue la primera vez.
24-05-2008 | Vida Social Escupe Japonés - Yakuza Nihongo!
[Descargar | ダウンロード | Download] MUCHO MÁS (y mejor) EN Escucha Japonés 13-05-2008 | Vida Social TechTalk 2008Estamos en un coche, aparcados en una calle en obras, sin vistas y rodeados de un puñado de niños indios identificados por un número. A mi derecha, en el asiento del acompañante, hay un Alejandro cubierto por una chaqueta para impedir la entrada de luz en su microclima, compuesto por sus manos, sus ojos y su portátil. Cubrirse con una chaqueta es bueno para permitirse -con el brillo al mínimo- poder usar el portátil tirando de batería con una autonomía de más de dos horas. Pero el coche además de todos estos elementos está rodeado de la señal Wi-Fi que nos llega de una tienda de informática a unos pocos pasos de aquí. Curiosamente esta situación mola, pero solo puede darse cuando dos frikis como nosotros se reúnen en la isla de Martín Varsavsky. -¡Ah amigo! ¡así que habéis ido a la Techtalk! -Pues sí, en calidad de emprendedores de segunda asistimos ayer a unas charlas muy interesantes, donde gente importante (y feliz) nos inspiraron a todos con sus palabras. La experiencia ha sido muy buena, pero no tanto como la de muchos otros allí presentes que conocían a todo el mundo y podían hablar de esto y lo otro con más soltura, o de aquellos que pudieron estar más tiempo y participar más de la presencia de Martín y compañía, pero en cualquier caso, suficiente como para volver a Mallorca con más ganas e ilusión por continuar nuestro trabajo y con idea de repetir. No sé si fueron más interesante las charlas de las distintas personas al micrófono o las que mantuvimos nosotros mismos con otras personas que conocimos allí mismo. Lo más sorprendente es que -al más puro estilos de las RUs de BCN- las ganas de comunicar de todos los presentes y el buen ambiente hacía que te olvidaras de protocolos y pasaras a hablar abiertamente de cualquier tema o proyecto. Finalmente nos quedamos con las ganas de despedirnos de Martín y porqué no, de hacernos una foto con él, pero se marchó antes de que pudiéramos darnos cuenta. Habrá que esperar a una próxima ocasión para poder decorar la cabecera de mi cama. Ah, y Alex se encargó de promocionar a chooii.com entre los presentes, así que vamos a ver si lo notamos reflejado a modo de entradas fuera del territorio balear. ![]() 11-05-2008 | Blog Construye un sistema de cache web en tu servidor usando PHPCon la finalidad de reducir la carga de los servidores y agilizar al mismo tiempo la descarga de nuestras Webs vengo pensando en la idea de implementar algún tipo de caché Web, con la flexibilidad suficiente como para aplicarlo a determinados archivos, y cuya implementación no me obligue a rehacer nuestro CMS. Finalmente he encontrado una manera muy sencilla y flexible a la vez, por medio del uso del buffer de salida de PHP y el almacenamiento de archivos en HTML identificados por nombres codificados en MD5. En realidad es tan sencilla que voy a explicar el funcionamiento básico para aquellas personas que como yo (hace unas horas) piensen que todo esto se soluciona solo con hard o herramientas altamente sofisticadas y caras. Antes de empezar he de decir que desconozco la técnica usada por otros sistemas de caché web, pero la solución que propongo me parece una buena opción para empezar, así que ahí voy. Si álguien conoce un método mejor y que proporcione la misma flexibilidad estaré encantado de conocerlo. 1. El escenario Imaginemos un servidor en el que alojamos Webs dinámicas en PHP, y cuyo contenido se genera al vuelo para cada usuario que las solicita por medio de distintas consultas a una base de datos. Si el número de usuarios conectados es relativamente bajo el servidor tendrá una carga suficiente como para afrontar las peticiones y las ejecutará en un intervalo de tiempo corto, casi igual que si sirviera páginas en HTML. El problema vendría cuando el número de usuarios conectados creciera y aumentaran las peticiones al servidor, lo que terminaría disparando el número de consultas a la base de datos, cálculos y demás y se crearía una carga en el servidor que comprometería su rendimiento. Y poco más o menos es lo que termina ocurriendo tarde o temprano. 2. Caché Web Lo que buscamos es un sistema que permita almacenar en un archivo HTML el resultado final de realizar dichas consultas a la base de datos, y los cálculos de los distintos scripts en PHP que se realizan cuando servimos una Web, de modo que al próximo usuario que solicite la misma página podamos entregarle ese archivo HTML sin necesidad de volver a realizar los cálculos de nuevo, con el consiguiente ahorro de carga en el servidor y el incremento de velocidad de respuesta hacia nuestro usuario. Este sistema es lo que se conoce como caché Web. 3. Modo de operación Cuando un usuario solicite una página del servidor Web comprobaremos si tenemos almacenada esta en un archivo HTML dentro de una carpeta que llamaremos "cache". Si es así le enviaremos el contenido de este archivo sin más, y nuestro trabajo habrá terminado. De lo contrario, si la página solicitada no existe como archivo HTML dentro de la carpeta "cache", ejecutaremos todo el código necesario para generarla, como veníamos haciendo hasta hoy, se la serviremos y nos la guardaremos en formato HTML dentro del directorio "cache", para que si álguien más nos pide por la misma página ya no sea necesario volver a generarla. 4. Caducidad de la caché Un archivo que guardemos en la caché nos valdrá para dárselo a los siguiente usuarios, pero ¿durante cuanto tiempo?. En algún momento actualizaremos nuestra Web, y la caché debería también actualizarse. Para esta tarea hay dos opciones claras: La primera sería eliminar los archivos de la caché que van quedado obsoletos a medida que vamos actualizando la Web, manualmente (no recomendado) o por medio de algún script. La segunda podría ser eliminando todos aquellos archivos de la caché que lleven más de cierto tiempo (horas, días...). En ambos casos al eliminar los archivos obligaremos al servidor a generarlos de nuevo cuando un usuario vuelva a solicitar los contenidos de la Web. La segunda opción puede ser la más sencilla de implementar por medio de una tarea en el cron o un script que corra en segundo plano, pero nunca optimizaremos el rendimiento al máximo, ya que si el tiempo de vida de la caché lo establecemos bajo (minutos u horas) podemos estar eliminando la caché antes de que realmente hayamos realizado cambios, por lo que estaríamos desaprovechando recursos del servidor. Si por el contrario establecemos un tiempo de vida alto (varias horas y días) podríamos estar sirviendo información desactualizada a los usuarios durante mucho tiempo. Está claro que lo más eficiente es refrescar la caché justo en el momento en que realizamos un cambio en alguna de las páginas, y por supuesto solo la parte relacionada con ese cambio, no toda la caché. ¿Cómo hacer esto? En mi caso aun lo estoy pensando, pero se me presenta fácil ya que las modificaciones en nuestras Webs se hacen por medio de un CMS, y siempre podemos reprogramarlo para que elimine los archivos de la caché que están relacionados con la parte de la Web actualizamos. Si esto no fuera así seguramente optaría por crear distintos scripts a los que acudiría tras cada actualización para indicarles qué apartados han cambiado y que en base a eso borrara los archivos correspondientes de la caché. En cualquier caso lo más importante es saber que hemos de refrescar la caché ¡o nuestra web no envejecerá nunca! 5. Manos a la obra: PRIMERA PARTE Supongamos el siguiente script en PHP que bien podría corresponder a la sección de una web convencional: <?php echo "Bienvenido a mi Web.\n"; // Cientos de operaciones ... // Decenas de consultas MySQL ... // Diversas comprobaciones de archivos y permisos ... // Multitud de requires e includes (css, jscripts, funciones...) ... echo "Tardo mucho en cargar pero te acostumbrarás\n"; echo "Bye!"; ?>Ahora vamos a imaginar un efecto meneame o slashdot y ya tenemos el servidor temblando. Así que vamos a aplicarnos la primera parte del caché web que tanto he explicado y que aún no he mostrado.
<?php
echo "Bienvenido a mi Web.\n";
// Habilitamos el buffer de salida
ob_start();
// Cientos de operaciones
...
// Decenas de consultas MySQL
...
// Diversas comprobaciones de archivos y permisos
...
// Multitud de requires e includes (css, jscripts, funciones...)
...
// Recogemos el resultado del buffer y cerramos
$resultado= ob_get_contents();
ob_end_flush();
// Creamos una cadena con el nombre del script que estamos ejecutando
$filename = $_SERVER["SCRIPT_NAME"];
$break = Explode(´/´, $filename);
$filename = $break[count($break) - 1];
// Añadimos a la cadena todas las variables $_POST que se han podido pasar al script
foreach($_POST as $variable => $valor)
$filename.=$variable.$valor;
// Añadimos a la cadena todas las variables $_GET que se han podido pasar al script
foreach($_GET as $variable => $valor)
$filename.=$variable.$valor;
// Generamos un nómbre único para referirnos a la cadena que acabamos de crear
$filename=md5($filename).".htm";
// Guardamos el archivo con el nombre generado en la carpeta "cache"
$f = fopen ("cache/".$filename, ´w´);
fwrite ($f, $resultado);
fclose ($f);
// Mostramos el resultado en pantalla
echo $resultado;
echo "Tardo mucho en cargar pero te acostumbrarás\n";
echo "Bye!";
Vamos a explicarlo.
Como puede verse antes de realizar el trabajo pesado en el servidor habilitamos el buffer de salida con ob_start(), lo que quiere decir que no se imprimirá nada en pantalla y que todo quedará guardado en memoria para luego poder recuperar el resultado. Al terminar las operaciones leemos el resultado que ha quedado almacenado en ob_end_flush() y deshabilitamos el buffer.
En este momento todo el resultado ha quedado guardado en la variable $resultado y procedemos guardarla como un archivo html en la carpeta "cache". El nombre del archivo es importante que sea único y distinto para cada página, pero incluso más, es importante que sea distinto incluso si la página ha sido llamada pasándole unas variables u otras, pues el contenido podría variar en función de ello, y es por eso por lo que añadimos al nombre del script todas las variables y sus valores que se han pasado tanto por medio de POST como por medio de GET. El script podría completarse incluyendo además cookies y otros tipos de variables de entrada.
La cadena obtenida por este proceso es como una huella dactilar que identifica muy bien el contenido de la variable $resultado, ya que solo indicando el nombre del mismo script y pasándole las mismas variables obtendríamos un resultado igual.
Pero guardar el archivo usando como nombre esta cadena sería arriesgado ya que puede llegar a ocupar varios centenares de caracteres e incluso no ser válida como nombre de archivo. Así es como pensé en el MD5 como una opción de convertir la cadena a una menor de 32 caracteres, única y que además todos ellos son válidos y permitidos como nombre de archivo.
Por último creamos el archivo en la carpeta "cache", mostramos el resultado en pantalla y terminamos el script.
Antes de continuar cabe decir que el script podría mejorarse mucho pero no es la finalidad de este post. Por ejemplo las variables convendría incorporarlas a la cadena $filename en orden alfabético, ya que sino se generarían archivos distintos en la caché solo porque el orden de las variables cambiara de posición. Por ejemplo "index.php?a=1&b=2" e "index.php?b=2&a=1" se tratarían como dos archivos distintos cuando realmente no lo serían.
6. Manos a la obra: SEGUNDA PARTE
Ahora modificaremos el mismo script para que contemple la segunda parte. Es decir, que busque en la caché el archivo que contiene lo que el usuario busca, y que si es así se lo muestre, ahorrándose tener que realizar todos los cálculos que venía haciendo hasta ahora para cada petición.
<?php
echo "Bienvenido a mi Web.\n";
// Creamos una cadena con el nombre del script que estamos ejecutando
$filename = $_SERVER["SCRIPT_NAME"];
$break = Explode(´/´, $filename);
$filename = $break[count($break) - 1];
// Añadimos a la cadena todas las variables $_POST que se han podido pasar al script
foreach($_POST as $variable => $valor)
$filename.=$variable.$valor;
// Añadimos a la cadena todas las variables $_GET que se han podido pasar al script
foreach($_GET as $variable => $valor)
$filename.=$variable.$valor;
// Generamos un nómbre único para referirnos a la cadena que acabamos de crear
$filename=md5($filename).".htm";
// Buscamos en la caché si existe un archivo con este nombre
if (is_file("cache/".$filename)){
require "cache/".$filename;
}
else {
// Habilitamos el buffer de salida
ob_start();
// Cientos de operaciones
...
// Decenas de consultas MySQL
...
// Diversas comprobaciones de archivos y permisos
...
// Multitud de requires e includes (css, jscripts, funciones...)
...
// Recogemos el resultado del buffer y cerramos
$resultado= ob_get_contents();
ob_end_flush();
// Guardamos el archivo con el nombre generado en la carpeta "cache"
$f = fopen ("cache/".$filename, ´w´);
fwrite ($f, $resultado);
fclose ($f);
// Mostramos el resultado en pantalla
echo $resultado;}
echo "Tardo mucho en cargar pero te acostumbrarás\n";
echo "Bye!";
?>
Como veis se ha movido al principio el bloque que genera el nombre del archivo. Ahora lo necesitamos para poder buscarlo en la carpeta "cache". Si lo encuentra un simple require cargará su contenido y lo sacará por pantalla, terminando ahí el script. De lo contrario realiza todo el proceso de cálculo y guarda el archivo resultante en la cache para futuras ocasiones.
Como veis el proceso es bien simple y permite muchas mejoras a partir de este punto.
Dejo para el que quiera continuar a partir de aquí el aplicar un sistema de caducidad de la caché según las necesidades de cada uno.03-05-2008 | PHP | Feed RSS¿Esto qué es?Un intento de blog. Tengo esa mala costumbre de hacérmelo todo y me he resistido a la tentación de usar blogspot o Wordpress terminando por programarme mi propio blog. Soy así... luego me pasa lo que me pasa. ¿Y por donde paras? |