Archivos de la categoría ‘Pogramación’

h1

Los frutos de tener tiempo libre…

05.Noviembre.2009

Hacía mucho que no escribía por aquí… Mi vida ha cambiado bastante. Por fin tengo algo de tiempo libre. Antes trabajaba en la obra entre 10 y 12 horas al día y muchas veces 7 días a la semana; ahora de 8 a 15h y de lunes a viernes. Un lujo.

Cosas que hago en mi tiempo libre:

  • Volver a estudiar, me he matriculado en la ingeniería de informática de sistemas. Se hace un poco raro después de 8 años sin coger un libro, pero de momento va bien… es más, pensé que nunca diría esto pero disfruto con los ejercicios de álgebra y análisis matemático.
  • Deporte.
  • Programar. He programado montones de cosas. Por supuesto están todas inacabadas. A continuación unos ejemplos:

Tengo empezado un foro para HispaShare.com. Debería terminarlo pero siempre encuentro algo más divertido para programar. Ya veremos si lo retomo un día de estos… sí, ya se que podría instalar un foro tipo phpBB, pero ¿qué gracia tendría? Podéis visitarlo aquí, tened en cuenta que todo lo que escribáis será borrado cuando se haga “oficial”.

Motocross MadnessHe hecho un emulador de GameBoy, escrito completamente en JavaScript. Lo empecé medio en broma para ver si era posible y sí, lo era. Usando el navegador Chrome de Google funciona perfectamente (su motor V8 es increíble), con Firefox funciona, pero lento. Además incluye un debugger con desensamblador, visor de CPU, volcado de memoria y esas cosas… Podéis probarlo aquí (usad Chrome!).

LOLP2PTambién he programado (en realidad está a medio hacer y tiene fallos) un buscador de eLinks, Torrents, Descargas Directas y más cosas. Lo he llamado LOLP2P, aunque tiene su propio dominio (lolp2p.com) de momento sólo es accesible desde aquí. Si algún día lo termino lo integraré en HispaShare. Recordad que esta inacabado y tiene errores!

Otra cosa que he hecho es una utilidad para arreglar subtítulos. En realidad es una tontería, pero ayuda a los rippers que tengan problemas con el proceso de OCR. Tener que corregir unos subtítulos a mano es una labor muy poco agradable y para eso hice “el arreglador de subtítulos“. Está muy lejos de ser perfecto pero ayuda bastante.

Además tengo empezadas otras dos webs de las que ya hablaré…

h1

Sistema de comentarios terminado

16.Enero.2009

A partir de hoy, si estás registrado/a en la web, ya puedes escribir tus comentarios de las películas que hayas visto. Además puedes valorar los comentarios que hagan los demás (algo así como en Youtube).

Si una película tiene varios comentarios, inicialmente sólo mostrará el mejor valorado. Para verlos todos, hay un botón.

Todo el sistema esta hecho en AJAX y como acabo de ponerlo en marcha tal vez tenga algunos fallos que iré corrigiendo sobre la marcha.

h1

Sobre cómo obtener el número de fuentes de un elink

11.Noviembre.2008

Puede que ya no lo recuerde nadie, en los tiempos de Razorback2, HispaShare tenía una funcionalidad que permitía ver (casi) en tiempo real el número de fuentes de cada elink. Pinchando un icono al lado de cada elink se veía una gráfica que mostraba el número de fuentes completas, parciales y peticiones que había tenido el elink en los últimos días y así comprobar el estado “de salud” de cada elink.

Obtener esos datos era facilísimo ya que el servidor Razorback2 tenía una web donde proporcionaba esa información. El servidor tuvo problemas legales y la web se cerró.

Desde ese momento, para obtener el número de fuentes lo que hice fue hacer un programilla que simulaba las peticiones UDP que hace eMule para obtener el número de fuentes de un elink determinado en cada servidor. Pero con el tiempo los servidores perdieron esa funcionalidad.

Había otra solución, en vez de hacer una petición UDP preguntando por el número de fuentes, hacías una petición con distintos opcodes que el servidor interpretaba como una búsqueda. Si buscas “ed2k::<hash>”, el servidor te devuelve el número de clientes que tienen un archivo con ese hash. Pero desde hace medio año, o puede que más, los servidores tampoco permiten hacer búsquedas de tipo “global” (es decir, por UDP). Prueba de ello es que si con eMule haces una búsqueda local y global obtienes los mismos resultados (puede que en global recibas SPAM si no tienes los filtros de IPs, otro día hablaré sobre ello…)

Resumiendo, ahora mismo, la única forma (que yo sepa!!!) de averiguar las fuentes que tiene un elink es conectarte vía TCP al servidor y preguntarle. Pero claro, eso ya no es tan fácil de programar… buscar por KAD queda descartado ya que no permite hacer búsquedas por Hash. Tendría que hacer un programa que se conectara a la vez a todos los servidores que pudiera para ir enviando las peticiones en paralelo. Haciendo una petición cada 5 segundos al cabo del día habría comprobado 17280 elinks, casi todos los de la web. Dando prioridad a los nuevos elinks podría hacer que las fuentes de éstos se vieran casi en tiempo real.

El protocolo no es muy complicado (aunque sí feo) pero no encuentro documentación decente y actualizada sobre él y no voy a perder el tiempo haciendo ingeniería inversa con un servidor local… eso ya lo hice con los UDPs xD

Tengo pensado reutilizar código de aMule (el eMule para Linux) pero mi nivel de C++ no alcanza esa categoría y me cuesta entenderlo pero tampoco me apetece traducir las funciones a otro lenguaje que me sea más familiar. Si alguien tiene experiencia en programar aplicaciones multihilo con sockets en C++ y le interesa explicarme cuatro cosillas, lo agradeceré. Sino ya me buscaré la vida… porque lo de obtener el número de fuentes es una obsesión…

h1

Comprobar si un email es válido (II)

25.Octubre.2008

Ya he terminado el script que comprueba si un email es válido o no. Básicamente hace lo que comenté en el post anterior:

  1. Averigua los registros MX del dominio
  2. Los va probando hasta encontrar uno que funcione
  3. Simula el envío de un email para ver que dice el servidor sobre la dirección

He colgado un ejemplo con mensajes de debug por si alguien quiere ver como funciona o probarlo. Si estás interesado en el código, pídemelo.

Algunos problemas que tiene:

  1. Puede validar alguna dirección como correcta sin serlo ya que ciertos servidores como hotmail se lo tragan todo (seguramente para evitar comprobaciones masivas por spammers).
  2. Hay servidores como yahoo que, aparte de no implementar correctamente el protocolo, muchos de sus servidores MX rechazan las peticiones.
  3. Otros servidores, como telepolis.es dan error: 550 Reverse DNS lookup failed for host 64.235.***.***. Pero supongo que eso es problema de ellos.
  4. No es una comprobación inmediata. Algunos servidores se toman su tiempo.
h1

Comprobar si un email es válido

24.Octubre.2008

Muchos usuarios al registrarse en la web escriben direcciones de email inválidas (hotmeil.com, hotmaill.com, jotmail.com… y cosas peores, no es broma!) y esto hace que sendmail se vuelva loco. Constantemente trata de reenviarlos, resolver dominios que no existen o conectar a puertos que no responden… esto provoca que los logs de error crezcan de una forma espectacular y consume recursos de una forma que no había visto antes (sin duda por una configuración chapucera mía). Pero como la documentación de sendmail es para volverse loco y no me apetece probar otras cosas (como qmail o mail() de PEAR), haré un script en PHP que me haga la tarea de comprobar direcciones y mandar emails.

¿Cómo saber si una dirección es válida? Lo más simple sería mirar si responde a un ping.

sonic@XTC:~$ ping gmail.com
PING gmail.com (64.233.161.83) 56(84) bytes of data.
64 bytes from od-in-f83.google.com (64.233.161.83): icmp_seq=1 ttl=240 time=183 ms
64 bytes from od-in-f83.google.com (64.233.161.83): icmp_seq=2 ttl=240 time=224 ms
--- gmail.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 183.999/204.274/224.550/20.280 ms

Pero claro, eso no significa nada. Podría ser un servidor de cualquier cosa. Habría que comprobar el puerto 25, pero…

sonic@XTC:~$ telnet gmail.com 25
Trying 64.233.161.83...
Trying 66.249.91.83...
Trying 209.85.171.83...
telnet: Unable to connect to remote host: Connection timed out

Lo más normal es que no responda ya que antes deberíamos mirar los registros MX. Se suelen utilizar distintos servidores para el correo. Es muy fácil de averiguar.

sonic@XTC:~$ dig -t MX gmail.com
; <<>> DiG 9.4.2-P2 <<>> -t MX gmail.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25761
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 4, ADDITIONAL: 10
;; QUESTION SECTION:
;gmail.com.            IN    MX
;; ANSWER SECTION:
gmail.com.        244    IN    MX    10 alt2.gmail-smtp-in.l.google.com.
gmail.com.        244    IN    MX    50 gsmtp147.google.com.
gmail.com.        244    IN    MX    50 gsmtp183.google.com.
gmail.com.        244    IN    MX    5 gmail-smtp-in.l.google.com.
gmail.com.        244    IN    MX    10 alt1.gmail-smtp-in.l.google.com.
;; AUTHORITY SECTION:
gmail.com.        241375    IN    NS    ns4.google.com.
gmail.com.        241375    IN    NS    ns1.google.com.
gmail.com.        241375    IN    NS    ns2.google.com.
gmail.com.        241375    IN    NS    ns3.google.com.
;; ADDITIONAL SECTION:
gmail-smtp-in.l.google.com.   238   IN    A    209.85.129.114
gmail-smtp-in.l.google.com.   238   IN    A    209.85.129.27
alt1.gmail-smtp-in.l.google.com. 44 IN    A    209.85.147.27
alt2.gmail-smtp-in.l.google.com. 37 IN    A    209.85.133.27
alt2.gmail-smtp-in.l.google.com. 37 IN    A    209.85.133.114
gsmtp147.google.com.        4720    IN    A    209.85.147.27
gsmtp183.google.com.        5711    IN    A    64.233.183.27
ns1.google.com.           345591    IN    A    216.239.32.10
ns2.google.com.           336560    IN    A    216.239.34.10
ns4.google.com.           336560    IN    A    216.239.38.10
;; Query time: 273 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Fri Oct 24 20:58:36 2008
;; MSG SIZE  rcvd: 390

Ahora sí podemos hacer un telnet al servidor correcto:

sonic@XTC:~$ telnet gmail-smtp-in.l.google.com 25
Trying 72.14.221.114...
Connected to gmail-smtp-in.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP
HELO hispashare.com
250 mx.google.com at your service

Ya estamos conectados al servidor de correo de google y podemos comunicarnos con él. Para comprobar si pepe@gmail.com es válido podemos hacer lo siguiente:

sonic@XTC:~$ telnet gmail-smtp-in.l.google.com 25
Trying 209.85.129.27...
Connected to gmail-smtp-in.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP
HELO hispashare.com
250 mx.google.com at your service
MAIL FROM: <webmaster@hispashare.com>
250 2.1.0 OK
RCPT TO: <pepe@gmail.com>
550-5.1.1 The email account that you tried to reach does not exist. Please
550-5.1.1 try double-checking the recipient's email address for typos
550-5.1.1 or unnecessary spaces. Learn more at
550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596
QUIT
221 2.0.0 closing connection
Connection closed by foreign host.

Y con estos pasos ya sabemos si un servidor existe, si es de correo y si la dirección es válida. Con una dirección correcta el resultado sería así:

RCPT TO: <hispashare@gmail.com>
250 2.1.5 OK

Eso es todo. No parece complicado de implementar en PHP así que este fin de semana haré mi propia función mail() para comprobar direcciones y mandar correo. Así podré quitar sendmail del servidor, que no me da más que dolores de cabeza (sí, lo más probable es que tenga algo mal configurado).

h1

El registro de usuarios

19.Octubre.2008

Es una ironía

Como habréis podido comprobar, he puesto un cuadro para registrarse en la web.

De momento, para el usuario normal no sirve para nada. Mi intención es que más adelante (cuando lo programe…) los usuarios registrados podrán comentar las películas, crearse un listado de sus preferidas y compartirlo (algo así como youtube). No es necesario estar registrado para bajarse las películas. Y, por supuesto, no se revelará ningún dato privado ni tu e-mail a nadie.

Sin embargo, actualmente el registro sirve para que los colaboradores de la web, los cuales tienen una cuenta con más privilegios, puedan publicar sus trabajos y modificarlos si fuese necesario. Anteriormente los colaboradores tenían acceso total a la web lo cual era un grave problema de seguridad y, por desgracia, sólo me podía permitir confiar en unos pocos. En cambio ahora, cada colaborador sólo tiene acceso a sus cosas. Esto me permitirá abrir el sistema a más gente que esté interesada en compartir sus trabajos.

h1

Clasificación por edades

06.Septiembre.2008

RUna de las peticiones que tenía pendientes era la clasificación por edades de las películas. Puede parecer algo sencillo pero no lo es tanto…

Cada país tiene un sistema de clasificación distinto y también cambian los criterios con los cuales clasifican a las películas. En EE.UU. son muy estrictos con los temas de drogas y sexo pero con la violencia son más permisivos, en otros países ocurre lo contrario.

He hecho un programa que actualizará las fichas y poco a poco irá clasificando todas las películas que pueda, en principio adoptará el sistema estadounidense porque es el más fácil de obtener y el más difundido. Para películas donde esta clasificación no esté disponible, mirará si otro país ha creado una clasificación y tratará de convertirla al equivalente norteamericano.

Todo esto, como siempre, es muy subjetivo y habrá padres muy puritanos y otros más liberales. Del mismo modo habrá niños muy inocentes y otros que ya han visto de todo… La decisión final debería depender de los padres y lo que indica la web es simplemente una referencia.

Si alguien discrepa con la clasificación que tiene una película determinada, que deje un comentario en el blog.

h1

¡Solucioné el problema con MySQL!

16.Junio.2008

Oh wait! En realidad el problema no era con MySQL sino con… exacto! con Internet Explorer!!!

Un usuario (Atolon), en un comentario del blog me dio una pista. Me comentó que con IE7 las imágenes se le cargaban dos veces. Pensé que sería algo puntual pero investigué…

HispaShare carga muchísimas imágenes, tanto en la portada como en las fichas de las películas. Si tuviera que pagar todo ese ancho de banda de mi bolsillo estaría apañado. Por lo tanto la web va subiendo las imágenes a distintos servidores gratuitos (actualmente utilizo alrededor de una docena).

Pues bien, ocurre que, a veces, los servidores gratuitos borran las imágenes, cortan el servicio, están saturados, etc. Con un simple javascript, el navegador de cada usuario detecta si hay un error cargando la imagen y si lo hay, solicita mediante AJAX la copia local almacenada en la web, así siempre se mostrará una imagen. A través de este AJAX también se marca la entrada de la base de datos referente a esa imagen para que la web más tarde pueda comprobar si realmente está borrada y si lo está, volver a subirla. ¿Lioso? Aún queda mas…

Por otro lado, ciertos servidores gratuitos, limitan en ancho de banda diario para una imagen concreta, en ese caso te reemplazan la imagen por otra en la que aparece el aviso de “Bandwidth Exceeded”. De nuevo, el navegador de cada usuario detecta esto. Otro javascript se dedica a comprobar que las dimensiones y formato de las imágenes cargadas se corresponde con la original y en caso de que no, solicita la copia alojada en mi servidor (todas estas comprobaciones no suponen una carga para la web ya que las hace el navegador de cada usuario).

¿Y que tiene que ver Internet Explorer en todo esto? Pues que se hace la picha un lío cuando tiene que comprobar los tamaños de muchas imágenes a la vez y las da todas como erróneas aunque hayan cargado correctamente. Es decir, simplemente en la portada, implica 30 peticiones AJAX, con sus 30 conexiones a MySQL y unas 4 operaciones en la base de datos por conexión. Si multiplicamos eso por 500 ó 1000 usuarios casi simultáneos que utilicen Internet Explorer… pues eso, se me satura el servidor de bases de datos, me utiliza un montón de ancho de banda (porque carga todas las imágenes de mi servidor) y me marca todas las imágenes como erróneas lo cual le da mucho trabajo a la web para ir comprobándolas posteriormente.

Lo que he hecho es que todo aquel que no utilice Firefox no podrá ejecutar la comprobación de las dimensiones y el formato, por lo tanto, de vez en cuando puede aparecer una imagen de esas de “Bandwidth Exceeded”, pero será por poco tiempo porque los usuarios que usen Firefox detectarán los errores y su navegador avisará a mi servidor de que hay que volver a subir las imágenes.

Aún así estoy contento de lo bien que ha respondido el servidor trabajando en unas condiciones tan penosas y aguantando como un campeón.

h1

Apaño para MySQL

03.Junio.2008

Como de vez en cuando sigue saliendo el error de MySQL (sobre todo cuando más tráfico hay) y no consigo averiguar la causa, he hecho una chapucilla, a ver que pasa ahora…
function mysql_connect_db() {
  global $mysql_user, $mysql_pass, $mysql_host, $mysql_data;
  $link = false;
  $i = 0;
  while (($i<3) and ($link===false)) {
    if ($i>0) sleep(2);
    $link = @mysql_connect($mysql_host, $mysql_user, $mysql_pass);
    $i++;
  }
  if ($link===false) die("MySQL connect: ".mysql_error());
  mysql_select_db($mysql_data, $link) or die("MySQL select: ".mysql_error());
  return $link;
}

Básicamente lo que dice el código es: “si no puedes conectar, espérate un rato y vuelve a intentarlo”.
Si a alguien se le ocurre algo mejor, que me lo diga.

h1

Idiomas en la portada

31.Mayo.2008

Varios usuarios me han pedido a ver si puedo poner los idiomas disponibles de cada película en la portada. Por lo visto son amantes de las películas en V.O. y les da pereza estar entrando y saliendo en las fichas para ver si está en el idioma que desean. Y lo mismo al revés, gente que entra pensando que está disponible en castellano y sólo está en V.O.

Como no está bien que la gente se decepcione, ya está hecho. Ahora en la portada se puede ver en que idiomas está disponible cada película o serie.

Y por otro lado, ya que me he puesto a programar, he aprovechado para poner el tag <title> personalizado a cada página de la web (lo se, ya era hora!!!). Supongo que eso importa poco a los usuarios pero de este modo los buscadores indexan mejor los contenidos.