Historia larga pero parecida a cuestiones del presente.

Hace unos años me encargaron un proyecto específico por nómina de tiempo determinado (menos de dos años) que debía correr en mysql y en MSSQL por lo menos. Se hicieron una serie de documentos al respecto; el documento 3 era la transcripción de una serie de preguntas que hice, alrededor de 25, sobre unos puntos finos de negocio. Las preguntas eran breves, concisas y el cuestionario lo hice revisando con un conocido que es experto en ese giro de negocio.

El que era mi jefe inmediato y director de esa empresa, me contestó todas las preguntas y como buen profesional lo puse por escrito y se lo mandé para su Visto Bueno. Tres meses después resultó que esas preguntas, tres o cuatro de ellas estaban muy mal contestadas, se había perdido un mes y medio de trabajo de dos personas en eso. Hizo berrinche, cambió el organigrama y me puso bajo las ordenes del área de desarrollo de ASP, solo que yo debía hacer este software en php.

Ok.

No me dieron datos de servidores de acceso (mssql y mysql), hice un memorandum, lo envie por correo a tres personas, y dije que de manera temporal iba a usar dos sitios mios, para hostear el proyecto y hacer las pruebas.

Hubo una junta especialmente ríspida. Va un antecedente.

Me acuerdo que el lunes y martes de esa semana me pusieron a explicarle al Gerente de Ventas (vendedor de unos 35 años) lo necesario para un sitio web (querían vender hospedaje web , y su idea era entre otras cosas que yo les ayudara a preparar los servidores ). Recuerdo que le expliqué a esta persona que un sitio web normalmente con acabados bien hechos (tipo rojointenso.net o garradejaguar.org ) normalmente el diseño se puede hacer en x costo, se configura un CMS , o se hace un diseño y logos en photoshop. Asi que cobrando por un año , incluyendo diseño, servicio del sistema que estabamos haciendo, podía venderse en unos 9000 sin mucho problema, mas nuestra licencia. (Es lo normal cuando manejas bases de datos de tienda online, otros casos hasta 3000 es muy buen precio en cuanto a la ganancia que deja si tus costos son marginales)

Su presupuesto que me mostró el miércoles, para una ferretería muy grande era de …. 35 mil pesos por el sitio. Esta persona metió en sus cálculos el precio de depreciación de mi pc, del becario que iba a hacer los logotipos, de la maquina del becario, de la gasolina de ver al cliente, de los sueldos promedio… Y no consideraba el precio real del hospedaje en server, que no teníamos.

Ese mismo día me dice:

Dice el jefe (el director de la empresa)que si mientras haces el sistema puedes enseñarle al becario X como se programa para que el haga el siguiente.

¿?

Le dije:

Si pero se multiplica el tiempo por 2. Esta persona me va a distraer y además tengo que verificar que sepa lo básico del lenguaje y de servidores, y el sistema de programación de Pair programming ( http://en.wikipedia.org/wiki/Pair_programming )necesita dos programadores de la misma capacidad, así que lo que puedo hacer es un poco de Extreme Programming (http://en.wikipedia.org/wiki/Extreme_programming), pero al mismo tiempo dar curso de parvulitos. De momento estoy usando RAD http://en.wikipedia.org/wiki/Rapid_application_development pero no puede trabajarse en RAD y enseñarse a la vez.

A final de cuentas Entre las preguntas de sitio y similares, hablé con el de ventas unas ocho horas.

El jueves presenté mi avance y el director de la empresa me empezó a reclamar por no haber avanzado las metas del mes. Le mostré que las metas a seis meses las había cumplido al segundo mes, y que las metas del año iban, A LOS TRES MESES, en un 60 %. Se enfureció cuando le expliqué que no podía mantener el ritmo de trabajo normal, si me ponían a enseñarle a alguien que no tenía experiencia (por entonces yo tenía unos 16 años de experiencia), y que evidentemente no iban a poder obtener la misma calidad, para que lo manejaran en sus tiempos.

Junta explosiva de berrinche por el sujeto

El viernes el director de ese corporativo (dedicado al ramo de seguros) me pidió moderar la junta semanal, del lunes, lo que implicaba hacer la minuta y orden del día. Esa junta era independiente de todo lo demás.

En la junta del lunes, el director del corporativo nos informó que iba a haber un cambio de jugada, y en pocas palabras, que no nos sintiéramos mal. Que una vez termináramos los objetivos del año , (que yo llevaba en un 60%) iba a haber un aumento de sueldo de 25%.

Se puso por escrito (parte de la minuta).

El cambio de jugada consistió en quitar de los objetivos del año varias cosas. Y en ese momento mi proyecto pasaba a estar 90%. Dijo claramente que no iban a haber cargas de trabajo de esos proyectos, y que el aumento se hacía en cuanto se acabara.

Hice la minuta, la pase a firma (firmaron mi jefe directo, el director de la empresa, contralora, etc); me puse a trabajar en el 10% restante, y el miércoles de la siguiente semana estaba terminado, probado, autorizado por el usuario final.

Dos semanas después dela junta que moderé, el usuario final llevaba una semana usando el sistema, habiéndome autorizado que el sistema cumplía lo necesario de las especificaciones; el documento de liberación iba con copia al director del corporativo.

Un jueves, para celebrar el cierre del proyecto me invita a comer mi jefe (no el director de la empresa ni del corporativo, sino el gerente de desarrollo), y supe lo que iba a pasar. Así que me preparé a pagar yo la comida (por lo que iba a pasar al dia siguiente segun yo), fuimos a comer a las cuatro de la tarde al bife del padrino que estaba cerca de plaza galerías. El se puso hasta atrás, pero antes pude hablar acerca del próximo proyecto. Recuerdo que me dijo que le gustaba mucho mi manera de trabajar, pero que el problema de el directivo de la empresa era que sus utilidades dependían de otra cosa, y que yo hiciera el proyecto en menos de cuatro meses cuando era de un año lo había puesto en ridículo, y considerando que al principio se había perdido un mes, era peor.

Pagué yo. Era poco después de las siete PM, y Recuerdo que fueron poco mas de 1400 (no llegaba ni al 10% de mi sueldo). El valet Parking llamó un taxi, lo pagué e hice que llevaran a mi jefe al trabajo (avisandoles por teléfono que iba para allá). Yo tomé mi coche y me fui a mi casa que me quedaba de camino.

Al dia Siguiente me llama el director de la empresa para decirme que me iban a descontar el día por haber salido a las cuatro. Le expliqué que mi jefe me invitó a comer, y que salimos a las siete. La situación se puso absurda. En esas llegó mi jefe (11 am) y aproveché para comentar que necesitaba los requerimientos del siguiente proyecto, y los datos para un servidor de Mysql y otro de MSSQL para pasar los datos del que acabamos de terminar. Les mostré en la laptop de mi propiedad las bases de datos jalando en local de mi pc de escritorio (que era de la empresa), y se las copié a un USB nuevo que abrí en ese momento.

El siguiente movimiento del director de la empresa fue pedirme que borrara la información de los programas y de las bases de datos de mis sitios. Lo hice en frente de el y de mi jefe inmediato. Con eso solo quedaban los datos de la base de datos, en la computadora local. La idea era que iban a respaldar los datos en un servidor externo.

El proyecto estaba terminado así que pedí el aumento de 25% que había dicho el director general. La respuesta fue que no me lo iban a dar porque el proyecto era por un año (¿?) y que querían que le enseñara a un becario a hacer un sistema, con el mismo sueldo (que eran como 18 mas prestaciones), en el mismo tiempo.

Claro que si yo quería tomar mi liquidación de tres meses de sueldo, el estaba encantado.

Asi que la tomé. Diez minutos después tenía mi cheque. Baje a cobrarlo y lo deposité en mi tarjeta de crédito del mismo banco. Por previsor siempre tengo todo preparado por continuidad de negocio.

Mi jefe inmediato avisó a todos que era mi ultimo día, y pidió unas pizzas de Papa Johns. El director de la empresa dijo que se seguía el procedimiento estandard.

Antes de irme, teniendo ya en mi poder los documentos de entrega firmados, llega el fierrero (un estudiante de UNITEC que estaba a cargo de las redes y demás) y me devuelve mi USB ya formateado. Y dijo muy contento:

Ya formatee la Máquina de escritorio también.

¿?

El procedimiento normal era formatear la pc de la persona. El no respaldó mi información de Words, Data Architects y excel, porque verificó los discos que quemé en la entrega junto con el código fuente. Y el pensaba que los datos estaban en otro servidor (de nuestro cliente, que afortunadamente era interno)

Asi que lo que hizo el técnico fue formatear mi maquina dos veces, y se perdieron TODOS los datos de casi tres meses de captura. Le instaló el sistema operativo encima. Y era Disco SATA, que no estaba soportado entonces por Norton.

El director de la empresa hizo berrinche mayúsculo, se puso morado, vio que no iban bases de datos en los discos de entrega y los aventó al piso. Mis proyectos los suelo entregar en discos de 210 mb ( http://www.amazon.com/Memorex-Pocket-Mini-Discs-50-Pack-Spindle/dp/B00005NHGP ), así que cuando los aventó al piso, los discos valieron madre.

Se perdió el código. No hay herramientas que recuperen archivos rar dañados de discos de 210 mb.

================================================================

Varios años después sigo monitoreando esa empresa. Apenas acaban de sacar una nueva versión del software que hice, ahora en ASP.

================================================================

En el corporativo en que estoy en que estoy estamos haciendo ajustes a un sistema de colegio de profesionistas hecho por un argentino sobre un proyecto a la medida mal diseñado y mal ejecutado. Ya expliqué que sale
mas caro dar mantenimiento a ese monstruo que hacer el sistema de ceros.

Ayer hubo una junta y el socio técnico, y el director de una de las empresas de aquí, fueron a proponerles que se hiciera un nuevo software. No hay presupuesto en el colegio, asi que me pidieron una serie de ajustes larguísimos que usarán una o dos semanas de mi tiempo, y estoy seguro que por lo menos pagan 30 mil. Con eso se podría hacer su sistema de ceros.

Me siento igual que cuando en aquella empresa hicieron un presupuesto de página web en 35 mil hace varios años.

Las dos ultimas semanas han estado saturadas de trabajo. Por lo general duermo muy poco pero esta semana dos ocasiones seguidas he dormido menos de lo común.

Por otra parte, he estado realizando un cliente de JSON y el universo de bases de datos es de un gb y medio actualizandose cada 20 minutos. Si me descarga la cabecera de código last modified, lo que me evita descargas de más.

Sigo probando ideas de servers al mismo tiempo. Y me acordé hace rato de algo , de una incomodidad fuerte en sueños allá por el domingo: Aunque pràcticamente no sueño, uno de esos días tuve una pesadilla de código arbitrario bajo el JSON.

Digo pesadilla para referirme a un sueño sin lógica, sin fin constructivo, e incluso a media depuración en sueños, yo pensaba: Se que esto es un sueño porque el cliente ya me regresa bien el header de last modify, asi que no entiendo que me quiere decir mi mente al comentarme del código arbitrario. Si mi parser no ejecuta objetos y convierte como paso previo a un array que no puede ejecutar por definición, ergo, este no es una pesadilla de código arbitrario sino un sueño estúpido.

Asi que me desperté. En ocasiones he soñado con código fuente y formas de mejorarlo, pero nunca me imaginé que fuera posible una pesadilla de código arbitrario bajo JSON.

Lo bueno de conocer las reglas del RFC y hacer tu propio parser, te hace inmune a ataques de idiotas con mucho tiempo libre.

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.

El 23 de mayo escribí acerca de tener archivos dentro o fuera de la base de datos :http://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.

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.

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.

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, lento, se presta a exploits, 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.

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

LLevo unas dias teniendo problemas al sacar respaldos del sitio del corporativo donde trabajo. Cuando lo saco desde mi casa, sale bien pero desde el trabajo no. Ya probe con diferentes passwords , ips, laptops, pero es igual. Creo que hay un caso de MITM o de paquetes perdidos por errores de configuración de Linksys, o por exceso de puertas de enlace. Algunos sitios tardan bastante en responder.

Por si las dudas, deberé cambiar todas mis passwords de acceso a servidores, ya que utilizo a veces para hacer pruebas esta conexión.

Las implicaciones básicas serán escribir en la noche, no de día. Probablemente también deba migrar algunos sitios extras al cluster lobonegro.

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.

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