Método para detectar bots
Ayer, mientras configurabamos joomla en la laptop de mi novia, descubrí su maravilloso invento, una forma de ordenar archivos que hace muy difícil que un bot pueda encontrar el orden correcto :). El método es sorprendentemente sencillo para los humanos, consiste en usar una frase, y a partir de las palabras en esta, tomando de a una o dos, nombrar los archivos, así un humano podría organizarlos en el orden correcto, por ejemplo:
$ ls
como.jpg estas.jpg hola.jpg
Obviamente, con un poco de IA se puede conseguir un bot que ordene cosas como esas, pero sin dudas es más complejo y costoso :).
Exámenes en Odesk
Luego de hacer varios exámenes de Odesk en www.expertrating.com, se vuelve evidente
y desesperante que la calidad de los mismos influya en los resultados que
obtengo, son deplorables las pruebas sobre C, C++, protocolos de red, shell
scripting, dan ganas de atravezarse los ojos con alfileres al verlos…
Como ejemplo, en la prueba sobre TCP/IP se hace la pregunta sobre que contiene
el archivo “HOSTS” (no recuerdo tener un archivo con ese nombre, supongo que
se refieren a /etc/hosts), en la cual como respuesta correcta tiene que el
archivo contiene mappings de direcciones IP a nombres NetBIOS (existe uno en
windows, pero se llama %WINSYSDIR%\etc\LMHOSTS si mal no recuerdo), posteriores
preguntas hace otras referencias a NetBIOS… no hay mucho que decir, incluso
hay atrocidades mucho peores en otras pruebas; especialmente me molesta que
habiendo respondido bien a varias preguntas ambiguas haya obtenido un puntaje
tan bajo en el exámen sobre C, quizás porque se refieren a C89 mientras yo asumí
C99 (o quizás peor, MSVC), pero no lo aclaran en ningún lado… y aún así
muchas preguntas tenían errores.
No es el primer sitio de este tipo en el que me encuentro con esto, pero
teniendo en cuenta que las pruebas son para un sitio popular como Odesk… me
esperaba algo de mejor calidad…
Hola Mundo
Lamentablemente el concurso de hola mundos de CLD no le hizo justicia a mi versión, así que decidí mejorarla :).
hola-mundo.c:
#include <stdio.h>
#include <stdint.h>
int main()
{
uint64_t w = 0x29e4755a00b1e8;
for (int t = w >> 062; t--; w >>= 5)
putchar((w & 037) + 0100 >> !(w & 037));
putchar(w);
return 0;
}
Para compilar: c99 hola-mundo.c -o hola-mundo
¿Cuál es la diferencia entre un archivo .com y un archivo .exe?
Esta es una pregunta que me hicieron alrededor de Septiembre del 2008, bastante interesante ya que el chico era un recién iniciado. A continuación va una explicación un poco más extendida de la que di en su momento:
Los ejecutables .com son un formato muy simple, lo único que contienen es el código máquina a ser ejecutado, y están limitados a 64KB, tamaño de un segmento en modo real y modo virtual de x86.
Por otra parte, los .exe, poseen una cabecera, en este caso voy a explicar solo el formato MZ (uno de los tantos formatos en los que pueden encontrarse un .exe), que es el que se usa en DOS. Esta cabecera especifica unos cuantos parámetros, entre ellos uno bastante interesante, el punto de entrada, que indica desde donde se tiene que comenzar a ejecutar el programa, además los ejecutables MZ pueden estar divididos en secciones (aunque no necesariamente), lo que permite tener separadas las áreas de datos, la pila, y el código ejecutable, y debido a que permite varias secciones (limitadas al igual que los .com a 64KB, o sea un segmento) permite ejecutables mayores a 64K.
El formato es bastante simple, aquí les dejo una tabla:
Offset Cosa
------- -----
0000 Número mágico, permite identificar el formato. 1
0002 Tamaño del último bloque, en este caso 0 equivale a 512. 2
0004 Número de bloques que son parte del ejecutable. 2
0006 Número de entradas de reubicación al final de la cabecera. 3
0008 Tamaño de la cabecera en parrafos 4
000A Memoria adicional necesaria, en parrafos 5
000C Numero máximo de parrafos adicionales reservados. 6
000E Valor relativo de la pila. 7
0010 Valor inicial del registro SP.
0012 Checksum 8
0014 Valor inicial del registro IP.
0016 Valor inicial del registro CS, relativo al segmento donde fue cargado el ejecutable.
0018 Offset del primer ítem reubicable en el archivo.
001A Número de overlay9, normalmente 0, indicando que es el ejecutable principal.
001C Fin de la cabecera fija, comienzo de los datos y el programa.
Los valores multi-byte están en formato little-endian.
Aclaraciones:
- Puede ser 0×5A4D (MZ) o 0×4D5A (ZM), siendo más común la primera.
- El tamaño de un bloque es de 512 bytes.
- Puede ser 0.
- En x86, una palabra o word equivale a 2 bytes, mientras que un
parrafo equivale a 8 palabras, es decir 16 bytes. - Memoria no inicializada, equivale a la sección BSS en un programa para sistemas tipo UNIX.
- Permite limitar la cantidad de memoria extra que el sistema reserva al programa, de ser 0 se reserva toda la memoria
convencional disponible - Este valor es agregado al segmento en el cual fue guardado el programa, y con el resultado se inicializa el registro SS
- En realidad esto es un complementdo del checksum que se calcula de a 16bits en todo el archivo, de modo que el resultado sea cero.
- En algún otro artículo explicaré lo que es un overlay
Sobre la reubicación:
A diferencia de los ejecutables .com, un MZ puede ser cargado en cualquier posición de memoria, claro que, dado que en x86 la mayor parte de las instrucciones no permiten una referencia relativa, se usa la tabla de entradas de reubicación en la cabecera para editar el código del ejecutable, ajustando cada referencia a la posición en la que ha sido cargado, sumando la diferencia entre la posición preferida y la posición en la que fue cargado el ejecutable.
Un detalle no menor es que los segmentos siempre van alineados a un parrafo. Luego explicaré esto en más detalle cuando explique el direccionamiento en modo real de x86.
Porque C es bueno, y C++ no
En IRC, a veces durante las noches, la gente tiende a discutir de temas trascendentales, como el siguiente:
<h0cin> s/cicerón/Cicerón/
<Uma> h0cin quiso decir: Cicerón, pero no era un emperador
<fcr> chicharrón?
<h0cin> va con C por ser nombre propio
<ismaell> h0cin: va con C porque C es un buen compañero, no como C++ que anda discriminando con clases, herencia, y cosas por el estilo :P
<fcr> con razón que nunca aprendí C++
<h0cin> ismaell: C++ es muy interesado, siempre está orientándose hacia los objetos
<fcr> no creo en la lucha de clases, ni en la OOP
Procesadores de Texto vs LaTeX
Hace tiempo que tengo un libro guardado, por editar. Este libro es un manuscrito, que hace no mucho, una persona, con la mejor de las intenciones, lo transcribió usando un procesador de texto.
Lamentablemente el formato de este programa, así como el programa en sí no son los más aptos para el trabajo. Un buen ejemplo de esto es por un lado la falta de experiencia de la mayor parte de la gente que usa estos programas, que lleva a documentos con aberraciones como elementos alineados con espacios, o espacios verticales creados a base de párrafos vacíos, y muchos elementos mal usados…
Otras dos razones fundamentales para desaprobar esa edición fueron que en el formato usado, el de Microsoft Word, se ve diferente según el programa usado. Kword, OpenOffice Writer y Abiword lo muestran mal (probado con las últimas versiones), y obviamente tengo intenciones de usar software libre, así que solo eso ya lo descarta. La segunda es que ni el programa, ni el formato fueron diseñados para producir documentos bien estructurados, de calidad profesional, lo que me llevó a tener que empezar desde cero, ya que el archivo no era reutilizable, debido a todos los cambios necesarios.
Hay muchas otras razones para usar otra cosa, y hay muchas otras cosas para usar, entre ellas me gustaría destacar dos, DocBook, y LaTeX. El primero es un sistema basado en SGML, aunque hoy en día se usa específicamente XML, mientras que el segundo constituye un género en si mismo. Dado que muy a menudo se usa LaTeX como formato intermedio, y que DocBook es bastante más burocrático, prefiero el primero. Además, pocos motores producen documentos de la calidad conseguida por los motores de LaTeX.
En contraste con un procesador de textos, LaTeX permite concentrarse en el desarrollo del documento, sin distracciones respecto al aspecto del mismo; en ese aspecto, LaTeX se encarga de todo el estructurado, formateado, y tipografía por su cuenta, creando documentos de muy alta calidad.
Un buen ejemplo, que deja una diferencia notable entre las dos versiones del texto, es que en la versión en formato MS Word el cran es casi todo el tiempo inapropiado, sin embargo esto es ajustado de manera automática en LaTeX. Accidentalmente me encontré con que QT4 lo hace bien en las cajas de texto :).
Sin dudas lo que más me molestó en el texto en sí, fue el ver el texto mal alineado, pero especialmente el uso de los guiones, en el cual se usaba el mismo para todo, y las palabras que estaban cortadas manualmente y seguidas de un salto de línea, lo que provocaba que al cambiar el tipo de letra, el papel, o agregar texto, se rompiese completamente la estructura. A diferencia de un procesador de textos, LaTeX considera cada párrafo como un todo, y le aplica la alineación/justificación, saltos de línea y guiones, usando para esto último patrones específicos según cada lenguaje. Al romper una linea, toma en cuenta factores como número de líneas consecutivas con guiones, la separación entre palabras en cada línea, el cambio de separación entre palabras entre líneas consecutivas, y una correcta alineación del texto con los márgenes.
Pero vayamos también a una ventaja no tan obvia a primera vista, y es la completa separación entre contenido y estilo que nos permite. Esta ventaja puede no ser muy intuitiva para el usuario de procesadores de texto, sin embargo, es de extrema utilidad a la hora de componer un documento largo, ya que en lugar de formatear cada elemento independientemente, como pueden ser las cabeceras de los capítulos, se establece el formato de dicho elemento una única vez, que se aplica a todo el documento. En realidad, la mayoría de los procesadores de texto poseen características similares, sin embargo son rara vez usadas, y en general poco versátiles en comparación. Asimismo, LaTeX puede automatizar muchas tareas tediosas, como creación de índices, tablas de contenido, y bibliografías; cosa nada trivial en un procesador de texto.
También hay que considerar, que dado que el formato de LaTeX es básicamente texto plano, puede ser editado por cualquier persona sin necesidad de un programa específico, y dado que existen motores de LaTeX para la mayor parte de las plataformas en existencia, y que de no existir para alguna, es en general relativamente sencillo portar algún motor existente a dicha plataforma, del mismo modo que los visores para DVI y PDF (los formatos más comunes producidos por los motores LaTeX).
La flexibilidad que ofrece LaTeX es rara vez alcanzada en otros sistemas, ya que se puede considerar un lenguaje de programación, lo que nos permite realizar casi cualquier cosa imaginable. Encontrarán a su disposición multitud de paquetes que extienden sus funcionalidades en CTAN.
Una característica que no va a este caso en particular, pero que es de infinita utilidad a la hora de escribir documentos técnicos, y una de las mayores fortalezas de LaTeX, es la excepcional calidad que se consigue a la hora de introducir contenido matemático en los documentos.
A tomar en cuenta, es que cuando abrí el documento en formato MS Word, mi máquina amenazaba con no terminar más, ciertamente debido al programa usado, sin embargo, es excepcional la cantidad de memoria requerida por el mismo MS Word, lo que queramos o no nos ralentiza bastante todo. LaTeX por otra parte, al ser texto plano, es muy liviano, pero aún en el caso de que tengamos un documento demasiado largo, podemos partir el mismo en pequeños pedazos, que LaTeX luego combinará para crear el documento completo.
Una ventaja que, si bien no tan importante para el usuario promedio, puede ser un factor decisivo para una publicación profesional, es que LaTeX es muy maduro, robusto, estable, y le lleva años luz de ventaja a cualquier otro sistema. Siendo software libre, tenemos la garantía de que mejorará aún más en años venideros, de la mano de proyectos como XeTeX y LuaTeX.
Para los que quieran extenderse un poco más en el tema les recomiendo leer http://ricardo.ecn.wfu.edu/~cottrell/wp.html.
Finalmente, algunas recomendaciones:
Para editar los documentos, recomiendo usar editores de texto plano, específicamente aquellos orientados a LaTeX, como Kile (POSIX), TeXnicCenter (Windows), TeXmaker (POSIX / Windows) o en su defecto un editor gráfico estructurado, como LyX (POSIX / Windows).
Con respecto a las distribuciones de TeX, recomiendo MiKTeX para Windows, y TeX Live para sistemas POSIX.
