Entradas de la categoría: ‘Programación’

Listado de posibles ataques XSS

Si os habeis sorprendido por todas las formas posibles de escribir Viagra, vais a alucinar con todas estas formas diferentes de hacer un ataque Cross Side Scripting.

July 2nd, 2008 by albinworld

Cuesta menos probar que pensar.

Escribo una función, la pruebo, no hace lo esperado, pienso, la cambio, pruebo, no hace lo esperado, pienso, la cambio, pruebo, no hace lo esperado, pienso, la cambio, pruebo, no hace lo esperado, pienso, la cambio, pruebo, … ups! si no estaba llamando a la nueva función sino aún a la antigua, cambio la llamada y funciona perfectamente.

Ostras! entonces, todos estos cambios que he hecho, sin ver realmente cómo fallaba, significan que podía haber escrito la función bien desde el principio toda de una …  :o? Todo menos pararse a pensar calmadamente desde el principio.

June 6th, 2008 by albinworld

Editor de ficheros Host y Estadísticas web en tiempo real

No entiendo que una persona gaste energías en hacer otro cliente de FTP, que no aporta nada, ni en usabilidad, ni en funcionalidades, …

Por otro lado, algunas personas realmente creen que pueden aportar algo, y presentan espectacularmente su producto de estadísticas web.

Y otras aún buscan utilidades que suplan necesidades específicas…

A raíz de haber aprendido a configurar VirtualHost en Apache, me había planteado lo útil que sería un programa que te facilitara editar, activar y desactivar líneas, en el archivo host de Windows, para probar dominios en local como si estuvieran en real. Y justo este lunes, lo encuentro en Genbeta, un Editor de ficheros Host.

March 13th, 2008 by albinworld

Relaciones : Vistas vs Trigers

El título puede resultar raro pero es que la idea -reconozco que- es un poco rara en sí misma.

En resumidas cuentas, para no complicarlo más de lo necesario, … ¿Creeis, o en qué circustancias creeis, que puede ser ventajoso tener una tabla con el resultado de una vista, para consultarla en lugar de consultar la vista?

Es decir, tener un conjunto de tablas relacionadas, con un triger que cuando sucede algún Insert, Update, o Delete,  vacían una tabla común y la rellenan con el resultado de la relación de estas tablas.

Principalmente me saltó la duda porque tengo una tabla de Municipios, una de Provincias, una de Paises, y una de Comarcas, lógicamente todas relacionadas entre ellas, y no son datos que cambien a menudo, como mucho añadimos algún municipio de vez en cuando, y me pregunto si tiene sentido estar consultando siempre una vista con todos sus inner join cuando el resultado es el 99.9% de las veces el mismo … y me planteaba que t_Municipios incluya sComarca, sProvincia, sPais y se rellenen con un Trigger …

February 27th, 2008 by albinworld

En qué se parece XUL a Java

Algunas personas, por circustancias, nunca hemos prestado a Java toda la atención que merece, aunque ha sido un lenguaje que siempre nos ha caido bien, creo que todas las personas que le dan una oportunidad, perciben de algún modo lo bien hecho que está.

Sin embargo, aunque toda su parafernalia de Look&Feel sea un excelente ejemplo de programación orientada a objetos, creo que nadie me discutirá lo excesivamente básicos que resultaban sus primeros LayoutManager. Luego JGoodies lo mejoró y luego hablé de Matisse que también ayuda a construir un UI decente.

Esta tarde he estado echando un vistazo a XUL y he tenido la sensación de que estaban dando los mismos pasos. Supongo que es lo correcto, parece óptimo para asegurarse que se ve igual entre plataformas, y es útil tener un layout que ponga una cosa junto a otra, pero … era tan igual a Java, y al mismo tiempo tan diferente a XHTML-CSS … qué sensación más curiosa.

January 27th, 2008 by albinworld

La política del Copy-Paste

¿Qué pensarias, si veis el código de una página que, para listar 10 registros hace 11 consultas a la base de datos? Una para obtener el identificador de los registros a mostrar, y otra para cada identificador/registro.

a. Que el programador es un escéntrico

b. Que el programador no tiene ni puta idea

c. Que el programador es un genio

Os voy a explicar en qué caso la respuesta c es la correcta. Pero primero, dos pregunas más.

¿Qué pensarias, si ves el código de una página que, para listar 10 registros, hace una consulta que devuelve 42.358 registros de casi 8 Kb cada uno (casi 330 Mb)?

a. Que el programador no tiene aprecio alguno por el hardware

b. Que el programador es un descuidado

c. Que la base de datos no ofrece manera de evitarlo

La respuesta correcta es, nuevamente, la c. Porque mientras que MySQL tiene la posibilidad de solicitar el rango de registros que vas a mostrar en un listado paginado (LIMIT), esto no es completamente posible con SQL Server 2000. Pero aún se pone más interesante …

¿Que pensarias, si ves el código de una página que, despues de traerse casi 300 Mb de registros, los mete en un array en memoria?

a. Que el programador esta mosqueadisimo con el departamento de administradores de sistemas

b. Que el programador obtuvo su calificación en una tómbola

c. Que el programador esta utilizando un componente sin saber qué hace ese componente

Pues para no variar, la respuesta correcta es la c.

La explicación.

Un buscador realiza consultas sobre una tabla con más de 100.000 registros, aunque el máximo que puede recuperar (debido a un filtrado mínimo) son algo más de 42.000 registros.

Se componía una consulta tal como “SELECT * FROM v_Whatever WHERE …” que básicamente tenía dos problemas:

1. No eran necesarios todos los campos que devuelve

2. La vista realizaba internamente un “cast” de dos campos tipo “text”, que además no se usaban en el listado.

Luego se utilizaba para recuperar estos registros un componente que permite paginar el listado, y que para su propia comodidad (a la hora de saltar de un registro a otro) utilizaba la función GetRows de ADO que vuelca los registros a un array.

Después de un poco de investigación, y de inspiración divina -lo confieso-, la solución ha sido construir una consulta tal como “SELECT idRegistro FROM v_Whatever WHERE …” y después dentro de la iteración del listado, hacer una consulta tal como “SELECT * FROM v_Whatever WHERE idRegistro=…” que aún prodía mejorarse con un “WHERE idRegistro IN (…, …, …)” pero … bah! atomarporculo, así va bien.

El resultado más apreciable es una página que carga muuucho más rápido.

La moraleja.

Me considero un desarrollador bastante convencido (debe ser la edad) de la reutilización, pero recurrir al copy-paste sin cuestionarselo, y sin curiosidad, es jugársela.

Y eso que tenemos en la pared el siguiente recorte:

“Do you chew gum you find on the street?”

También he de decir, al margen del tema principal, que aunque me gusta la reutilización, también me gusta la evolución, con lo cual cuando utilizo un componente que he desarrollado, no me pregunto solo si cumple mis necesidades, sino también si puede mejorarse para la ocasión, o qué aprendí de la última vez que lo usé, con lo cual, al final, reutilización-reutilización no hago casi nunca :o) jejeje.

January 11th, 2008 by albinworld

Transgresión al Gestor de Contenidos

He hecho una web para una amiga que tiene una constructura (Procerper). Lo mas rompedor no han sido las animaciónes con jQuery, ni ha sido el gestor de contenidos, sino su ausencia.

Página maquetada en 8 o 10 horas. Cuando quiera un cambio, que me mande un mail. Si edifican una o dos fincas al año, para qué quieren herramienta de actualización. Aunque gaste 30, 45, o 60 minutos en cada cambio ¿Cuantos cambios harán falta para superar lo que hubiera costado hacerle una herramienta, una base de datos, explicarle cómo funciona, estar pendiente de hacer backups puntuales, … ? Que no, mira, que no, que a veces hace falta probar otras soluciones, hacer alguna locura, liberarse de costumbres, cuestionarse el porqué … de momento, a parte de ser todo un “puntazo retro”, está siendo una “liberación”, que quiere mas textos, pues abro el php y meto mas textos, ¿ves? así no echo de menos campos que no consideré poner en la bbdd, que en una quiere una sección más, pues pongo el link y creo el .php con los contenidos y atomarporculo …

January 10th, 2008 by albinworld

Añádeme a tus favoritos, es por tu bien.

He cogido un periodo “normal” (sin estar pagando Adwords, sin que hubieran vacaciones, …) de mitad de Noviembre del proyecto de Gramática Alemana, y con estos datos me hago una interesante pregunta:

En 3 semanas hubieron 1308 visitas, de las cuales 262 fueron reincidentes, y 99 fueron visitas directas, de estas últimas, 34 fueron reincidentes, es decir, el 13% de los reincidentes vienen escribiendo la URL (o bookmark), el 87% restante me vuelven a buscar.

La medida de páginas visitadas por cada reincidentes es de 9 … por lo tanto … ¿Tiene sentido contar cuantas páginas lleva visitadas un usuario, y a partir de 6 páginas, ofrecerle que me meta en su bookmark con un banner-animación estilo Antena 3? (algo que surge a los pocos segundos de la carga de la página y solapa una porción discreta pero resultona del texto).

¿Cuanta gente no supo buscarme de nuevo, o se despistó en otro enlace?

Parece pasado de moda eso de “pulsa aquí para meterme en tus favoritos”, o más propio de sitios con pornografía, pero … en este contexto, yo creo que estaría bien, no?

January 9th, 2008 by albinworld

Se busca: motor de base de datos.

No estaré los próximos días, pero podeis ir dejando alguna sugerencia.

Requisitos:

  • Que sea gratuita, da igual si no es opensource (esto descarta MS SQL Server).
  • Que permita más de una base de datos (esto descarta Oracle Express).
  • Que permita generar consultas dentro de los SP y devolver los resultados de dicho SELECT (esto descarta MySQL y HSQLDB).

He intentado probar DB2 Express-C 9.2 pero la instalación ha sido un desastre en un Win XP, y he probado en Win 2003 Server pero necesita SP1 el cual necesita que mi clave de producto no sea pirata -ejem- … igual cuando vuelva pruebo en un Ubuntu, pero Linux siempre me fustra.

December 29th, 2007 by albinworld

Más que una tabla es un tablón.

Un día necesitas cuatro campos para guardar una cosa, otro día necesitas dos campos para guardar otra cosa, otro día necesitas guardar más cosas y te creas unos cuantos campos más … un día dices “madre mía, siempre me cuesta un huevo encontrar aquí las cosas”, otro día dia dices “voy a contar los campos que hay” … 200 campos en una sola tabla, con dos cojones, si señor.

Pues nada, habrá que buscar un rato para partirla, tocar los stored procedures para que modifiquen cada campo en la tabla donde pase a estar, crear vistas que junten lo necesario para cada situación, … cruzar los dedos, poner un cirio, santigüarse (creo que no había escrito esta palabra en mi vida) … y a la pisicina, como un valiente.

December 28th, 2007 by albinworld

Una idea para desarrollar

Son múltiples las ocasiones en que permitimos la subida de ficheros al servidor.

Normalmente son imágenes, o ficheros PDF. Normalmente no va a realizarse ningun tipo de “ejecución” sobre ellos. Y normalmente los servidores tienen antivirus.

Pero quizás podría utilizarse la base de datos de algún antivirus GPL como Moon Secure Antivirus y hacer una librería que permita comprobar si el fichero uploaded tiene virus. No estaría de más, no?

Dim av as Antivirus
Dim path as String = Server.MapPath("justuploaded.pdf")
if av.check(path) then
System.IO.File.Delete(path)    ' Sin contemplaciones.
else
...
end if

December 4th, 2007 by albinworld

Cómo registrar accesos a descargas o páginas llamadas en background

A vueltas con el tema “cómo registrar la actividad del usuario en una página basada en AJAX” resulta que usmeando por código ajeno me he encontrado una grata sorpresa. Al introducir el código de Google Analytics en una página queda disponible para tu usufructo una función que te permite contabilizar accesos a otras páginas que cargues con AJAX, sin trampa ni cartón.

document.getElementById("aDownloadPDF").onclick = function() {
urchinTracker("el-usuario-solicita-un-pdf");
...
return false;
}

Esto hará que en las estadísticas aparezcan visitas a esa página, como si existiera y se hubiera cargado. Ahora, el tiempo de pemanencia en esa página será (o debería ser) cero patatero, supongo que también aparecerá como página dónde la gente abandona tu web, y otras consecuencias … pero supongo que en algunos casos es mejor eso que nada.

December 1st, 2007 by albinworld

Los 10 intentos testarudos de la informática.

Últimamente se ha hablado sobre los 10 errores tecnológicos más importantes de la historia, sobre los 10 peores productos de software de la historia, incluso no hace mucho me pasaron los 10 grandes fracasos del hardware (paso de ponerme a buscar).

El caso es que acabo de leer sobre un plugin para Firefox 3 que permite un objeto Canvas 3D accesible mediante Javascript. Y me ha hecho pensar cuantas veces se ha tratado de llevar el 3D a la web.

Y cuantas veces se ha intentado dar cancha al reconocimiento de voz. Y cuantas veces se ha intentado llevar internet a la TV (parece que finalmente será al revés, la TV en el ordenador a través de internet, y el media center cerca de la TV de verdad para verlo en grande desde el sillón). Y cuantos sistemas de identificación únicos (21 comentan) …
Pues ¿Qué pensabais que lo iba a publicar yo? A ver quién se curra un listado de los 10 intentos más testarudos de la informática en general.

November 29th, 2007 by albinworld

Análisis a Google Analytics

He creado un subdominio secret.topsecret.tld y he realizado diferentes accesos para testear Google Analytics. Estas son mis conclusiones:

¿Funciona Google Analytics en tiempo real?

No. Entro, salgo, espero, refresco, y no aparece mi visita.

La prueba se hizo sobre las 14h. Españolas, y la visita se reflejó sobre las 17h. lo cual tampoco concuerda con la media noche de ningún huso horario “lógico”.

Si elimino un filtro ¿Aparecen las visitas que se hicieron y fueron filtradas?

Sí, aparecen de nuevo. Así que no puedes ir poniendo y quitando el filtro de tu propia IP cada vez que esta cambia, no sirve de nada.

¿Cómo se mide el tiempo de permanencia de una visita?

Esta es una pregunta bastante interesante que me hacía desde hacía tiempo. Los sistemas basados en analizar logs no saben cuando te marchase de la página, solo saben cuando solicitaste otra, pero esto también pudo ser en una pestaña, con lo cual, sus datos son medias y especulaciones. Sin embargo, Google Analytics está basado en Javascript, y tiene acceso al evento onUnLoad, con lo cual esperaba que sus datos fueran más exactos y reales.

Esto es especialmente importante para páginas con mucho contenido, que puede tardarse varios minutos en leerse, y para páginas con mucha funcionalidad basada en AJAX dónde el usuario puede pasar varios minutos sin haber recargado la página que contiene el código de Analytics.

La respuesta es: Ni puta idea. Porque el tiempo que midió no coincide, ni con el tiempo que existió esa pestaña, ni con el tiempo que estuvo en primer plano, ni con el tiempo que estuve interactuando con ella (haciendo clicks en ciertas zonas que se recargan con AJAX, no sobre espacio en blanco como un bobo).

Otras interesantes preguntas que se desprenden son: Dado que el Javascript se ha vuelto tan poderoso y puede un objeto nativo ampliarse con funciones definidas por la página, ¿Intercepta Analytics las peticiones AJAX para contarlas como páginas visitadas? Si se basa en el lanzamiento del evento onUnLoad para calcular el tiempo de visita, ¿Cuanto dura mi visita si me dejo la pestaña abierta y me piro a jugar un partido de Tenis?

Las respuestas son: No, en ningún momento me ha aparecido como visitado un script PHP que sea ejecutado mediante AJAX. Y como he dicho antes, no tengo muy claro cómo tantea el tiempo que ha durado tu visita.

November 27th, 2007 by albinworld

El Quick Time Player y sus efectos paranormales.

En general, es un player que siempre ha tenido comportamientos realmente curiosos. Por ejemplo, si tienes un navegador con un object reproduciendo un VR y solapas esa ventana con cualquier otra, al pasar el puntero sobre la zona donde está el QTPlayer escondido, el puntero cambia somo si realmente pudieras interactuar con él. También he tenido problemas de poderlo reproducir únicamente en el monitor principal (cuando habían dos monitores con dos gráficas, no desde que una gráfica puede tener dos monitores).

Pero el colmo ha sido que, si trato de usar el más que recomendable script de Granny Smith para activar objetos ActiveX, a veces pinta y a veces no pinta la barra inferior con los botones …
Realmente está siendo una odisea conseguir que aparezca el player activado, estoy por preguntar a Microsoft cuanto valen esos royalties y se los pago yo … ¿Qué les faltará dinero en la empresa?

October 11th, 2007 by albinworld

Personalizando el WordPress

Tal cual lo descomprimí, lo configuré, y lo he utilizado durante … una jartá de tiempo.

No serían más de las 15.00 horas cuando me ha trincado mi hermano, que ha contratado el hosting gratuito que comenté hace unos días, porque tenía el capricho de crear una web de chistes estilo “se abre el telón”, y me ha tenido ahí hasta las 21.30 horas que son, modificando el theme. Bueno, para no mentir, me ha dejado tomarme un sabroso helado de chocolate y nata a eso de las 19.15 horas, con derecho a pegar una meadita después -no mientras-. Nos quedan algunos flecos, y queremos poner algún plugin más a funcionar, pero … aún así me ha parecido un logro. No teníamos ni diseño, y los primeros bocetos, más que dar ganas de llorar, daban ganas de vomitar.

Total … que a veces, lo que no harías para tí, lo acabas haciendo para otros, pero ahora que lo tengo controladillo, no descarto personalizar un poco el aspecto de este blog.

Es más facil de lo que me pensaba. Tampoco es que pensara en realidad, simplemente temía instintivamente tener que comprender y modificar consistentemente las capas y estilos creados por otros, a saber qué retorcidas mentes han creado tan compleja estructura.

Los estilos originales, los he borrado directamente, y después, según veía las capas que aparecían, iba creando los estilos necesarios. He puesto capas de mi cosecha. He decidido no reutilizar algunos “id” que se reutilizaban. He capado el plugin de los votos para que no tirase su propio css y centrar así todos los estilos en mi hoja … en fin, que me he involucrado bastante a toquetear. Lo siguiente, quién sabe, … hacer mi propio plugin que haga alguna cosa trivial …

October 9th, 2007 by albinworld

MySQL - Exportando procedimientos almacenados al servidor de hospedaje (II)

Ya comenté hace tiempo cómo exportar un stored procedure al servidor dónde tienes contratado el hosting, requisitos: acceso directo al servidor MySQL. Pero qué pasa si has seguido mi consejo sobre Hosting Profesional Gratuito -o si de cualquier otro modo- has acabado en 1and1 -u otro Hosting Provider- dónde no se puede hacer semejante cosa …

Aunque “DELIMITER” es una palabra reservada a partir de MySQL 5.0, si utilizas PhpMyAdmin y tratas de ejecutar en la pestaña de “SQL”

DELIMITER $$
DROP FUNCTION IF EXISTS `newsletters`.`f_inGroup` $$
CREATE FUNCTION `f_inGroup`(nUser int, nGroup int) RETURNS tinyint(4) BEGIN
DECLARE yon TINYINT;
SELECT count(*) INTO @yon FROM t_usersgroups WHERE idUser=nUser AND idGroup=nGroup;
RETURN @yon;
END $$
DELIMITER ;

Te dirá que tienes un error de sintaxis en “DELIMITER”

Así que me he tenido que construir (no prometí que fuera muy usable) un pequeño fichero php:

$sql  = "";
$sql .= "DROP FUNCTION IF EXISTS f_inGroup";
mysql_query($sql, $dbLink) or die("Error :: ".mysql_error($dbLink)." :: ".$sql);
$sql  = "CREATE FUNCTION f_inGroup (nUser int, nGroup int) RETURNS tinyint(4) BEGIN n";
$sql .= "DECLARE yon TINYINT; n";
$sql .= "SELECT count(*) INTO @yon FROM t_usersgroups WHERE idUser=nUser AND idGroup=nGroup; n";
$sql .= "RETURN @yon; n";
$sql .= "END n";
mysql_query($sql, $dbLink) or die($sql);

¿Porqué funciona mejor esta solución? o simplemente ¿Porqué funciona? o ¿Qué te hizo pensar que funcionaría? (en este caso, gracias por no considerarme un desesperado que prueba cualquier cosa).

La necesidad de usar DELIMITER surge de separar lo que son consultas puntuales, de conjuntos de consultas. En verdad, la declaración de un Stored Procedure o una Function o un Trigger podría detectarse al encontrar un END que cierre el BEGIN con el cual empezó todo, pero como es costumbre en MySQL que exista un caracter que indique al parser “hasta aquí” pues se encontraron con este problemita, y se debió proveer una manera de establecer un segundo caracter (o conjunto de carácteres) que dijeran “punto final”.

Bueno, una vez entendido esto, esperas pacientemente a que una vocecita interna te diga “cuando haces un mysql_query no necesitas poner el punto y coma final, porque se entiende que cada ejecución de esa función es un comando por si mismo” entonces se enciende la luz de idea, ese momento mágico en que el sislogismo se completa sin ser conscientes del razonamiento intermedio, bien por el subconsciente, e imaginas cómo todo ha subido un nivel en una jerarquía imaginaria, y te dices “si no necesito un punto y coma para separar los comandos, ya no necesito un DELIMITER que indique el final del comando, y puedo usar el punto-y-coma tan tranquilamente para separar las instrucciones internas del Stored Procedure, Function, o Trigger. Pruebas, y cuela.

Y mientras escribes en tu blog, porqué el día parece más soleado, te das cuenta que seguramente hubiera pasado lo mismo de haber puesto el contenido de $sql en la pestaña de SQL del PhpMyAdmin … porque seguramente lo que hará es recuperar el contenido del TextArea y lanzarlo con un mysql_query … pero esa experimentación la haré otro día, para que no se pierda la curiosidad.

October 9th, 2007 by albinworld

Un diagrama gracioso de informáticos

“A mi me lo han pasado” frase típica cuanod llegué a este curro.

El diagrama.

September 24th, 2007 by albinworld

Visual Studio 2003 olvida guardar con codificación UTF-8

Ese ha sido mi problema durante … 3 años.

Configuraba el web.config para que las cabeceras indicaran como codificación UTF-8

<globalization requestencoding=”utf-8″ responseencoding=”utf-8″ />

Guardaba mis ficheros .aspx como UTF-8 y todo funcionaba ricamente. Pero a veces, abría un ASPX para hacer un cambio y al guardar, podía ser que siguiera siendo UTF-8 con firma, o puede que inconscientemente pasase a ser UTF-8 sin firma, con lo cual salían mal los acentos en la web … y tenía que volver a abrirlo, y hacer varios clicks (guardar como - pestaña guardar - guardar con codificar - decir que si lo quiero reemplazar - elegir la codificación - aceptar) … hasta que el otro día por fin encontramos DONDE COÑO se configura eso … ¡en el web.config! no lo hubiera pensado en la vida, que una característica del editor se configurase en un fichero del proyecto WTF!

<globalization requestencoding=”utf-8″ responseencoding=”utf-8″ fileencoding=”utf-8″ />

Bueno, llevo unos días probándolo y parece que es la solución … justo cuando parece que migraré a Visual Studio 2005 en cualquier momento …

Eh! qué pasa? en esta empresa somos así … a nuestro ritmo … que lo prueben otros primero, por si da cancer …

September 24th, 2007 by albinworld

Las rosas son rojas

Del libro “The Faerie Queene” de Sir Edmund Spenser que data de 1590 nada más y nada menos, se ha extraido popularmente el siguiente poema:

Roses are red,
Violets are blue,
Sugar is sweet;
And so are you

Este poema ha aparecido en repetidas ocasiones, sufriendo algunas modificaciones, a destacar una canción de un grupo escandinavo llamado Aqua

Roses are red and
Violets are blue
Honey is sweet,
but not as sweet as you.

Hace tiempo me hice mi propia versión, versión Geek.

Roses are #FF0000
Violets are #0000FF
and my love points to null
without you.

Fuente: Wikipedia

September 17th, 2007 by albinworld