Este es un pequeño programa en C para extraer modelos 3d de archivos ANZ. Como sólo necesitaba la geometría, el formato de salida elegido es Wavefront OBJ, que está muy extendido entre los editores 3d. Por eso, este conversor no extrae huesos ni pesos, sólo las mallas, posibles texturas embebidas y sus UVs. Aún así, muestra información acerca del esqueleto y las animaciones si las hay.
AngularJS, mysql, google maps y demasiados datos
AngularJS es una opción estupenda a la hora de escribir una aplicación interactiva; está diseñado para vigilar los cambios en la vista y reaccionar inmediatamente. Cuando se trata de hacer una página que funcione como un programa, el diseño es muy rápido y moderadamente sencillo.
Para una demostración de Los Nombres de Europa, de Alberto Porlan, escribí esta pequeña aplicación (que está desactivada en estos momentos) hace unos meses. Se presentaron varios problemas: para empezar, la base de datos de topónimos hubo que extraerla de un mdb de access que tiene aproximadamente 850.000 entradas. Para hacer más sencilla la búsqueda, convertí los topónimos a un sistema simplificado usando enteros en base 3 usando un script de perl y depurando las excepciones. por otro lado, cada búsqueda implica el cálculo de todos los topónimos cercanos, teniendo en cuenta que es una distancia topográfica y no sobre un plano recto, lo que la hace mucho más lenta. Por último la representación en un mapa de google dio sus problemas; la documentación brillaba por su ausencia.
En un futuro añadiré una búsqueda relacional por tres atingentes y un sistema de estadísticas, que muestren los datos de topónimos relacionados por áreas de la península.
Cálculo de distancias
Para hallar la distancia entre dos puntos topográficos (a vista de pájaro) hay que tener en cuenta la curvatura terrestre. En este caso he usado la fórmula del haverseno, ya que permite un cálculo lo suficientemente preciso sin tener que recurrir a algoritmos mucho mas lentos.
CREATE FUNCTION geo_distance(lon0 DECIMAL, lat0 DECIMAL, lon1 DECIMAL, lat1 DECIMAL) RETURNS DECIMAL(3,4) BEGIN DECLARE distance DECIMAL(3,4) DEFAULT 0; SET distance = 6372 * 2 * ASIN(SQRT(POWER(SIN((lat0 - lat1) * PI()/180/2),2) + COS(lon0 * PI()/180) * COS(lat1 * PI() / 180) * POWER(SIN((lon0 - lon1) * PI()/180/2),2) )); RETURN distance; END;
nota: El valor 6372 es el radio terrestre medio en km, suficiente para la precisión que se necesita para esta aplicación.
Este procedimiento es rápido, pero se puede mejorar el rendimiento total de una forma muy simple si sólo lo aplicamos entre los valores aproximados, filtrando por sus coordenadas de una forma aproximada:
SELECT *, ... FROM temp_table JOIN temp_table1 WHERE (LON_ROOT BETWEEN temp_table.LON - 0.25 AND temp_table.LON + 0.25) AND (LAT_ROOT BETWEEN temp_table.LAT - 0.25 AND temp_table.LAT + 0.25) HAVING ...
Renombrar archivos con caracteres especiales
Cuando se crea un archivo con determinados caracteres especiales, puede llegar a ser dificil eliminarlo o renombrarlo. Si el archivo se ha copiado desde internet o desde un dispositivo externo y el conjunto de caracteres establecido en el sistema es UTF-8, generalmente no hay problema; se puede acceder a él desde el entorno de ventanas o la terminal. Pero si se ha generado automáticamente (al ser descomprimido, por ejemplo), linux no reconocerá los caracteres y no se podrá leer ni eliminar.
La solución es acceder a él usando una terminal mediante su nodo, evitando el problema que supone usar su nombre.
(一般コミック) [大友克洋] AKIRA 第01巻.zip
Este archivo se ha creado en windows. Al copiarlo conserva los kanji japoneses y KDE permite operar con él normalmente, pero al descomprimirlo aparecen otros archivos cuyos nombres no son interpretados como válidos
?????S?t????1_????.png
?????S?t????1_?-??.png
?????S?t????1_???-?+??.png
?????S?t????1_???-????.png
?????S?t????1_???-?-??.png
Usando find se puede acceder a ellos y cambiar su nombre.
Para cambiar uno sólo, primero se obtiene su índice de nodo con ls -i
$ ls -i
12323499 ?????S?t????1_????.png
12323351 ?????S?t????1_?-??.png
12323581 ?????S?t????1_???-?+??.png
12323418 ?????S?t????1_???-????.png
12323479 ?????S?t????1_???-?-??.png
Despúes usando find…
$ find . -maxdepth 1 -inum 12323499 -exec mv '{}' ./akira_01.png \;
Y el archivo cambia de nombre.
Para cambiarlos todos en masa, asignando un número incremental
$ let c=0; \ for i in `ls *.png -i|cut -d ' ' -f1`; do let c=c+1 ; \ find *.png -maxdepth 1 -inum $i -exec mv '{}' ./AKIRA_01_$c.png \; ; \ done
Los archivos quedan como
AKIRA_01_1.png
AKIRA_01_2.png
AKIRA_01_3.png
AKIRA_01_4.png
AKIRA_01_5.png
Atención: hay que tener en cuenta que el penúltimo ; termina la orden dada con exec, así que si no se añade, bash devolverá un error de find: falta el argumento de `-exec’. Además es conveniente añadir el caracter de escape \ para prevenir posibles efectos derivados de la interpretación de los caracteres especiales.