Wifi en Amilo M7440 con Ubuntu10.10

Ayer se me fastidiaron el adaptador de corriente de mi portátil HP y el disco duro de mi Mac Book Pro, lo que me ha obligado a resucitar mi primer equipo portátil: un Fujitsu Siemens Amilo M7440.

Aunque era un buen cacharro en el año en que lo compré, Windows 7 se le queda algo grande y además tiene un problema muy grave de diseño:  la tarjeta wifi se activa con un botón controlado por software mediante un driver sólo disponible de forma oficial para XP. Encima dicho driver requiere privilegios de Administrador y no funciona con las opciones de compatibilidad de Windows Vista y 7.

Por suerte, existe un invento creado para Linux por unos desarrolladores españoles que servía muy bien en versiones anteriores a la 10 de Ubuntu, pero para que funcione en versiones actuales hay que hacer unos retoques en el código fuente.

El archivo que hay que modificar es el fsam7440.c, lo cambios son los siguientes:

//línea 40: cambiar  #include <linux/autoconf.h> por
#include <generated/autoconf.h>
//línea 168, cambiar remove_proc_entry(DRV_NAME, &proc_root); por
remove_proc_entry(DRV_NAME, NULL);
//línea 179, cambiar dir_base = create_proc_entry(DRV_NAME, S_IFDIR, &proc_root); por
dir_base = create_proc_entry(DRV_NAME, S_IFDIR, NULL);

Una vez hemos estos cambios, se compila con un make y make install.

Para encender el “botón” del wifi basta ahora con llamar a este comando

sudo modprobe fsam7440

Dominios WildCard en aplicaciones web php sin problemas con las variables $_SESSION

Muchos os habréis fijado en servicios web que usan subdominios dinámicos (wildcard) para las cuentas de sus usuarios, como por ejemplo jaiku.

Sin embargo, una vez configurados los subdominios dinámicos, tenemos un serio problema y es que, las variables de sesión por defecto se pierden cada vez que ejecutamos la aplicación web desde un subdominio distinto al que hemos utilizado para crear dicha variable de sesión.

Podemos comprobar esto en algunos sitios web que no usan subdominios dinámicos pero, si hacemos login en su www.dirección.com, si después vamos a su dirección.com sin las ‘www’ nos encontramos con que no hemos iniciado sesión. El problema es similar y tiene la misma solución que en el caso de los wildcard domains.

Voy a explicar cómo solucionar este problema y como hacer funcionar subdominios dinámicos.

Los pasos:

1 – Configurar el dns

2 – Configurar el servidor web

3 – Configurar bien el ámbito de las variables $_SESSION en la aplicación php para que se compartan las variables de sesión entre los subdominios.

Configurar el dns.

Basta con crear una entrada tipo host es decir, “A” apuntando a *.tudominio.com . También vale con crear un CNAME * apuntando al registro A del dominio principal (“tudominio.com”).

Si hacemos un ping a “loquesea.tudomino.com” debería ya resolver (a menos que tengas capado el tráfico ICMP claro)

Configurar el servidor web.

En Apache httpd, debemos configurar en el vhost de nuestro dominio un ServerAlias que atienda a “*.midominio.com”

En Nginx, debemos configurar en la sección Server un valor server_name como “*.midominio.com”

En IIS, debemos dejar un sitio virtual sin headers y ese es el que atenderá las peticiones de vuestro wildcard dns, es la única forma.

Se ha discutido sobre este tema en el foro oficial de IIS y según los propios desarrolladores, aunque ha sido demandada durante años, no se piensa implementar dicha funcionalidad por ahora, ni siquiera en IIS7.

Nota: sólo podemos disponer de un sitio web sin headers por servidor web IIS.

Configurar nuestras variables de $_SESSION en php

El truco esta en configurar la directiva session.cookie_domain como “.midominio.com” (importante el . delante del dominio).

Podéis hacerlo en tiempo de ejecución, antes de llamar a session_start(); siempre que tengamos deshabilitado el autoarranque de sesiones en el php.ini (como es lógico y viene por defecto)

ini_set("session.cookie_domain",".midominio.com");
session_start();

Ahora ya podéis crear servicios web tan útiles como este.

Recuperar último id insertado en SQL Server desde php con el Driver Oficial de Microsoft

Microsoft ha publicó hace unos meses la versión RTM de su driver oficial para php que permite conectarse a sus bases de datos SQL Server.

Vamos a usar dicho driver para mostrar cómo recuperaríamos el último id insertado en una tabla.

//Especificamos el servidor
$server = "HOSTINSTANCIA";
//Especificamos los datos de acceso y la base de datos
$info = array( "Database"=>"bd","UID" => "user","PWD" => "pass");
//nos conectamos
$c = sqlsrv_connect( $server, $info);
//especificamos el código sql para la consulta parametrizada
$sql = "INSERT INTO tabla (valor) VALUES (?);";
//Scope_Identity nos devuelve el último id insertado
$sql .= "SELECT Scope_Identity() as id;";
/*
especificamos el valor o valores que se pasarán como
parámetros en la consulta anterior
**/
$param = array($valor);
//preparamos la consulta
$s = sqlsrv_prepare($c, $sql, $param);
//ejecutamos la consulta
sqlsrv_execute($s);
/**
*
En este momento se ha ejecutado la consulta pero, al contrario
de lo que podamos deducir, no se devuelve ningún valor 'id'
aunque hagamos un fetch
para obtenerlo debemos hacer un sqlsrv_next_result();
**/
sqlsrv_next_result($s);
//Ahora sí, hacemos un fetch
$r = sqlsrv_fetch_array($s, SQLSRV_FETCH_ASSOC);
//Mostramos el resultado
echo "Hemos insertado una fila con el id: ".$r['id'];
//liberamos la variable de estado
sqlsrv_free_stmt($s);
//cerramos la conexión
sqlsrv_close($c);

"No seas como nosotros", presentación de Blaine Cook sobre cómo consiguieron escalar Twitter

Blaine Cook, de Obvius – empresa creadora de Odeo y Twitter – ha ofrecido una charla, imprescindible para todos aquellos que desarrollamos desarrollan aplicaciones web con más de 4 usuarios – sobre todo si usan RubyonRails -, en la que explica los errores que cometieron y cómo pudieron escalar el que es quizás, el servicio online que más rápidamente a crecido en éste año: Twitter (llegando a 2.400 peticiones a la base de datos por segundo) .

Disco duro protegido con contraseña

En el antiguo blog enrackados, publiqué un post que fué muy comentado. En él se conseguía quitar la protección de un disco duro que pedia contraseña al arrancar. Decía lo siguiente:

Hace meses me encontre con un problema de hardware poco común. Un usuario no podia arracar su portatil porque le pedia contraseña su disco duro. Muchos de vosotros pensareis que hablo de la tipica contraseña puesta en la BIOS que se quita quitandole la pila a la placa base… pero en este caso el usuario tenia razón.
La contraseña estaba en el disco duro y no en la placa base. Probé con un adaptador IDE de 2,5 a 3,5 poniendo el disco como esclavo y metiendolo en una caja usb pero nada… el disco era inaccesible.
Después de buscar y buscar por los abismos de google encontré un hilo en experts-exchange que hablaba sobre el tema.

El hilo me llevo a este sitio web

Los pasos para quitar la contraseña fueron los siguientes

  • Descargarme el crack atapwd (de Alex Mina, al parecer de origen ruso)
  • Crearme un diskette bootable con el atapwd.exe en él
  • Poner el disco duro del portatil en el IDE 2 de mi equipo como master con un adaptador IDE de 2,5″ a 3,5″
  • Iniciar el equipo desde el diskette y correr el atapwd.exe
  • Seleccionar el disco con contraseña y darle a enter en el menu. En mi caso era un Hitachi pero existe éste problema también en discos Fujitsu.. las soluciones:
    • Para Fujitsu: Elegir “unlock with user password“, y después “disable with user password“. No poner nada como contraseña y pulsar enter
    • Para Toshiba y Hitachi, si lo con la solución de Fujitsu no funciona: elige “unlock with master password“, y entonces “disable with master password“. la contraseña es todo espacios
  • El disco ya esta desprotegido.. solo queda reiniciar