Perversiones curiosas del mundo de TI - 2

El Daily WTF ha estado recopilando historias divertidas, salvajes y / o tristes del mundo de TI durante 14 a√Īos. Traduje varias historias que me parecieron interesantes. Todos los nombres de compa√Ī√≠as y nombres han sido cambiados. La primera parte est√° aqu√≠ .

La primera historia A pesar de la abuela ...


[ Original ]

Clive compar√≥ el contenido de su cuenta bancaria con la tasa diaria que le ofrec√≠an, como hacen muchos freelancers, y decidi√≥ que, en tales circunstancias, cualquier trabajo ser√≠a adecuado para √©l. Una vacante parec√≠a casi tolerable: la compa√Ī√≠a de seguros necesitaba un nuevo paquete de software que le permitiera cumplir con algunos requisitos legales. Adem√°s, la administraci√≥n necesitaba a alguien para ense√Īar a los desarrolladores herramientas y t√©cnicas modernas ... por ejemplo, el control de versiones de c√≥digo.

Clive repasó brillantemente la entrevista y una semana después se fue a trabajar. Una carta de alguien llamado Brandon lo estaba esperando en el buzón. Decía: "Debemos encontrarnos".

Brandon estaba sentado en su oficina, pegado a la silla ergonómica de mediados de los 90 y como si fuera uno con él. Levantó la vista del monitor y miró a Clive. "Trabajas para mí".

En frases concisas que consisten en monosílabos, Brandon explicó que ninguno de los que tomaron la decisión de contratación se reuniría con Clive. Clive es responsable solo de él.

"Est√° bien ... Entonces, cuando me contrataron, me dijeron que necesita configurar Subversion. ¬ŅDeber√≠a comenzar con esto? ‚ÄĚPregunt√≥ Clive.

"No"

"¬ŅPuedo averiguar por qu√©?" ¬ŅPrefieres algo m√°s? ¬ŅQuieres discutir opciones?

"No"

Clive esper√≥. Brandon no ten√≠a prisa por desarrollar su pensamiento. Solo mir√≥ a Clive. Contin√ļa mirando y mirando.

Clive regres√≥ lentamente a su cubo y comenz√≥ a estudiar la base del c√≥digo. Estaba ubicado en un recurso compartido de red, y el control de versiones era "file.pl.old", "file.pl.old.old". Result√≥ que el c√≥digo est√° escrito en Perl, y que es ilegible incluso para los est√°ndares de Perl. Creci√≥ en una cultura de "si se analiza, comenzar√°", no conten√≠a comentarios y no ten√≠a absolutamente ninguna prueba. El √ļnico aliado de Clive era Lee, otro especialista contratado que tambi√©n inform√≥ a Brandon, pero ten√≠a una desventaja de dos semanas en el an√°lisis de c√≥digo. Cuando Clive se qued√≥ atascado en alg√ļn lugar, mir√≥ por detr√°s de la pared de su cubo y le pregunt√≥ a Lee.

Como un glaciar que desciende de una monta√Īa, Clive se abri√≥ paso lentamente a trav√©s del c√≥digo. Semana a semana, gradualmente gan√≥ comprensi√≥n. Y luego lleg√≥ una carta de Brandon: "Necesitamos encontrarnos".

"Interfieres con el equipo de desarrollo", dijo.

"¬ŅQu√©?"

‚ÄúT√ļ y Li son demasiado ruidosos. Esta es una oficina, no un club de intereses ".

‚ÄúEsto es una locura. ¬°Acabo de hacerle preguntas sobre el trabajo! "¬ŅQuieres que organicemos reuniones en la sala de conferencias solo para hacer preguntas?"

"Sí".

Brandon se calló y de nuevo comenzó a mirar a Clive. Miró y miró ... Clive entendió la pista y huyó a su cubo.

Los requisitos eran confusos y cambiaban constantemente, lo cual no era sorprendente. El √ļnico usuario que los conoc√≠a exactamente era Carol, lo cual tampoco fue sorprendente. Clive le envi√≥ una carta con preguntas e intent√≥ hacer su trabajo. Esper√≥ unos d√≠as por su respuesta, luego tuvo nuevas preguntas y envi√≥ nuevas cartas.

En una semana envi√≥ una docena de cartas, pero no recibi√≥ respuesta. Envi√≥ nuevos para descubrir nueva informaci√≥n. Durante este tiempo, se han acumulado a√ļn m√°s preguntas. Clive intent√≥ llamarla, pero se encontr√≥ con un correo de voz. Intent√≥ programar una reuni√≥n, pero Carol nunca acept√≥ sus invitaciones.

Y luego llegó una carta de Brandon: "Necesitamos encontrarnos".

"Carol dice que la est√°s presionando", dijo Brandon.

"¬ŅQu√©?"

“Le envías cartas, incluso después de que ella responde las preguntas. Ella dijo que convocaste una reunión, pero no viniste a él. Esto debe ser detenido.

“Esto es una locura. Ella nunca respondió, puedo mostrar mi bandeja de entrada y probarlo ".

"Carol no usa el correo electrónico", explicó Brandon. “La pasante imprime sus correos electrónicos y responde por el correo interno de la oficina. Ella esta muy ocupada. Tienes una tarea técnica. Síguela y deja de molestarla.

"¬ŅQu√©? "¬ŅQuieres que implemente la soluci√≥n sin siquiera hablar con un usuario que conozca todos los requisitos?"

Brandon lo mir√≥. √Čl continu√≥ mirando y ...

Con la ayuda de Lee durante los pr√≥ximos meses, Clive hizo un progreso significativo. Aprendi√≥ a lidiar con el formato de fecha absurdo (las fechas se contaron como el n√ļmero de d√≠as desde el 3 de abril de 1974, y tambi√©n como el n√ļmero de meses desde el lunes anterior, y tambi√©n como el n√ļmero de semanas desde el pr√≥ximo domingo). Se ocuparon del hecho de que nadie deber√≠a poder actualizar Firefox a versiones superiores a la 3, y del hecho de que era imposible trabajar horas extras, porque todos los servidores estaban desconectados exactamente a las 6 p.m. Carol no se mantuvo en contacto, Brandon solo los mir√≥ y el resto del personal los trat√≥ como leprosos.

Unas semanas antes de la finalizaci√≥n de su contrato de seis meses, Clive estudi√≥ el contenido de la unidad de red de la compa√Ī√≠a en busca de una hoja de c√°lculo con datos de muestra. Encontr√≥ una mesa con el nombre de la empresa de reclutamiento que lo contrat√≥ y esper√≥ que fuera algo √ļtil. En cierto modo, lo fue.

La hoja de cálculo era un informe que informaba cuánto recibe la empresa de reclutamiento por Clive y Lee. Las sumas eran tan desvergonzadas que harían sonrojar incluso a un concesionario de autos usados. El documento incluía el seguimiento de cambios y la edición colaborativa, para que Clive pudiera leer los comentarios hechos por diferentes usuarios.

Desde el nivel de la alta gerencia, se recibieron comentarios en el esp√≠ritu de "No importa cu√°nto tenga que gastar". Los contadores advirtieron: "¬°Si lo hacemos, no tendremos dinero para las primas al final del a√Īo!"

Brandon dejó su propia nota: “Nuestro negocio es demasiado específico. No van a hacer frente. Desperdicio de dinero. No pueden hacerlo ".

Todo cayó en su lugar. Brandon no predijo, pero hizo una promesa . Y lo cumplirá: en las próximas semanas, Clive y Lee no podrán hacer lo que se prometió originalmente.

Pronto recibi√≥ una carta de su reclutador. ‚ÄúEsta empresa a√ļn necesita personal adicional. ¬ŅLe gustar√≠a extender el contrato por otros seis meses?

Ense√Īado por Brandon, Clive respondi√≥ brevemente: "No".

La segunda historia. Deja todo imposible ...


[ Original ]

Deja todo imposible ...
... y lo que queda es XML, por increíble que sea.


William Hogarth, una perspectiva absurda

Los desarrolladores tienen muchas debilidades, y una de ellas es esta: no les gusta decir que no se puede hacer algo. Es por eso que cuando un cliente de Glenn M , TelCo, le preguntó si su tarea sería realmente imposible, en lugar de disculparse y sacudir decisivamente la cabeza, respondió: "Bueno, en teoría ..."

Como resultado, Glenn escribió esto:

 <value> <mult> <op> <mult> <op> <add> <op> <div> <op> <bitwise_and> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>8388607</op> </bitwise_and> </op> <op>8388608</op> </div> </op> <op>1</op> </add> </op> <op> <left_shift> <op>1</op> <op> <sub> <op> <bitwise_and> <op> <right_shift> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>23</op> </right_shift> </op> <op>255</op> </bitwise_and> </op> <op>127</op> </sub> </op> </left_shift> </op> </mult> </op> <op> <if> <op> <eq> <op> <bitwise_and> <op> <right_shift> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>31</op> </right_shift> </op> <op>1</op> </bitwise_and> </op> <op>1</op> </eq> </op> <op>-1</op> <op>1</op> </if> </op> </mult> </value> 

Este es XML DDF, archivo de definición de datos para la aplicación de monitoreo del sistema que Glenn admite. Verá, un sistema puede leer datos de cualquier dispositivo que admita protocolos Modbus / TCP o SNMP si tiene un archivo DDF que defina los puntos de datos y cómo se muestran. El esquema DDF contiene los operadores aritméticos, booleanos, regulares y condicionales que se muestran arriba, necesarios para que el sistema sepa cómo borrar los datos.

L√≥gica XML? S√≠, esto es WTF en s√≠ mismo. Pero el verdadero WTF es lo que hace el c√≥digo anterior. La compa√Ī√≠a monitore√≥ un dispositivo que mostraba valores de temperatura (esto es bastante simple de resolver), pero los represent√≥ como una cadena de ocho caracteres que indica el valor hexadecimal de un n√ļmero de coma flotante de 32 bits en el formato IEEE-754. La tarea que Glenn tuvo que reconocer de inmediato como imposible fue convertir este valor loco en una forma num√©rica. En DDF, a pesar de todo su poder expresivo, no hab√≠a ning√ļn tipo de operador de reparto.

Por lo tanto, Glenn escribió el DDF que se muestra arriba, que hizo lo siguiente:

  • Dado que el orden de bytes se ha invertido, use <regex> para devolverlos al orden con el que puede trabajar
  • Use <baseNtoInt> para convertir de octetString a uint_32
  • Use <bitwise_and> y <right_shift> para separar el bit de signo, exponente y mantisa
  • Convierta el bit firmado a +/‚Äď 1
  • <left_shift> el desplazamiento exponencial y luego ejecutamos <left_shift> 1 por este valor
  • Divide la mantisa por 2 23
  • Multiplique los √ļltimos tres elementos para obtener el resultado final. Como <mult> y otros operadores aceptan solo 2 operandos, las acciones deben estar anidadas

La pr√≥xima vez, Glenn decidi√≥ seguir la misma t√°ctica, porque hab√≠a escuchado recientemente que TelCo modifica el dispositivo para que muestre la temperatura en n√ļmero entero.

La tercera historia. Equipo A (nti)


[ Original ]

En la d√©cada de 1980, se film√≥ una serie de televisi√≥n llamada Team A. Hab√≠a un chivato dentro de √©l, capaz de enga√Īar a cualquiera. Para obtener lo que necesitaba, hizo promesas verdaderas (¬Ņcomo marketing?). Hab√≠a un tipo genial en el equipo que pod√≠a intimidar a cualquiera para lograr su objetivo. Sab√≠a c√≥mo lograr el objetivo, pero en el fondo era un buen tipo. El equipo ten√≠a un l√≠der que siempre pod√≠a idear un plan y salvar la situaci√≥n. Y luego hab√≠a un tipo un poco loco (pero en el buen sentido) en el que siempre puedes confiar en la batalla. De vez en cuando, aparec√≠a un asistente en el equipo, dedicado a la intervenci√≥n y la inteligencia. Este grupo de chicos trabaj√≥ como un equipo bien engrasado. ¬°No pod√≠an fallar! ¬°Eran un equipo!


El equipo "A" nunca escribió documentación sobre la metodología de gestión de proyectos. No es sorprendente que todos sean criminales buscados.

Alex consigui√≥ un trabajo en un nuevo proyecto para reemplazar un sistema desactualizado y sin soporte. Naturalmente, se afirm√≥ que la compa√Ī√≠a "busca hacer todo bien". El proyecto est√° totalmente financiado. El equipo tendr√° el equipo y el personal necesarios para llevar a cabo el trabajo. Hay soporte completo para seis niveles de liderazgo m√°s todos los usuarios. Alex fue optimista.

Lo primero que hizo la compa√Ī√≠a fue pasar varios meses coordinando entre todos estos innumerables niveles de liderazgo, usuarios finales, personas de apoyo, veteranos que apoyaron el proyecto (para que pudieran explicar los problemas que empeoraron el viejo sistema) y los tres arquitectos del nuevo sistema. La nueva arquitectura ha sido ampliamente documentada, aprobada y firmada por todo lo anterior. Incluso una agencia cr√≠tica independiente de auditor√≠a reguladora realiz√≥ una revisi√≥n cr√≠tica para garantizar que las autoridades reguladoras confiaran en que se hab√≠a adoptado el enfoque correcto.

En un documento de ocho páginas, se describieron en detalle las recomendaciones para el desarrollo del código (tales como: opciones de formato de código, convenciones de nomenclatura, pruebas unitarias, cobertura de código y otros aspectos similares importantes para el equipo). El documento ha sido revisado y debe ser seguido por todos los que trabajan en el proyecto.

El inicio del proyecto fue bueno.

La primera tarea fue contratar desarrolladores para el equipo. Para hacer esto, la compa√Ī√≠a estaba buscando (muy lejos) especialistas en alta mar para encontrar el talento m√°s barato posible. Despu√©s de todo, todos pueden ser entrenados, ¬Ņverdad? Un equipo de 11 desarrolladores en total ten√≠a 13 a√Īos de experiencia, y se contrat√≥ a un l√≠der con cinco a√Īos de experiencia para administrarlos.

La siguiente decisi√≥n importante fue la elecci√≥n de la base de datos a utilizar. La compa√Ī√≠a ha utilizado activamente tres. Como todas las bases de datos se almacenaban en servidores centralizados, una de ellas se excluy√≥ de inmediato: el equipo de los servidores de bases de datos era excesivamente potente para manejar la carga esperada en un per√≠odo de tiempo razonable. De los dos restantes, uno de los miembros del equipo utiliz√≥ activamente uno. Sab√≠an su sintaxis, rarezas y limitaciones. El tercero se configur√≥ incorrectamente y, por lo tanto, ten√≠a fama de no ser confiable. Sin embargo, ella tambi√©n era el est√°ndar corporativo. A pesar de las objeciones del equipo, se eligi√≥ un tercero.

La dirección del proyecto decidió que el control de calidad podría reclutarse más tarde.

Finalmente, es hora de implementar una estructura detallada. El l√≠der del equipo offshore decidi√≥ que puede ahorrar mucho tiempo si crea el dise√Īo sobre la marcha, de acuerdo con las solicitudes. Por supuesto, los arquitectos estaban en contra, pero el gerente del proyecto estuvo de acuerdo.

Los arquitectos han comenzado a construir el motor del controlador y otros principios fundamentales del proyecto. El equipo junior, que debía crear una cola a partir de una variedad de sistemas remotos para la entrada de datos, combinando, filtrando y preprocesando, decidió que funcionaría mejor de lo que está escrito en la documentación arquitectónica, y comenzó a desarrollar su propia forma de realizar operaciones. Sin decir esto ni a los arquitectos ni a la gerencia.

Era hora de verificar el primer sprint, y durante la revisi√≥n del c√≥digo se descubrieron muchos tipos de "banderas rojas". Junior Lead dijo que la documentaci√≥n arquitect√≥nica era solo una recomendaci√≥n que ignor√≥ para satisfacer los deseos de los desarrolladores. Naturalmente, esto provoc√≥ una reacci√≥n como "¬Ņest√°s realmente all√≠ ...?" y un mont√≥n de cartas en la cadena de liderazgo. Pero el gerente del proyecto y el liderazgo anterior no parec√≠an estar interesados ‚Äč‚Äčen esto: dijeron que los junior no deber√≠an haber hecho esto, pero confiaron en ellos.

El trabajo continu√≥. Los arquitectos continuaron se√Īalando fallas y defectos de implementaci√≥n que eran incompatibles con los requisitos. Todas las ofertas fueron ignoradas porque el l√≠der del equipo offshore dijo: ‚ÄúGoogle est√° fomentando una atm√≥sfera de innovaci√≥n y creatividad; ¬°tambi√©n tenemos que hacer eso! Se le record√≥ que Google es (en su mayor parte) el "grupo de expertos" y el l√≠der trabaja con un proyecto estrictamente estandarizado en una industria estrictamente regulada. Esa arquitectura, que fue aprobada por m√°s de cuarenta gerentes, no es una opci√≥n o recomendaci√≥n, sino un requisito. Que este no es un jard√≠n de infantes, donde se fomenta la creatividad, ¬°debe cumplir con el plan aprobado! No estamos hablando de c√≥mo escribir correctamente un subprocedimiento o encapsular un objeto, pero ese procesamiento de subprocesos se us√≥ incorrectamente y en lugares incorrectos, y el acceso a las bases de datos y las comunicaciones entre procesos no ser√°n escalables. Lo que necesita no es crear m√ļltiples procesos, sino solo usar hilos. Que no debes usar archivos como sem√°foros simplemente porque lo hicieron en la escuela. Y la lista seguir√° siendo larga.

Pero nada de esto se notó. Los desarrolladores de junio se quejaron de que al crear la arquitectura no tuvieron en cuenta sus opiniones, por lo que continuarán ignorándola (con la bendición de su liderazgo). El gerente del proyecto continuó diciendo que estaba al tanto de los problemas, pero no hizo nada con ellos. Se informaron problemas en la cadena, pero nadie hizo nada. Después de todo, todos en el equipo tienen el mismo derecho de voto.

En el mundo real, si un estudiante piensa que el maestro está equivocado, entonces no cambia su calificación. El interno corta donde lo muestra el cirujano, y no al revés. El general no discute la estrategia con el rango y el archivo. Si se une a un sindicato y, como novato, exige los mismos poderes que los líderes sindicales, entonces descansará junto a Jimmy Hoff [un líder sindical estadounidense que de repente desapareció en circunstancias misteriosas] . La experiencia habla con signos de exclamación. La inexperiencia habla a los interrogadores.

Pero no en este "equipo".

Los j√≥venes continuaron haciendo lo que les pareci√≥ mejor, ignorando todas las solicitudes de los arquitectos. La mayor parte de su c√≥digo fue escrito y copiado varias veces, porque Jones no pudo tener en cuenta todo la primera vez. Los desarrolladores m√°s experimentados sabr√°n con qu√© contar. Despu√©s de 8 meses, el proyecto sufri√≥ tanto da√Īo que fue simplemente imposible cumplir con los requisitos m√°s complejos, y en un proyecto de desarrollo que comenz√≥ desde cero, fue necesario retroceder hace un mes.

Alrededor de este tiempo, la gerencia sucumbió a las solicitudes y pidió a varios usuarios comerciales que escribieran pruebas de nivel comercial (por ejemplo, una hoja de cálculo que se puede enviar a JBehave para pruebas JUnit). Los desarrolladores proporcionaron código y algunos ejemplos simples en hojas de cálculo. Los arquitectos dijeron que necesitaban contratar personal de control de calidad porque los usuarios rara vez saben cómo lidiar con casos límite, problemas de precisión, etc. Pero no se pudo gastar dinero. Después de seis meses de operación, los usuarios comerciales dijeron que todas las pruebas para toda la aplicación (es decir, toda la tarea técnica) estaban listas. Con solo mirarlo, era posible comprender que no tomaban en cuenta los casos límite, ejemplos vacíos, problemas de precisión y la mayoría de los otros aspectos que generalmente requieren pruebas. De hecho, pusieron todos los registros que podrían teóricamente (desde su punto de vista) existir en una gran prueba de aprobado / reprobado. Por supuesto, cuando algo cambia y ocurre inevitablemente el fracaso, no hay forma de averiguar dónde sucedió.

Finalmente, las cosas llegaron tan lejos que los arquitectos construyeron un muro físico entre las partes de la aplicación con el código de configuración (escrito por un equipo offshore) y el motor principal (creado por los arquitectos). Inmediatamente después de que el motor principal comenzó a procesar datos, cada variable en el sistema se restableció a una tabla de estado en la base de datos, de modo que en caso de problemas inevitables, se mostraran los datos de entrada y los desarrolladores offshore pudieran enviar una solicitud de corrección. Al menos de esta manera podrían aislar el motor principal de la basura.

El ministerio ahorró una tonelada de dinero mediante el uso de mano de obra barata, la falta de un departamento de control de calidad y el uso de una base de datos "políticamente sólida". Por supuesto, todo el código de configuración escrito por el equipo offshore fue terrible. La mayor parte fue difícil de aprender, mantener, depurar y mejorar.

El producto a√ļn no se ha lanzado, y los usuarios ya se est√°n quejando de diagnosticar y solucionar problemas durante demasiado tiempo (esta fue una de las principales razones para reescribir un proyecto antiguo). Y si reescribir no resolvi√≥ la tarea principal de reescribir, entonces probablemente algo sali√≥ mal ...

La cuarta historia. Pase a través del puntero nulo


[ Original ]

Maxine ten√≠a problemas para mostrar el sitio web en un navegador con el complemento NoScript. Esto no es sorprendente: algunos navegadores pueden no funcionar correctamente con NoScript, pero fue sorprendente que el navegador arrojara excepciones Java. Cuando habilita JavaScript, la p√°gina de error desaparece, pero ¬Ņc√≥mo es? La falta de JavaScript conduce a excepciones de Java!

Abri√≥ el c√≥digo de la p√°gina y descubri√≥ que el servidor esperaba un par√°metro "innerCHK"; probablemente alg√ļn tipo de sesi√≥n o token de seguridad que deber√≠a pasarse en la cadena de consulta de URL. De lo contrario, el servidor devuelve una p√°gina de error que muestra java.lang.NullPointerException. Afortunadamente, los desarrolladores front-end idearon el siguiente gran fragmento de JavaScript para resolver el problema:

  // Comprobación de errores
 if (document.body.innerHTML.indexOf ('java.lang' + '. NullPointerException')! = -1) {   
    if (document.location.href.indexOf ('innerCHK =') == -1) {    
         document.location.href = document.location.href + "& innerCHK =" + Math.random () * 10000;
    }
 }
 // Verificación final 

Pero esto es solo la punta del iceberg; la p√°gina estaba sobrecargada de antipatrones, ruedas reinventadas, ruedas de repuesto y llantas pinchadas. Todo esto se llev√≥ a cabo en cinta . Para tener una idea del estilo de algunas conversiones de cadenas extra√Īas y el antipatr√≥n favorito de los desarrolladores: cerrar los scripts solo para abrir uno nuevo en la siguiente l√≠nea, echemos un vistazo a c√≥mo se importa Dojo. Tenga en cuenta que la cookie Dojo se importa.

  <script type = "text / javascript">
     if (typeof dojo == "undefined") {        
         document.writeln ('<scr' + 'ipt src = "' + '/wps/themes/./dojo/portal_dojo/dojo/dojo.js' + '"> </ scr' + 'ipt>');
     }
     if (typeof dijit == "undefined") {      
         document.writeln ('<scr' + 'ipt src = "' + '/wps/themes/./dojo/portal_dojo/dijit/dijit.js' + '"> </ scr' + 'ipt>');
     }      
  </script>     
  <script type = "text / javascript">     
  dojo.require ("dijit.form.Button");
  dojo.require ("dojo.cookie");
  //dojo.require("dijit.form.DropDownButton ");
  dojo.require ("dijit.Dialog");
  dojo.require ("dijit.form.TextBox");
  dojo.require ("dijit.form.CheckBox");
  dojo.require ("dijit.form.ComboBox");
  </script>

Algunos, si no todos los enlaces CSS se manejan de esta manera. Encontré en el código fuente al menos tres ocurrencias (idénticas). Repetir Dojo.cookie se importa.

  <script name = "DojoEnable_script" language = "JavaScript"> if (typeof dojo == "undefined") {
     dojo.require ("dojo.cookie");
     dojo.require ("dojo.parser");
     djConfig = {parseOnLoad: false, isDebug: false};
     document.write ("<script src = 'http: //www.****************.com: 80 / ps / PA_WPF / factory / dojo / dojo / dojo.js '> </ "+" script> ");
     document.write ("<link rel = 'stylesheet' type = 'text / css' href = 'http: //www.****************.com: 80 / ps /PA_WPF/factory/dojo/dojo/resources/dojo.css '/> ");
     document.write ('<link rel = "stylesheet" type = "text / css" href = "http: //www.****************.com: 80 / ps /PA_WPF/factory/dojo/dijit/themes/tundra/tundra.css "/> ');
     document.write ('<link rel = "stylesheet" type = "text / css" href = "http: //www.****************.com: 80 / ps /PA_WPF/factory/dojo/dijit/themes/tundra/tundra_rtl.css "/> ');
     dojo.addOnLoad (function () {if (! document.body.className) document.body.className = 'tundra'});
 }


Alguien dijo una vez que si quieres resolver un problema con expresiones regulares, entonces tienes dos problemas. Creo que, diciendo "dos", subestimó la situación.

  var locale = 'en'.replace (/ _ /,' - '). replace (/ iw /,' he '). toLowerCase ();

¬°Recuerde, los ni√Īos siempre usan nombres bien pensados ‚Äč‚Äčpara las constantes! Los n√ļmeros m√°gicos son malos. Excepto 2008, todo est√° bien con √©l.

  if (typeof (MONTHS_IN_YEAR) == 'indefinido')
 {
     MESES_IN_A√ĎO = 12;
 }

 if (typeof (isDisableDate) == 'undefined') {
     var isDisableDate = function (fecha, a√Īo, mes, viernes)
     {
         if (date.getFullYear () == 2008)
         {
             volver verdadero;
         }
         devuelve falso;
     }
 };

Ninguna aplicaci√≥n mal implementada estar√° completa sin su biblioteca DateTime mal implementada. Debe haber alg√ļn tipo de ley cient√≠fica sobre esto.

  var mes = nueva matriz (12);
 mes [0] = "1";
 mes [1] = "2";
 mes [2] = "3";
 mes [3] = "4";
 mes [4] = "5";
 mes [5] = "6";
 mes [6] = "7";
 mes [7] = "8";
 mes [8] = "9";
 mes [9] = "10";
 mes [10] = "11";
 mes [11] = "12"; 

 if (typeof (MONVALUE) == 'indefinido')
 {
     MONVALUE = nueva matriz
     ("Jan",
      "Feb",
      "Mar",
      "Abr",
      "Mayo",
      "Jun",
      "Jul",
      "Ago",
      "Sep",
      "Oct",
      "Nov",
      "Dec");
 }

 // la función convierte la fecha de str a Num
 función Month2Num (mes)
 {
     if (mes == "ENE") devuelve "01"; if (mes == "FEB") devuelve "02"; if (mes == "MAR") devuelve "03"; if (mes == "APR" ) devuelve "04"; if (mes == "MAYO") devuelve "05";
     if (mes == "JUN") devuelve "06"; if (mes == "JUL") devuelve "07"; if (mes == "AUG") devuelve "08"; if (mes == "SEP" ) devuelve "09"; if (mes == "OCT") devuelve "10";
     if (mes == "NOV") devuelve "11"; if (mes == "DEC") devuelve "12";
 }

El código contiene muchos estilos CSS (a menudo duplicados), por ejemplo, este no es un estilo muy azul.

  div.wpfThemeBlueBackgroundPanelTable  
 { 
     fondo: # F6F9FC; 
     acolchado: 10px; 
 } 
 / * ---- Panel azul ---- * / 
 table.wpfThemeBlueBackgroundPanelTable  
 { 
     fondo: # F6F9FC; 
     acolchado: 10px; 
 } 

A continuación hay dos matrices idénticas, de las cuales solo se usa una.

  var arr_location_001 = new Array ();
 var arr_location_002 = nueva matriz ();

 arr_location_001 ['AU'] = {valor: 'AU', título: 'australia', texto: 'Australia'};
 arr_location_002 ['0'] = {valor: 'AU', título: 'australia', texto: 'Australia'};

 arr_location_001 ['CA'] = {valor: 'CA', título: 'canada', texto: 'Canadá'};
 arr_location_002 ['1'] = {valor: 'CA', título: 'canada', texto: 'Canadá'};

 arr_location_001 ['CN'] = {valor: 'CN', título: 'china', texto: 'China'};
 arr_location_002 ['2'] = {valor: 'CN', título: 'china', texto: 'China'};

 arr_location_001 ['FR'] = {valor: 'FR', título: 'francia', texto: 'Francia'};
 arr_location_002 ['3'] = {valor: 'FR', título: 'francia', texto: 'Francia'};

 arr_location_001 ['HK'] = {valor: 'HK', título: 'hong_kong', texto: 'Hong Kong'};
 arr_location_002 ['4'] = {valor: 'HK', título: 'hong_kong', texto: 'Hong Kong'};

 / * fragmento de muchas líneas de código similar * /

¬°Aqu√≠ hay otro peque√Īo script hermoso que logr√≥ evitar muchas cosas, incluidas sus propias etiquetas de script! El desarrollador obtiene puntos de bonificaci√≥n si lo escribi√≥ en una camisa de fuerza, tapiado en un ata√ļd lleno de escorpiones, colgando de un helic√≥ptero sobre el Hudson. (En realidad, esta podr√≠a ser la explicaci√≥n m√°s l√≥gica para la mayor√≠a del c√≥digo).
  <SPAN name = "onloadScript"> <input type = "hidden"> función onSelectInfo (calendario, fecha, fecha_elem) { 
     elem_date = document.getElementById (& quot; Day_NArr & quot;);       
     elem_mon_year = document.getElementById (& quot; Month_NArr & quot;); 
     hidden_elem = document.getElementById (& quot; temp_date_NArr & quot;); 
     doOnSelect (calendario, fecha, elem_date, elem_mon_year, hidden_elem); 
 } 

 Calendar.setup ( 
     { 
         inputField: & quot; temp_date_NArr & quot ;, // ID del campo de entrada 
         ifFormat: & quot;% b,% e,% Y & quot;, 
         onSelect: onSelectInfo, 
         rango: [currentYear, nextYear], 
         dateStatusFunc: dateStatusHandler, 
         botón: & quot; cal_dep & quot;  // ID del botón 

     } 
 ); 

 var _InfoVerAccurateFunc = clone (accurateDate); 
 initializeDate (nueva matriz ('Month_NArr', 'Day_NArr'), _InfoVerAccurateFunc); ">
 <script type = "text / javascript">

¬ŅRecuerdas todo el dojo.cookie importado arriba? Alguien agreg√≥ una funci√≥n de biblioteca para leer cookies.Sin embargo, alguien m√°s consider√≥ necesario escribir una funci√≥n de copiar y pegar Get_Cookie desde Internet, ¬°pero no una, sino cuatro veces!

 función Get_Cookie (check_name) {
    // primero dividiremos esta cookie en pares de nombre / valor
    // nota: document.cookie solo devuelve nombre = valor, no los otros componentes
    var a_all_cookies = document.cookie.split (';');
    var a_temp_cookie = '';
    var cookie_name = '';
    var cookie_value = '';
    var b_cookie_found = falso;

    for (i = 0; i <a_all_cookies.length; i ++) {
        // ahora dividiremos cada par nombre = valor
        a_temp_cookie = a_all_cookies [i] .split ('=');


        // y recorta los espacios en blanco a la izquierda / derecha mientras estamos en ello
        cookie_name = a_temp_cookie [0] .replace (/ ^ \ s + | \ s + $ / g, '');

        // si el nombre extraído coincide con check_name pasado
        if (cookie_name == check_name) {
            b_cookie_found = verdadero;
            // necesitamos manejar el caso donde la cookie no tiene valor pero existe (no = signo, es decir):
            if (a_temp_cookie.length> 1) {
                cookie_value = unescape (a_temp_cookie [1] .replace (/ ^ \ s + | \ s + $ / g, ''));
             }
            // tenga en cuenta que en los casos en que la cookie se inicializa pero no tiene valor, se devuelve un valor nulo
            return cookie_value;
            romper
         }
        a_temp_cookie = nulo;
        cookie_name = '';
     }
    if (! b_cookie_found) {
        volver nulo;
     }
 }

Creo que el método de desarrollo de software utilizado por este equipo es un nuevo sistema llamado "Dolby en las teclas CTRL-C y CTRL-V !!!!!! 11 !!!! 11! 11". Estoy seguro de que en el futuro cercano reemplazará a Agile.

La quinta historia. Robots humanos


[ Original ]

Durante la formación de SuperbServices, Inc, su negocio floreció. Fue una bendición y una maldición; Como en cualquier startup, había más trabajo que manos. El departamento de ventas no pudo renunciar a su éxito, por lo que los técnicos tuvieron que adaptarse.

El CEO de SuperbServices, Inc le dio a Roland una tarea seria que podr√≠a salvar a la compa√Ī√≠a, o al menos la salud mental de los empleados. "Necesitamos automatizar todo el procesamiento para que podamos centrarnos en la prestaci√≥n de servicios", dijo el CEO. ‚ÄúLo m√°s valioso con nosotros son nuestros servicios, y todo lo dem√°s es un alboroto innecesario. Necesitas automatizarlo, y eso es lo que har√°s. Cooperar√° con robots humanos para automatizar todo: confirmaci√≥n de operaciones, compras, transacciones de fondos, correo electr√≥nico de clientes, ¬°eso es todo!

"¬ŅCon ... robots humanos?"

Roland tiene una nueva fobia. El departamento de servidores de la compa√Ī√≠a era inusualmente exc√©ntrico, incluso para los est√°ndares de la industria. Solo unos pocos vieron a sus empleados, y solo llegaron rumores extra√Īos a Roland.

Cuando Roland llam√≥ a la puerta de la sala de servidores, la c√°mara de vigilancia que estaba sobre su cabeza cobr√≥ vida y la voz impasible del robot le pregunt√≥: "¬ŅQU√Č EST√ĀS BUSCANDO?"

‚ÄúUh, hola ... soy Roland, gerente de proyectos. ¬ŅParece que nosotros, o quienes somos, deber√≠amos automatizar las tareas?

‚Äú¬ŅQU√Č ME OFRECES?‚ÄĚ Respondi√≥ la ominosa voz de metal.

"Bueno, eh ... ¬Ņa los robots les encantan las donas?" Tengo conmigo. Eso es todo lo que hay ".

"PASS" La cerradura electr√≥nica de la puerta se abri√≥ con un clic. Roland empuj√≥ la puerta hacia √©l y el aire helado estall√≥ por detr√°s. Miles de luces y estanter√≠as parpadearon dentro, cerca hab√≠a una peque√Īa mesa. Una luz brill√≥ sobre la mesa. "PONGA LA OFERTA AQU√ć", dijo la ametralladora desde las sombras.

Roland dejó la caja de donas en la mesa y se alejó lentamente. Un grito de "¡GRACIAS!" Salió de detrás de él. Roland se levantó de un salto. El hombre endeble con un modulador de voz se rió y agarró una rosquilla.

"Hola Roland, soy Roy", dijo, dejando a un lado el modulador. ‚ÄúNo tenemos muchos visitantes, por lo que nos gusta burlarnos de ellos. Bueno, ¬Ņnecesitas automatizar algo?

Roland estaba sorprendido de lo ordinario que era Roy, y no de que fuera realmente humano. "Ah, sí, el CEO dijo que trabajas mucho con robots, y que podemos usarlos para automatizar todo lo que podamos", Roland describió los requisitos y especificaciones.

Roy suspiro. “Es una pena decepcionarte, pero realmente no tenemos nada que ver con los robots, sin importar lo que piense el género. Insiste en que Ruby es el nombre del robot, aunque es solo un lenguaje de programación. Pero la mayoría de estos procesos podemos automatizarlos. Danos dos semanas, tantas donas y bebidas energéticas como podamos consumir, y podemos manejarlo ".

Durante las siguientes dos semanas, Roland trajo las ofertas solicitadas y recibi√≥ a cambio informaci√≥n sobre el progreso y demostraciones de funciones. Roy y otras personas rob√≥ticas escribieron el c√≥digo, y pronto la monta√Īa de papeleo que todo el mundo estaba haciendo se traslad√≥ a los servidores en el s√≥tano. Roland explic√≥ que la mayor parte del trabajo fue realizado por "robots humanos", pero el CEO elogi√≥ sus esfuerzos.

"Roland, la obra maestra ya est√° hecha, ahora estas m√°quinas tiran de las palancas que ponen en marcha nuestro negocio", le dio unas palmaditas en la espalda. ‚ÄúSu recompensa ser√° un nuevo proyecto, otro proyecto con la m√°s alta prioridad. Nuestro departamento financiero no hace frente al volumen de transacciones. Habl√© con el CFO y ella quiere que t√ļ y la gente del robot automaticen el nuevo producto que compramos: MoneyWorx. ¬°No me decepciones! "

Roland regres√≥ a la sala de servidores. Si el proyecto de automatizaci√≥n anterior era tan simple, entonces todo ser√° igual, ¬Ņverdad? Le mostr√≥ a Roy las demandas.

La piel de Roy bronceada a la luz de los monitores se volvi√≥ a√ļn m√°s p√°lida. ‚Äú¬°Esto es malo, muy malo! ¬°Peligro! ‚ÄĚ, Grit√≥ Roy. Agit√≥ las manos con horror. ‚ÄúEsto no es MoneyWorx, sino MoneyDoesntWorx. Incluso cuando los servicios se est√°n ejecutando, requieren tokens RSA-SecurID. Alguien debe ingresar el c√≥digo manualmente ".

"¬ŅManualmente?" Es decir, para que el sistema funcione, ¬Ņalguien debe estar en la l√≠nea?

"Si. Usamos tres tokens SecurID, por lo que generalmente cuando MoneyWorx solicita un nuevo código, debería haber tres personas en la línea ".

"Entonces no funcionar√°. Si para las transacciones la gente tiene que atender llamadas nocturnas, el CEO estar√° furioso. Y ya ha firmado un acuerdo: debemos asegurarnos de que el sistema funcione sin llamar a la gente ".

Roy abri√≥ al hombre de la energ√≠a y se estremeci√≥. ‚ÄúDame un fin de semana, lo pensar√©. Y necesitar√© m√°s de esto ‚ÄĚ, sacudi√≥ el frasco. "Y este", se√Īal√≥ una caja de donas.

Roland apareció el fin de semana y dejó sus ofrendas. Roy los aceptó, pero no dijo nada. Los robots humanos estaban demasiado ocupados para conversar. Cuando llegó el lunes, Roland regresó con nuevas donas y bebidas energéticas. "¡Eureka!" Roy exclamó cuando Roland entró. "¡Déjame mostrarte mi obra maestra!"

La "obra maestra" era una caja de donas vacía puesta a un lado. Los tokens RSA-SecurID se pegaron a la caja. Todo el sistema se instaló frente a una cámara web barata. "Cuando MoneyJerks requerirá un nuevo token de dos factores, alguien puede acceder de forma remota a esta máquina, verificar los tokens e ingresar el código correcto".

"¬ŅNo crees que esta caja necesita protecci√≥n con contrase√Īa?", Sugiri√≥ Roland.

"¬ŅCrees que los usuarios recordar√°n c√≥mo iniciar sesi√≥n?", Objet√≥ Roy.

Probablemente fue la idea más tonta de la que Roland había oído hablar, pero lo informó arriba y mostró una demostración de soluciones en la oficina del CEO. Después de desconectarse del automóvil con una cámara web, se encogió, esperando la rabieta.

‚Äú¬°Esto es asombroso! Dirigieron sus ojos rob√≥ticos a esta mierda, ¬°y ahora nadie en la compa√Ī√≠a necesita decirle a MoneyWorx qu√© hacer! Buen trabajo, Roland. Felic√≠tame de la gente rob√≥tica. Su robot es solo un milagro ‚ÄĚ.

Roland estaba feliz de que el trabajo se hubiera completado, pero no pudo deshacerse de la sensaci√≥n de que hab√≠a cometido un terrible error. La seguridad financiera de la empresa estaba en manos de una c√°mara web barata sin ninguna protecci√≥n, excepto por la falta de una direcci√≥n IP p√ļblica.

imagen

Cuando el desastre finalmente estalló, no tomó la forma de una transacción fraudulenta. Una caja de donas cayó tarde el miércoles por la noche. Roland tuvo que llamar a Roy, quien condujo a la oficina y volvió a colocar la caja en su lugar. Después de analizar las causas de la falla, Roy pegó la caja al bastidor del servidor con cinta aislante, asegurando así un tiempo de actividad constante.

Source: https://habr.com/ru/post/437376/


All Articles