Anatomía de un Correo Cadena

July 30, 2008

No lo podía creer. Mi cuenta de Gmail siempre ha estado limpia de las ridículas cadenas… hasta que hoy… ¡aparecieron!

Es increíble ver como todavía existen personas que se creen esas mentiras sin razón ni fundamento. Solo hay que mencionar algunos títulos que suelen ser pan de cada día en los correos estudiantiles:

  • Da miedo pero es real…
  • 11 formas de besar…
  • Conversación en el MSN… ¡da miedo!
  • Niña con cancer…
  • Criaturita de Dios necesita ayuda…
  • ¡Si suprime esto, no tiene un corazón!

Y los temas son los mismos… la niña de 4 meses (Y sin embargo el correo tiene ya 8 años circulando) con cáncer en el cerebro, el estudiante que antes de morir quiere graduarse, la historia de las hermanas Smith asesinadas por MSN (En realidad, parece una cadena del IRC) y demás tonterías.

Ya que existen productos como SpamAssain, un filtro de Spam producido por la Fundación Apache, he decidido analizar varios correos cadena y dar su "anatomía" para que de una vez sean añadidos a las listas anti-spam de la mayoría de servicios. Por cada "sospecha" de cadena, regalaremos un "crédito".

Estructura de un Correo Cadena

1. Cabecera: Los correos cadena se caracterizan porque tienen demasiados destinatarios. Si aparecieran más de 10 destinatarios en el campo, podemos comenzar a dar un crédito por e-mail. Puede suceder de que la mayoría de correos sean @hotmail.com. Esto también es un indicador poderoso de que estamos ante una cadena. Si encontramos más de 10 direcciones @hotmail… también comenzemos a sospechar. Un crédito por cada direccion de más. Si se pudiera poner como fórmula… tendríamos:

N_Creditos_Cabecera = (Total Remitentes - 10) + (contar_correo_hotmail(Total Remitentes) - 10)

Nos falta el campo del asunto. Prestar atención a estos patrones:

  • FWD:
  • FW:
  • Reenvíalo
  • Pobrecita
  • criatura de Dios
  • pásalo
Tres (3) créditos por estas frases.  Esto se añade a la fórmula de arriba.

2. Cuerpo: Si recorremos sitios como Rompecadenas o VSA Antivirus - Sección Hoaxes, podremos encontrar muchas coincidencias de texto para las cadenas. Aquí entran los fans de las expresiones regulares. Si seguimos el ejemplo de estas dos páginas, podremos detectar patrones como:

 

  • Si recibes un [correo / e-mail] con [algo_variable] ¡ELIMINELO INMEDIATAMENTE! ¡Es un [virus/troyano] que [formatea / quema / destruye] su disco duro C.
  • [Microsoft / Symantec/ MCAfee / CNN] han detectado el [peor / invencible / indetectable] [virus / gusano] que no tiene cura.
  • Soy [Rachel Artson / Rachel Arrow / Amy Bruce / etc] y soy de [algun_lugar_de_USA]. Mi [hija / hijo] de [n] años tiene [cáncer / síndrome de xyz / alguna_enfermedad_rara] y sólo tiene [n] meses de vida si no se le trata. [Yahoo / Google / ZDNET / Microsoft / AOL] nos donarán 0.5 centavos de dólar por cada mail que sea reenviado.
  • Hola soy [xyz], abogada y le voy a decir algo. Bill Gates está compartiendo su fortuna…
  • Habrá que pagar MSN / MSN se hará pago.
  • cadena de [muerte / solidaridad / amor]
  • Esta [foto / virgen / santo] es [milagrosa / poderosa] […] El presiente de [Argentina / Brasil] la llamó basura y a los [n] dias murió su hijo…

Por cada uno de estos patrones se deben asignar 10 créditos, ya que son extraídos de cadenas casi en su totalidad. Nadie se comunicaría usando estas frases. También hay que prestar atención a los siguientes términos:

  • Fundación Pide-un-deseo / Fundación Make-a-wish
  • Forward / Reenvía
  • [n] años de mala suerte / [n] años de maldición
  • No tiene corazón / no comprende el dolor
  • Progesterex
  • Burundanga
  • Droga de los Violadores
  • Te amo…
  • Formas de Besar
  • Etc

Un crédito por cada una de estas apariciones. Si se encuentra la palabra ‘progesterex’ podría concluir de que es una cadena inmediatamente, pero… es preferible el beneficio de la duda.

3. Final: Todas las cadenas suelen acabar igual. También aquí entra el fan de las expresiones regulares. Veamos algunos patrones:

  • Pásalo a todos tus contactos
  • Necesito su ayuda para que lo pasen
  • Reenvíalo a todos los que consideres [amigos / personas especiales]
  • Yo no creía en las cadenas pero ahora pueden salvarme la vida
  • Esto es [real / no es ninguna mentira]
  • No olvides enviarla…

Asignemos 3 créditos por cada patrón. Luego debemos sumar los créditos obtenidos de las 3 partes del mail y estar listos para el análisis.

4. Decidir si es o no un correo cadena: Aún no he hecho una estadística suficientemente fiable para indicar cual es el número de créditos óptimo para decir si un mail es cadena o no. Supongamos que si tenemos de 20 a 30 créditos es un correo con "posibilidades" y si tiene más de 40 créditos… es con toda seguridad una cadena.

Conforme pasen los días haré algun script que dado un archivo de texto verifique si es o no una cadena, usando las anteriores ideas.

Proyecto Pico: Idea para Tesis

July 12, 2008

Tal vez el título del post sea algo extraño. Debido a un cambio de políticas de en la USAT, es requerido proponer con antelación el tema de Tesis, justamente para evitar el tráfico de Tesis ya hechas y demás perlas.

No obstante estoy en III y IV ciclo de Ingeniería de Sistemas, por lo que pensar en una tesis es muy prematuro todavía. Sin embargo algunos profesores ya nos exigen tener una idea, por lo que pasando una noche en vela pensando, se me acaba de ocurrir una: El Proyecto Pico. (Personal Identity Comunication)

Partimos del problema de las comunicaciones celulares. Muchos jóvenes, como el que les habla, necesitan el envío de Mensajes de Texto para coordinar asuntos personales y académicos. Sin embargo, por lo general la mayoría de SMS son los siguientes:

¿Donde estás [nombre_alguien]?

¿Estás en [tal_lugar]?

Muchas veces perdemos el poco saldo del que disponemos para estos propósitos. No olvidar que los SMS son la gallina de los huevos de oro de las operadoras de telefonía, y que al menos en algunos países su cobro es arbritario.

A su vez, he visto la proliferación de dispositivos Bluetooth en teléfonos celulares de última generación. Generalmente se les usa para transferir archivos de celulares a celulares o música de celulares a PC. Algunos los usan para operar audífonos de mejor calidad que los alambrados. Según Wikipedia el Bluetooth posee alcances que van desde 1 m a 100 m. Incluso hay aparatos que aumentan el alcance a 45 km. (Aunque por lo general son aplicaciones industriales)

100 metros para una Universidad es algo razonable y si usamos los equipos de aumento de señal… podemos cubrir toda una manzana. Es una forma fácil y barata de transmitir (Barata no tanto, porque gasta más batería al móvil). No obstante es de locos querer abarcar con un sólo móvil todas esas distancias. A lo máximo podremos un par de decenas de metros.

El Proyecto Pico (Personal Identity Comunication), es una idea para mi proyecto de Tesis que pretende crear un protocolo de comunicaciones que tenga todo lo que cualquier estudiante necesite para comunicarse de sus labores académicas. Se incluye: SMS y Localización de Personas (Algo así como un GPS muy básico)

Sobre el SMS, es importante la privacidad de los usuarios, pero a la vez la capacidad de procesamiento de un celular es muy baja como para usar algún Algoritmo de Cifrado fuerte como AES. Supongo que usare Base64 para encriptar en parte el SMS y luego se aplicará un cifrado simple. La información debería ir compresa para garantizar la máxima eficiencia.

Pero un móvil no puede cubrir todo un Campus. La señal se atenúa debido a la resistencia con el aire y demás fenómenos. Es aquí donde entra un concepto muy importante: El P2P. Nos basamos en la idea de que los celulares pueden emitir y transmitir señales ajenas. Antes de describirlo, llamaremos a los celulares que emiten "nodos" y a los que transmiten "super-nodos".

Todo celular tiene un identificador único dentro de la Red Pico. A este lo llamaremos "PNID" (Pico Network ID). Todo dato enviado posee una cabecera en la que indica el PNID origen y el PNID destino. Acto seguido lleva otros detalles, como tipo de encriptación, etc. Cuando un nodo emite un "paquete" de datos, este puede ser recibido por cualquier otro nodo que esté disponible. Si el nodo es el destino especificado, se muestra en pantalla del móvil. Si no lo es, ese nodo se convierte en un super-nodo y vuelve a emitir el paquete a otros celulares. Estos seguirán enviando el paquete hasta que den con el nodo destino. Si hay que responder, el paquete será envíado de regreso por todos los nodos que encuentre. (No lo hace por los mismos que envió, ya que pueden apagarse).

En el caso de la Identificación personal, se presupone que todos los móviles pueden enviar un paquete indicando su alcance. (De 1 a 100 m, por ejemplo), por lo que basta crear una lista de contactos que tenga relacionado un PNID específico por cada entrada. Luego se emite un paquete de búsqueda, que registre por donde pasó el paquete en cuestión. De esta manera el usuario buscado puede saber al menos a cuanta distancia aproximada se encuentra del que quiere buscar. Si no encuentra a nadie en un tiempo de espera… se asumirá de que el usuario está fuera de cobertura.

Finalmente, esto puede implementarse dentro de un software escrito en algún lenguaje como Java o C++ (Caso de móviles con Symbian) e usarse como programa o como un driver. Se puede usar el IMEI como PNID para evitar suplantaciones.

Propondré este proyecto a mis profesores responsables. Si es aceptado, lo llevaré a cabo cuando llegué a mis ciclos finales. A su vez prometo liberar todo lo relacionado con Pico.

El nombre de Pico viene del editor pico de UNIX y de las siglas Personal Identity Comunication.

Actualizacion (19 -  06  - 08): Gracias a Volkan Rivera y a Vicky, he visto que esta idea mía tiene puntos flojos como el alcance y la seguridad. Si no hay celulares Bluetooth, la idea se vuelve inútil y todavía este tipo de celulares son un lujo en el Perú. Me propusieron además que el móvil envíe la señal a una antena ubicada en el Campus, por si no hay receptores cerca. Seguiré perfeccionando la idea.

Python y Microsoft SQL Server

July 11, 2008

Durante mi curso de Base de Datos, mi profesor nos pidió la implementación de una Base de Datos en Microsoft SQL Server 2000. Si bien usando Erwin y la Ingeniería Directa, generé el script y lo ejecuté… no quiere decir que ahí haya terminado todo eso.

Luego usando el Administrador Corporativo (Una interfaz gráfica para el Microsoft SQL Server) me dediqué al llenado de datos. No obstante, la clase pasada del Martes el profesor nos pidió algo excéntrico:

Adjunten a su trabajo los scripts de creación y llenado de datos. Con eso los evaluaré.

Si bien tenía ya el script de creación, jamás hice un script de llenado. Todo mi llenado lo hice gráficamente. No necesito complicarme la vida usando INSERT INTO… cuando hay herramientas que lo pueden hacer por uno.

Sin embargo, el profesor pedía ese script y tenía que hacerlo, aunque decidí no llenar todo a mano nuevamente. ¿Quién puede ayudarme?

La respuesta, es nuevamente Python. Googleando un poco sobre alguna librería para conectarme a Microsoft SQL Server 2000 me topé con Pymssql, una librería que permitía ser usada para conexión con Microsoft SQL Server. La descargé y la instalé.

El plan era usar Python para recuperar todos los contenidos de los registros y crear instrucciones INSERT. Sabemos que la sintaxis de un INSERT en SQL es más o menos el siguiente:

INSERT INTO tabla VALUES (valor1, valor2, valor3, …, valorn)

Lo que haría era leer una tabla, y por cada fila ir insertando sus valores dentro de una variable del tipo String donde crearía la "instrucción" SQL. Al script que desarrollé lo llamé SQL-INSERT Creator.

El producto final pudo decirse que fue un 70% efectivo. Pueden bajarlo de aquí (Cambiar la extension a .py) y lo pongo bajo licencia MIT, porque me tomó sólo 1 hora escribirlo. Esta es un fragmento de la salida del script:

INSERT INTO GREMISION VALUES (1, 1, 1)

INSERT INTO PROFORMA VALUES (1, datetime.datetime(2008, 6, 20, 0, 0), 1, 1, Decimal("500.00"))

Aún quedan cosas por perfeccionar, como que no muestre las fechas como funciones Python, pero al menos ya es menos trabajo el arreglar eso que tener que copiar todo el código nuevamente.

Para el trabajo final pienso presentar 3 scripts: El de creación, el de inserción y este. Espero que esto le sirva a cualquier otro que se encuentre en una situación similar.

Abelia Process Manager

July 6, 2008

Habiendo terminado mi curso de Sistemas Operativos con la Profesora Karla Reyes, me dispongo a publicar para mis lectores y demás, el programa que hice para fin de ciclo: Un Administrador de Procesos para Cygwin.

Cygwin es una capa de emulación entre Windows y “POSIX” (Entre comillas lo pongo porque sigue siendo Windows), para poder correr aplicaciones escritas para sistemas operativos compatibles con esa norma.

Dado el carácter “Linux” de mi programa, decidí trabajarlo con la consola y usando las ncurses como librerías para los menúes “gráficos” de mi aplicación. Al programar descarté a C por los problemas que me daba, y finalmente opté de nuevo por Python.

Decidí que mi programa tendría 3 partes: Un Menú, un creador de procesos y un eliminador de los mismos. Sin embargo deseaba algo más original que el simple “Menú”, “Creador” y “Administrador”. Buscaba nombres originales para mis componentes.

Para los interesados en la programación, los procesos bajo Cygwin se alojan en el directorio /proc (Al igual que en Linux), leyéndose algunos archivos para obtener información de los procesos. Pueden leer un buen recurso aquí. Para matar procesos se usa el comando kill() y para crearlos fork() y execv(), todos ellos definidos en el módulo OS de Python.

En esos días de programación terminaba de ver la serie Ima soko ni Iru Boku (Ahora y entonces, aquí y ahora, en japonés) en la que el argumento principal es el horror de la guerra infantil. De esta serie me llamaron la atención un par de personajes: Abelia, una comandante muy estricta, Shu, un chico que se negaba rotundamente a las acciones militares y Tabool, un sujeto cuyo único deseo era escalar en el poder generado por la guerra.

Como pueden notar, mi título ya hacía referencia a uno de esos personajes, es decir que decidí llamar a mis componentes usando a los citados personajes. El asunto quedó así:

  • Menu Principal (Abelia Process Manager): Es el componente principal que llama a los otros dos.
  • Creador de Procesos (Shu’s Process Creator): Creador de Procesos. El nombre Shu también es un acrónimo de Shell Utility.
  • Administrador de Procesos (Tabool Process Manager): Administrador de procesos. Permite la eliminación de procesos.

Decir que al exponer este programa y al explicar los nombres me llevé algunas miradas extrañas de mis compañeros e incluso de mi profesora, no acostumbrados a estos extraños asuntos (Para ellos, del Anime)

Los interesados en ver el código fuente, pueden obtenerlo aquí. Todo el código está licenciado bajo Licencia MIT. Debo advertir que el código tiene algunos errores aún y sólo se ejecuta en Cygwin, debido a unas “características” propias de la emulación. Si se animan a portarlo a Linux completamente les estaría muy agradecido, siempre y cuando respeten el nombre de los programas.

Podría decirse que ese fue mi otaku-trabajo del ciclo. Dado que la reacción no fue del todo desfavorable, quizá planee otra referencia en algún trabajo futuro.

PDF ya es estándar ISO

July 4, 2008

Leo en Barrapunto, que ISO ha ratificado la estandarización del formato PDF, por lo que ya posee un ISO propio, en este caso el ISO 32000-1.

Con esto, el famoso formato de Adobe ya tiene una especificación formal y definida que podrá usarse para garantizar interoperabilidad con las aplicaciones que lo manejen.

La Norma ISO publicada, cubre la versión PDF 1.7, que es la que ha sido ratificada como estándar. Si bien es cierto que ya existían versiones del PDF como estándares ISO para la conservación de documentos… no llevaban todavía el rótulo de "PDF" respectivamente. Esta publicación es un estándar ISO rotulado como "PDF", por lo que no hay más ambiguedades respecto al formato.

Los interesados pueden ver los documentos enviados a ISO por parte de Adobe aquí, o bajar la Especificación PDF 1.7, aquí. (Aproximadamente 31 MB)

Con esto aprobado, esperemos que OpenOffice.org tomo despegue ya que por el momento puede exportar PDF de forma nativa y se planea que permita la edición de PDFs en sus futuras versiones. A la vez, hay que destacar la decisión de Adobe, ya que hasta antes del ISO 32000-1, el PDF era sólo un estándar de facto.

Firefox 3 Download Day

June 17, 2008

La Fundación Mozilla ha esta preparandose para lo que sería el lanzamiento de la versión 3 del navegador libre Mozilla Firefox. Por esta razón se prepararon con una idea que era registrar tal cantidad de descargas que Firefox entrase en los Record Guiness.

Este es el llamado Firefox 3 Download Day y fue programado para el 17 de Junio del 2008. Sin embargo, hay un comunicado del blog de Mozilla en el que se ha pospuesto la fecha al 18 de Junio.

¿Pero esto a que se debe? La respuesta es sencilla. La acogida ha sido tal, que en este momento algunos sitios de Mozilla se encuentran caídos.

Se puede bajar el navegador mediante FTP o BitTorrent, pero lamentablemente estas descargas no serán contabilizadas ya que hay muchos usuarios (Con buenas intenciones) que han creado bots para bajar más copias y lograr un número mayor en el record. Sin embargo Mozilla no contabilizará esas descargas. No sería algo justo para el Record Guiness.

Resulta irónico que Mozilla haya muerto de su propio éxito. Son las 10:47 pm en el Perú del 17 de Junio y sin embargo no he podido bajar Mozilla aún debido a la sobrecarga de servidores. Los interesados de saber como va la descarga a nivel mundial pueden consultar los medidores de Mozilla o si prefieren un contador más "en vivo", este otro de Mozilla.

Y como todo buen software libre, Mozilla se preocupa por su comunidad, al tener una plataforma donde las personas que deseen organizar una celebración con respecto a este evento. Este es el caso de Mozilla Party. Lamentablemente no existe ninguna fiesta registrada para el Perú, pero ya me encargaré de hacer yo una no oficial.

Finalmente para los interesados en dejar constancia de su participación pueden imprimirse un atractivo .pdf con un certificado de participación en la propia página del evento. Y como extra, dejo un botón de Mozilla para promover el evento.

Download Day

 

 

 

 

 

 

 

 

Feliz descarga de Firefox 3. Si no lo haz usado… ¿¡Qué esperas!?

Algoritmo de Kamaleon2

May 1, 2008

Otra vez tiene que ser el Anime y las preferencias de algunos uploaders las que me hacen toparme con un programa curioso, al cual tengo a veces que "reescribirlo" por simple gusto, o por simple incompatibilidad con algún sistema operativo que uso.

En este caso, el afortunado a sido Kamaleon2, un programa de camuflaje de archivos, cuyo algoritmo estudiaremos, ya que lo necesitaba para bajar la serie Noir, que por cierto la recomiendo si les gustan las historias de sicarias y organizaciones secretas. (Noir en francés quiere decir ‘Negro’).

Pues bien, instalándome las extensiones GNU para Windows, crearemos un archivo llamado prueba.bin y lo llenaremos con la cadena ‘Noir’, para poder estudiar el algoritmo. Ejecutamos el siguiente comando:

yes "Noir" > test.bin

Tras unos segundos, pulsamos Control + C y ya tenemos un archivo que pesa 5 MB. Ahora abrimos el programa con un editor hexadecimal. Fhred para los usuarios de ventanas o hexdump para los usuarios de consola (Ambos son libres). Todo el archivo dice "Noir" línea por línea.

Abrimos Kamaleon2 y cortamos el archivo. Hay que aclarar que lo que hace Kamaleon2 es crear archivos .jpg de tamaños iguales al corte y les inserta una imagen JPEG de reducido tamaño y luego inserta una parte del archivo cortado, como Hj-Split. Al menos tras analizar las partes con un editor hexadecimal me di cuenta de esa situación.

¿Pero no se supone que si pongo un JPEG y añado más cosas ya no se lee el archivo? No necesariamente. Aunque actualmente no poseo la documentación pertinente, he visto en varios JPEG los mismos 2 bytes de final: ‘FF D9′ en hexadecimal. Según Wikipedia, esos bytes indican el final del propio archivo JPEG.

Probe cortar y pegar la zona comprendida entre el inicio del archivo y los bytes ‘FF D9′. Si se genera la imagen JPEG completa, por lo que la marca de fin de imagen es correcta. Supongo que se hará por informacional adicional que se adjunta al JPEG, como cabeceras EXIF.

Pues bien, entonces simplemente para cortar y camuflar una imagen, simplemente abrimos un archivo nuevo .001, le adosamos un JPEG y justo después un "pedazo" de archivo a partir. Luego creamos otro archivo .002, le adosamos un JPEG y la siguiente parte de la imagen y así sucesivamente hasta acabar.

Para pegar los archivos lo tenemos un poco más complicado. Hay que separar el JPEG del archivo y empezar a unirlos. No estoy seguro si la cabecera de final se repite dentro del JPEG mismo, así que hay que buscar todas las aparariciones de ‘FF D9′ y elegir la última. Sin embargo en el último archivo hay cierta información de control que está "pegada" al archivo, y que debe ser eliminada antes de procesarlo, ya que de no ser así no se recrearía el fichero exacto. Eso es algo que está por verse.

Por otro lado, Kamaleon2 usa protección por contraseña en sus cortes. Sin embargo es totalmente inútil ya que la estructura es la misma que la explicada anteriormente. No se usa encriptación para proteger el archivo, de mod que la clave sea la que descifre. Así que simplemente leyendo más allá de ‘FF D9′ podemos saltarnos la contraseña.

Igual que con HJ-Split, pienso hacer una implementación en Python pronto. Ojalá en solo 24 horas, porque tengo inquietud del episodio de Noir.

Awardmestars: El timo de los premios de software

April 28, 2008

Si hemos trabajado en Microsoft Windows, ya sea por obligación o por propia decisión, muchas veces hemos recurrido a las típicas páginas tipo Download.com, en las cuales muchas veces vemos estas "recomendaciones" cuando bajamos o buscamos algun software:

Muchos hemos pensado (Me incluyo) en su momento de que estas certificaciones eran prueba de que descargábamos un software en condiciones. Pues no fue así. El blog Successfull Software, publicó un artículo donde demostró que la mayoría de esas certificaciones son falsas.

Para demostrarlo, simplemente enviaron un archivo .txt renombrado a .exe que contenía las siguientes palabras:

this program does nothing at all
this program does nothing at all
this program does nothing at all
this program does nothing at all
this program does nothing at all

El nombre del programa también fue otra razón para que los sitios lo rechazaran, ya que se llamaba "awardmestars" (Prémiame [con] estrellas, en inglés), un claro nombre proselitista.

Ya que el .exe era un programa totalmente inútil (No se ejecutaba siquiera), se esperaría que los sitios lo rechazarían. Grande fue la sorpresa del autor al ver que su programa recibió todos los "premios" mencionados arriba.

Es lamentable que muchos de estos sitios ofrescan estadísticas e información falsa, todo para ganar visitas. Espero que a raíz de este hecho, Google Adwords y demás eliminen a los sitios que dieron las falsas premiaciones.

La moraleja de esta historia es no ser tan confiados y buscar sitios donde se asevere la veracidad de la información que hemos recibido de estos sitios. Esta vez fue un programa inútil… nada nos garantiza que en otra ocasión sean virus y demás.

Y si usamos GNU/Linux lo tenemos más fácil todavía. No se usan esas ridículas premiaciones. Simplemente buscamos en los repositorios o en los foros. 

bxSplit: HJ-Split en Python

March 29, 2008

Habíamos hablado una vez en este blog sobre HJ-Split y su algoritmo, el cual describimos y dejamos pendiente la implementación. Pues bien, que este corto post sea para informarles que he terminado mi propia implementación del algoritmo a la que llamo: bxSplit, es decir ‘BrunoxSplit’.

bxSplit está escrito en Python y está liberado bajo la MIT License.

Pueden descargarlo aquí. Renómbren el .py.txt a .py si desean ejecutarlo. Lo pongo así para que sea más facil a algunos, leer el código antes de bajarlo.

Aquí les pongo la ayuda del archivo:

Modo de uso:
    -h: Muestra la ayuda
    -s [MB] [File]: Divide el archivo [File] en trozos de [MB]
    -j [File.000]: Une el archivo [File.000] en el archivo [File]

Ya he actualizado el post del algoritmo para que vean el código por aquí.

Tengo que finalizar mencionando que este programa lo escribi debido a que se me pedía el programa HJ-Split en algunas descargas de Captain Tsubasa. ¡Ahora podré unir los archivos! 

Rectángulos con bordes redondos con Pygame

March 16, 2008

Los hemos visto en todos lados. Los rectángulos con bordes redondeados invaden el escritorio, los videojuegos y demás. Es la nueva moda. Y sin embargo muchos no sabemos que ese efecto muy llamativo es en realidad un simple truco de geometría.

Como tenía una aburrida tarde, me dediqué a programar con Pygame una clase que permita dibujar esta clase de figuras. Pueden ver el código fuente aquí

Si ejecutan el .py obtendrán el siguiente resultado:

Rectángulo con bordes redondos 

Pero aún no hemos hablado de como es el efecto. Bien, lo vamos a explicar.

  1. Obtenemos las cordenadas del rectángulo a dibujar
  2. Pedimos un radio para los bordes (A más radio, más redondo es el rectángulo)
  3. Restamos a las líneas que forman el rectángulo el doble del radio
  4. Dibujamos el borde redondo usando un arco. Para esto, atentos a lo siguiente:

Ur rectángulo es una figura de 4 lados y cuyos ángulos son de 90º. Sin embargo, para dibujar el arco, sabremos bien que un arco es simplemente un "pedazo" de círculo, por lo que especificamos los ángulos de inicio y fin del mismo. Entonces ocurre una curiosa correlación.

Si tenemos que un rectángulo originalmente tiene ángulos de 90º, 90 x 4 = 360º. Lo que significa que los arcos de los bordes son "1/4" de círculo. Por esa razón se usan los siguientes valores:

  • Borde Izquierdo Superior: 90º - 180º
  • Borde Derecho Superior: 180º - 270º
  • Borde Izquierdo Inferior: 270º - 360º
  • Borde Derecho Inferior: 0º - 90º 

Con eso tenemos todo un círculo perfecto. Por razones de imperfección de las pantallas y los ángulos se le han sumado +1 al borde izquierdo inferior. 

Ya tenemos una clase que dibuje rectángulos con borde. Sería deseable que alguien más entendido de Python analize el código para ver si es factible incluir esto dentro de Pygame. Al menos para mí, una función así sería muy útil.

El código es libre y puede usarse para lo que se desee. (Licencia MIT para los interesados)

He tomado ejemplos e ideas de la página LoserJuegos: Este y este.

El código fuente de la función __arc__ ha sido un mero porte de la función Arco() en C, de un código fuente de fhenix tomado de la página LoserJuegos. El código original es este

Cualquier error o mejora que propongan a este código favor de reportarlo en los comentarios.