Y sigue la mata dando

Me reportaron que una pantalla que tiene cerca de 200 combos cargados de bases de datos, esta lenta y provoca pantalla en blanco en uno de los clientes del corporativo.

Load arriba de 2, solución obvia: Comentar esta línea
//if ( extension_loaded( «zlib» ) ) ob_start( «ob_gzhandler» ); // Habilita compresion. No mover si no se entiende.

Explicación:
El server no tiene suficiente cpu disponible para iniciar el zlib de php.

El uso que le está dando a ese server no es el originalmente planeado, y no toman en cuenta la sobrecarga que le está causando.

Otra vez los logs…

El 23 de mayo escribí acerca de tener archivos dentro o fuera de la base de datos :https://alfonsoorozcoaguilar.com/2011/05/23/archivos-dentro-o-afuera-de-la-base-de-datos/

El 4 de julio comenté que el tmp medía 23 gb. Lo borro cada semana.

Algo hicieron con los cambios de derechos que el tmp esta usando 58 gb de 120… y nose borran con miscript. Al limitar ejecuciones de llamadas a system desde php, los scripts de hace un mes tampoco sirven

Que bárbaros.

Lo bueno es que parece que mi versión propia de repositorio de archivos para corregir las deficiencias de cvs como subversion puede resolver esto por hoy.

Cosa rara con los passport de microsoft

Varios de los sistemas que he desarrollado se autentifican por CURL contra passport de microsoft.

Una de las dos claves que uso, no relacionadas con hotmail, no funciona. Probablemente desactivada por no entrar al messenger en esa cuenta. La otra lo usa incidentalmente cuando skype falla. Y son dos dominios desconocidos.

Interesante.

Sea l oque sea no usare la autentificacion por «passport de facebook» jamas.

Post, get y request

Una de las señales para mi, de que alguien no tiene experiencia programando con php, es el uso de request de manera indiscriminada.

El día de hoy, depurando un script del colegio, como parte del jquery que no me autorizan a rehacer, confirmé que el jquery pasa los datos via get, los lee un request (¿?) y finalmente hace la inserción en las doce tablas que pudieron ser una.

Ahora estamos teniendo un problema en la pc del socio técnico. En mis laptops y las del cliente funciona bien, pero parece que el problema debe ser de el largo de los gets que recibe por jquery, ya que el limite que yo recuerde no esta establecido por RFC (request for comments)o es muy bajo (1024), pero juraría que son casi 2048, y sus versiones optimizadas de firefox para linux deben tener el problema.

Basicamente asumo que como firefox tiene binarios diferentes en linux y en windows, es probable que la version linux si le haga caso a esos estandares, que el diseñador original no contempló y mucho menos el «programador» original.

Nota Aclaratoria 2013:

En respuesta a un correo que me mandó una persona el 22 marzo 2013, hago notar que , por lo menos según yahoo, lo que deben usarse son GETS y no REQUEST. Por principio de cuentas los POST son para poner información, pero llamadas a OBTENER información por default deben ser GET. Sin embargo, usar POST tiene sentido cuando no quieres que aparezcan parámetros en el log de navegación. Por ejemplo el sistema administraor de base de datos de un archivo usa adminer.php usa GETS lo cual es malo porque se guardan los passwords en el log de apache en texo plano.

El punto fino aqui es, que si pasas un get (parámetro en el URL), no vas a leerlo usando un request, es ilógico, tiene problemas de seguridad y claridad de código, se presta a exploits (parameter pollution donde un atacante puede sobreescribir parámetros GET con POST o cookie), y por lo general se usa para tratar igual POST que GETS, lo cual desde el punto de vista de programación WEB es absurdo en tiempos de SQL injection. No importa como lo pases, no lo pasas con un request, y si sabiendo que lo pusiste como POST/GET lo lees como request, habla de malos estándares.

Doce mil correos rebotados… y analizados… y algo fascinante

El Pasado Jueves vi que tres personas que ayudan al socio tecnico le estaban ayudando a analizar una serie de 12000 correos rebotados uno por uno, por parte del colegio de profesionistas. Le sugeri hacer un programa pero me dijeron que no.

Unas horas despues me dijeron que si, asi que hice un sistem que analizo el buzon imap para detectar porque eran rebotados los correos. Es impresionante lo IDIOTAS que pueden ser profesionistas. Correo como hayoo.com en lugar de yahoo, dominios imposibles (hotmail.es.mx) etc.

Hice el analisis y resolvi el problema, 11 mil el viernes y 1000 en la mañana, entregando una hoja de excel explicando renglon por correo, cuenta de correo rebotada, porqué , y tipo de bounces(hard, soft, etc). Sin embargo, me sorprender que sigan personas utilizando latinmail. Sería lo mismo que starmedia a estas alturas.

Despues nos quedamos sin internet ni luz por varias horas. Empezando mi trabajo normal de repente, me encontré un link fascinante sobre stuxnet (virus / malware especificado para dañar PLCs)

Es uno de los mejores textos de carácter técnico que he leído en mi vida:
http://www.wired.com/threatlevel/2011/07/how-digital-detectives-deciphered-stuxnet/all/1

Una Tienda Online en cuatro horas, mas unos extras

El viernes pasado me encargaron consolidar cinco formatos html en uno.

No era solamente eso. Necesitaban hacer que funcionaran. Era una serie de tipos de productos diferente segun la persona a la que se vendiera el mismo articulo.

Acabe creando un motor de tienda virtual para pagos de los cinco artículos, aunque aplicando las reglas de negocio.

Y mientras yo hice eso, recibí cinco correos de una persona a la que di soporte UNA SOLA VEZ el 31 de diciembre en el corporativo. Asi que he recibido por parte de el unos 300 a 400 mb de correo basura.

Hoy borré uno de 8, otro de 7 y dos de 6 mb… e iban dirigidos a CINCO personas del corporativo en su lista de correo basura.

Que diferencia de lo que se hace por un sueldo.

Ya era hora !

Me acabo de enterar que por fin van a hacer algo sobre el problema de punteros nulos en c++

Tomado de
http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/

nullptr
At last, C++ has a keyword that designates a null pointer constant. nullptr replaces the bug-prone NULL macro and the literal 0 that have been used as null pointer substitutes for many years. nullptr is strongly-typed:
void f(int); //#1
void f(char *);//#2
//C++03
f(0); //which f is called?
//C++11
f(nullptr) //unambiguous, calls #2
nullptr is applicable to all pointer categories, including function pointers and pointers to members:
const char *pc=str.c_str(); //data pointers
if (pc!=nullptr)
cout<<pc<<endl;
int (A::*pmf)()=nullptr; //pointer to member function
void (*pmf)()=nullptr; //pointer to function

Notas sobre Triggers en cascada MYSQL

El día de hoy tengo una labor medio extraña. Crear un reporte en un colegio de profesionistas, en una nueva pestaña de jquery existente (modificar en cuatro lugares y crear un nuevo archivo php), para poder sacar un reporte filtrado de personas interesadas en inscribirse a el.

El problema es que necesitan filtrar por fecha, pero la tabla no tenía rango de fechas.

De entrada ya metí un campo TIMESTAMP por default cuando entren nuevos datos, pero eso no arregla los problemas anteriores; evidentemente el diseñador de la base de datos original no lo consideró.

Lo ideal sería guardar sin cambios al sistema tanto la fecha de alta del registro (el timestamp ya lo hace), como la del ultimo cambio.

Solo puede haber una Timestamp on update, asi que elegí la de alta. Se podria manejar un trigger a una tabla que actualizara el dato mediante otro trigger al a tabla original (lo he hecho) pero este caso no se puede por una limitación de Mysql así que se van a tener que quedar con solo la fecha de alta, a menos que me paguen por cambiar el código ajeno para hacer el update de los cambios (y no guardaría si se cambia en phpmyadmin)

Considrar una de las limitaciones para MYSQL: Mysql no puede utilizar o desatar triggers para actualizaciones en cascada de llaves foráneas.

Trataré de explicar este problema.

En una empresa x en la que estuve trabajando hace unos años, bajo un motor SQL2000, el área de compras mandaba pedidos de los que después se retractaba o eran con otra fecha. Entonces no era raro que alguien pusiera un pedido con fecha de entrega del 17 de julio, por ejemplo, pero en realidad les fallaba el calculo y el 12 sabían que el 13 de julio se quedaban sin nada. Entonces era práctica común cambiar la fecha de entrega deseada, y era una habilidad perfectamente posible y clara : El 12 decía que lo necesitabn el 13, pero el error humano quedaba oculto.

En su momento contrataron a una de mis PYME para darle mantenimiento/cambios a ese sistema Cuando supe de este problema la función que yo tenía era hacer unos grids que manejaran radio buttons e iconos , pero el problema de cambios de fecha se les estaba saliendo de control.

Mi solución fue :

Triggers de insert, update y delete en todas las tablas de datos, apuntando a una base de datos diferente.

Para que esto funcionara, cada usuario debñia tener un usuario diferente, así que modifique el sistema para crear los usuarios al vuelo en la base datos usando los datos del login, y al salir borrar al usuario de la base de datos.

Ventaja extra: Incluso cambios directos desde el panel de control de mssql quedaban registrados.

Desventaja 1: Cambios a la estructura de una tabla implicaban borrar relaciones a mano, borrar triggers, rediseñar los triggers, recrear relaciones a mano. Un campo nuevo en tablas de vistas, podía tardar casi cuatro horas.

Desventaja 2: Esa base de datos usaba actualizaciones en cascada (lo cual me parece una estupidez por integridad referencial y problemas de borrado en cascada no deseado ), y eso no se hubiese podido hacer en mysql.

Problema actual:

la base de datos del colegio está en MYISAM, el sistema se mantiene por pincitas por unos queries que usan insert into, y hay borrados en cascada.

Probablemente usar un sistema de triggers funciona mejor con sistema ya probado y al que no tiene sentido cambiar la estructura. Otra es crear un creador automático de triggers al vuelo, que ya hice pero que dejé en stand by cuando recordé que Mysql no acepta triggers bajo ordenes en cascada

Automatizar sitemap

Encontré un problema serio en el diseño actual que se usa en la empresa. Básicamente no hay un sitemap que considere el grado de visibilidad o de nivel de acceso.

Y de repente me cae como un mazazo.

No hay herramientas para sitios web que lean robots.txt para hacer los sitemaps o por lo menos que te deje definir el alcance de visibilidad de los bots, lo que en ambos casos lo hace totalmente inutil.

Que estupidez.

Tampoco hay herramientas de sitemap que lean el contenido de una base de datos de un open source específico considerando la visibilidad (estar publicado o no ) y el nivel de perfil.

O sea que un sitemap multidominio y multirol, debe ser un access rewrite a un script php que lo considere.