-[ 0x03 ]-------------------------------------------------------------------- -[ Bazar ]------------------------------------------------------------------- -[ by Varios autores ]-----------------------------------------------SET-29-- Otro numero mas donde damos la oportunidad de publicar en SET a gente que no se ve con animos para escribir penyazos tan largos como los que suelen ir sueltos o quieren enviarnos sus trucos, opiniones o pequenyos descubrimientos. De todas manereras, ya sabeis que lo que nos gusta es que os mojeis y hagais vuestros articulos cuanto mas completos mejor! -----------------[ Contenidos del Bazar de SET 29 ]------------------------ [3x01] Rompecabezas by Lindir [3x02] Mini ejemplo by Astaroth H [3x03] Mainframes by Anonimo [3x04] interpolando by FCA0000 -[ 3x01 ]-------------------------------------------------------------------- -[ RompeCabezas ]------------------------------------------------------------ -[ by Lindir ]-------------------------------------------------------SET-29-- Me consta que muchos lectores de SET se dedican a la programacion. Algunos lo hacen por hobby y otros por trabajo. Pero lo que propongo aqui es divertirnos un poco con lo que podria llamarse "programacion limitada". Hoy en dia que tan de moda estan los deportes de riesgo, vamos a intentar el mas dificil todavia de la programacion en C: acercarnos al limite del lenguaje y el compilador. No os asusteis. No soy ningun guru y posiblemente muchos de vosotros resolvais los pasatiempos enseguida, aunque si estais empezando a programar en C puede que os cuesten bastante. Propongo a continuacion ocho acertijos de programacion en lenguaje C. No se trata de realizar programas largos o complicados, sino de realizar programas triviales si no fuera por este detalle: tendremos la sintaxis limitada. Cada acertijo tiene su propias reglas, que pueden incluir el no utilizar ciertas palabras reservadas (for, switch ...), usar solo una cantidad determinada de variables, etc. Ademas hay ciertas reglas comunes: no pueden usarse funciones de la biblioteca estandar (salvo printf y scanf) ni enlazar el codigo con ningun modulo externo. Los programas deben constar de un solo archivo C. Aparte de esto, todo lo que no se indique expresamente como prohibido estara permitido. Por supuesto, esta expresamente prohibido el uso de ensamblador en linea o utilizar buffers de codigo: todo debe hacerse en C. Como guia, los acertijos estan ordenados, y los primeros pueden resolverse de forma mas sencilla que los ultimos, en general. Ademas algunos estan relacionados con los siguientes. Por lo tanto, si sois capaces de resolver los ultimos podreis utilizar lo aprendido para resolver los primeros de forma distinta a la solucion propuesta. Tras cada uno de estos pasatiempos incluyo una solucion al mismo. La solucion no tiene por que ser unica ni la mejor posible. He intentado que sea corta cuando esto ha tenido sentido, y que sea clara en la mayor parte de los casos, incluyendo comentarios al codigo. Notar que las soluciones pueden no funcionar en ciertos compiladores o maquinas. Su correccion esta comprobada usando el gcc 2.95.3 (si, es muy antiguo) bajo Linux en un x86. Seguro que versiones mas modernas del mismo compilador tambien sirven. Tambien puede ser que segun las opciones de compilacion (alineacion de la pila, etc.) alguna no funcione. Como pista, yo utilizo la orden "gcc archivo.c -o archivo". He intentado evitar que el compilador muestre "warnings", salvo el de que la funcion main devuelve void en lugar de int. Estas soluciones propuestas estan escritas "al reves". Cada linea debe ser leida de derecha a izquierda. Incluyo un peque¤o programa que "da la vuelta" a las lineas recibidas por la entrada estandar, para que podais comprobar de forma mas rapida si vuestra solucion coincide con la propuesta. Os aconsejo que si alguno no os sale a la primera lo penseis un tiempo y no mireis la solucion enseguida, puesto que ya no tendra gracia volverlo a intentar. En algun caso el siguiente pasatiempo puede daros una pista de como resolver el anterior. -Vuelta.c- /* vuelta.c: programa que toma lineas de la entrada estandar y las escribe caracter a caracter desde el final al principio por la salida estandar. */ #include void main (void){ char linea[256]; int c,n=0; while ((c=getchar())>0){ if (c=='\n'){ int i; for (i=n;i>0;i--) putchar(linea[i-1]); putchar(c); n=0; } else linea[n++]=(char)c; } } /**************************** fin de vuelta.c ******************************/ -Acertijos- /**************************************************************************** 1) Pasatiempo en C n§ 1: Sin utilizar if, do, while, for, switch, goto ni el operador ternario ?, hay que realizar un programa que compare dos numeros enteros (a y b) que reciba por teclado e imprima un mensaje en la pantalla indicando cu l de ellos es mayor ("a es mayor/menor que b"). S¢lo se permite llamar a scanf() y printf() para recibir los n£meros e imprimir los mensajes. No se permite llamar a ninguna otra funci¢n de biblioteca. */ /* Soluci¢n: */ >h.oidts< edulcni# {)diov(niam diov ;b,a tni ;)b&,a&,"d% d%"(fnacs ;)b,a,"n\d%>d%"(ftnirp && ))b,a,"n\d%a( } /****************************************************************************/ /**************************************************************************** 2) Pasatiempo en C n§ 2: Se trata de, sin usar mas constantes que las cadenas pasadas a printf y scanf para recibir los datos e imprimir los mensajes y sin usar operadores *, /, ni ++, hacer un programa que multiplique dos numeros que reciba por teclado e imprima un mensaje con el resultado de la operacion. No puede usarse ningun tipo de constante literal, ni siquiera constantes numericas (1,2...) o de caracter ('a','\0'...). */ /* Solucion: */ >h.oidts< edulcni# {)diov(niam diov ;d,c,b,a dengisnu /* ;1 = d */ ;)a&,"d%"(fnacs=d ;)b&,"d%"(fnacs /* 0 = c */ ;c=^c /* rodacilpitlum elcub */ };b=+c;d=-a{)a(elihw ;)c,"n\d%"(ftnirp } /****************************************************************************/ /**************************************************************************** Pasatiempo en C n§ 3: Al igual que el anterior, se trata de, sin usar mas constantes que las cadenas pasadas a printf y scanf para recibir los datos e imprimir los mensajes y sin usar operadores *, /, ni ++, hacer un programa que multiplique dos numeros que reciba por teclado e imprima un mensaje con el resultado de la operacion. No es valido usar los valores de retorno de las funciones de stdio.h. */ /* Solucion: */ >h.oidts< edulcni# {)diov(niam diov /* tesffo elpmis nU */ ;f,e rahc /* 1 = d */ ;)f&(-)e&(=d,c,b,a dengisnu ;)b&,a&,"d% d%"(fnacs /* 0 = c */ ;c=^c /* rodacilpitlum elcub */ } ;b=+c ;d=-a {)a(elihw ;)c,"n\d%"(ftnirp } /****************************************************************************/ /**************************************************************************** Pasatiempo en C n§ 4: Utilizando solo una variable, una llamada a printf, y el caracter ; dos veces, hay que escribir un programa que imprima los numeros del 1 al 5, sin utilizar ninguna constante numerica ni llamada a funcion. */ /* Solucion: */ >h.oidts< edulcni# {)diov(niam diov ;c^c=c tni ;)c++,c++,c++,c++,c++,"n\d% d% d% d% d%"(ftnirp } /****************************************************************************/ /**************************************************************************** Pasatiempo en C n§ 5: Usando el caracter ; solo dos veces y unicamente dos variables, escribir un programa que multiplique dos numeros que reciba por teclado. */ /* Solucion: */ >h.oidts< edulcni# {)diov(niam diov ;b,a tni ;))b&,a&,"d% d%"(fnacs,b*a,"n\d% :se odatluser lE"(ftnirp } /****************************************************************************/ /**************************************************************************** Pasatiempo en C n§ 6: Sin utilizar operadores de multiplicacion ni bucles for/while/do y usando el caracter ; solo tres veces, escribir un programa que multiplique dos numeros unsigned >0 que reciba por teclado. */ /* Solucion: */ >h.oidts< edulcni# /* noicacilpitlum ed ovisrucer omtiroglA */ {)b dengisnu ,a dengisnu(itlum dengisnu ;)b,1-a(itlum+b:b?1==a nruter } {)diov(niam diov ;b,a dengisnu ;))b&,a&,"d% d%"(fnacs,)b,a(itlum,"n\d% :se odatluser lE"(ftnirp } /****************************************************************************/ /**************************************************************************** Pasatiempo en C n§ 7: Sin utilizar el caracter ; ni ninguna constante mas que las cadenas de formato para printf/scanf, escribir un programa que reciba un numero (se supone > 0) por teclado y escriba todos los numeros desde este al 1. */ /* Solucion: */ >h.oidts< edulcni# {)vgra** rahc ,cgra tni(niam diov }{)))cgra&,"d%"(fnacs!(||)cgra=^cgra((elihw )cgra(elihw }{)cgra--||)cgra," d%"(ftnirp!(elihw } /****************************************************************************/ /**************************************************************************** Pasatiempo en C n§ 8: Sin utilizar el caracter ; ni los operadores * / ni mas constantes que las cadenas de formato de printf/scanf, escribir un programa que reciba dos numeros (se suponen > 0) por teclado e imprima el resultado de multiplicarlos. */ /* Solucion: */ >h.oidts< edulcni# redop arap eneit es olos ortemarap omitlu lE .noicacilpitlum ed noicnuF */ /* ; le razilitu nis sam lacol elbairav anu noc ratnoc {)c tni ,b* tni ,a* tni(itlum tni /* ;0=c */ }{)c=^c(fi /* rodacilpitlum elcub */ {)a*(elihw }{)--)a*((fi }{))b*(=+c(fi } /* aicnerefer rop odatluser led osaP */ }{)c=a*(fi } {)vgra** rahc ,cgra tni(niam diov /* ;0=vgra=cgra ,oremirP */ }{))vgra)tni(^vgra)tni(=vgra)tni((||)cgra^cgra=cgra((fi /* odalcet rop adartnE */ }{))vgra&,cgra&,"d% d%"(fnacs!(fi /* .odatluser led noiserpmi e noicacilpitluM */ }{))cgra^cgra(&&)cgra,vgra&)* tni(,cgra&(itlum(fi }{))cgra,"n\d%"(ftnirp!(fi } /****************************************************************************/ -[ 3x02 ]-------------------------------------------------------------------- -[ Mini ejemplo ]------------------------------------------------------------ -[ by Astaroth H ]---------------------------------------------------SET-29-- "El mar siempre esta ahi y es imposible aprender a nadar si nunca intentamos sumergirnos en el". (Relis). ######=====....___Introduccion___....=====###### Bueno este es mi primer tutorial, espero que lo entiendan. El programa con que comienzo es interesante a parte de que es un buen explorador de windows de 1 a 10 le pongo 7, es interesante porque voy a utilizar varias herramientas, y para que uno que no sabe utilizarlas las aprenda facilmente, entonces a por el perrito. Programa : Super Explorer v 1.4 Proteccion : Tiempo limite de 15 dias y esta empaquetado. Descripcion : Es un buen explorador de windows. Dificultad : Newbie. Web site : http://www.galcott.com Herramientas: Exescope v 6.30 ProcDump32 v 1.6 W32Dasm v 8.93 Hex Workshop v3.02 (Las pueden conseguir de cualquier lado hay muchas). Cracker : Cracker ######=====....___Comenzando___....=====###### Primero: (A jugar perrito). Lo instalamos, lo ejecutamos y una nag nos dice que este programa no esta registrado, luego entramos y miramos que de bueno tiene el programa, jugamos con el un rato y a mi me parecio interesante, y hay muchas que hacer con el, pero bueno a crackearlo, para eso primero vamos al menu Help y escogemos Enter Registration Code, nos sale una ventana solo con un espacio para poner nuestro codigo ponemos cualquiera y OK, y un mensaje diciendo "Incorrect Registration Code", lo anotamos y salimos del programa. Segundo: (Ahora la patita, la patita perrito). Siempre antes de crackear hay que analizar el programa, por ahi hay muchas herramientas yo utilizo el Exescope v 6.30 , entonces ejecutamos Exescope y abrimos superexp.exe y nos aparece tres menus: Header (informacion del programa), Import (las funciones que importa) y Resource (Recursos del programa). Entramos a Header y vamos a encontrar varios submenus (No voy a ahondar en todo lo que significa esto, si quieren mas informacion de esto, busquen por ahi tutoriales sobre encabezados PE) , y nos dirigimos a Section Header y vamos a ver que hay UPX0, UPX1 y .rsrc, esto significa que esta empaquetado con un uno que se llama UPX; ahora que sabemos que esta empaquetado hay que desempaquetarlo. (Si desean pueden ver lo que hay en los otros menus y submenus). Tercero: (Hazte el muerto perrito). Para desempaquetarlo voy a utilizar ProcDump32 v 1.6, ejecutamos ProcDump32 y dentro nos dirigimos a Unpack y escogemos UPX (el empaquetador) damos a OK y luego abrimos superexp.exe, y nos sale un mensaje le damos a aceptar, esperamos un momento y nos sale una pantalla diciendonos con que nombre vamos a guardarlo, ponen el nombre que les guste y guardar, despues aparece un mensaje diciendonos que a terminado, le damos a aceptar y listo programa desempaquetado, ahora podemos trabajar con el desensamblador. (Como observacion el original pesa 905KB y el desempaquetado 2,854KB). Cuarto: (Vamos perrito, traeme el palo perrito). Vamos a desensamblarlo, (Como observacion si intentamos desensamblarlo sin desenpaquetarlo nos saldra un mensaje diciendo que el W32Dasm a efectuado una operacion no admitida y que se tendra que cerrar). Ejecutamos W32Dasm v8.93 y abrimos el desempaquetado y podemos ir a preparar un cafe, porque se va a demorar un par de minutos. Una vez dentro buscamos en las SDR (String Data References), la cadena que anotamos al comienzo la del mensaje del error "Incorrect Registration Code", cuando la encontremos hacemos doble click y nos lleva a una parte del codigo le damos otra vez doble click a la cadena para saber si hay mas coincidencias en el codigo pero solo hay una que es esta: :005DBF53 BAE4BF5D00 mov edx, 005DBFE4 * Possible StringData Ref from Data Obj ->"You have been successfully registered." | :005DBF58 B8F4BF5D00 mov eax, 005DBFF4 :005DBF5D E87A91FEFF call 005C50DC :005DBF62 A178D26200 mov eax, dword ptr [0062D278] :005DBF67 8B00 mov eax, dword ptr [eax] :005DBF69 E88AB9E7FF call 004578F8 :005DBF6E EB14 jmp 005DBF84 ; Salto incondicional que nos evita el mensaje de error * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:005DBEB3(C) | :005DBF70 B930000000 mov ecx, 00000030 * Possible StringData Ref from Data Obj ->"Error" | :005DBF75 BA94C05D00 mov edx, 005DC094 * Possible StringData Ref from Data Obj ->"Incorrect registration code" | :005DBF7A B8A4C05D00 mov eax, 005DC0A4 ; Aparecemos aqui :005DBF7F E85891FEFF call 005C50DC * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:005DBF6E(U) | :005DBF84 33C0 xor eax, eax Un salto condicional nos trae aqui y un poco mas arriba hay un salto incondicional que evitaria mostrar el mensaje de error y arriba de ese salto esta el mensaje de felicitacion por registrarnos, pero miremos quien nos trae al mensaje de error, asi que busquemos con la linterna la direccion 005DBEB3 , nos lleva aqui: * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:005DBE44(C) | :005DBEB3 0F85B7000000 jne 005DBF70 ; Aparecemos aqui :005DBEB9 B201 mov dl, 01 :005DBEBB A1400B4800 mov eax, dword ptr [00480B40] :005DBEC0 E8974EEAFF call 00480D5C :005DBEC5 8BD8 mov ebx, eax Miremos que tambien se viene aqui con un salto condicional y cuando llega esta el salto que si no son iguales, no se que cosa, salta y el error, y si son iguales nos muestra el mensaje de felicitacion asi que podemos nopear toda esa instruccion osea: cambiar : 005DBEB3 0F85B7000000 jne 005DBF70 por : 005DBEB3 909090909090 nop nop nop nop nop nop Los 90 significa NOP'S en hexadecimal, nop significa que no hace nada y asi siempre nos muestra el mensaje de felicitacion . Para eso ponemos el seleccionador (marca celeste) del W32Dasm encima de la instruccion : 005DBEB3 0F85B7000000 jne 005DBF70 y en la parte de abajo miramos el offset de esa instruccion la anotamos, y luego entramos en el Hex Workshop abrimos el ejecutable buscamos el offset y cambiamos los bytes y lo guardamos. Luego ejecutamos Super Explorer introducimos cualquier codigo y listo programa registrado. (Eso perrito asi se hace). Observacion: En el desensamblado si subimos un poco por encima del mensaje bueno, veremos que entra en el registro para meter la clave que hayamos escrito. Comentarios a astaroth_h@hotmail.com Chau y espero que les haya gustado este tutorial, y espero que no sea el ultimo que escriba. -[ 3x03 ]-------------------------------------------------------------------- -[ Introduccion a los mainframes ]------------------------------------------- -[ by Anonimo ]------------------------------------------------------SET-29-- 1. Prefacio ----------- Vaya hombre... una busqueda del termino 'mainframe' en todos los numeros de SET y ni una sola referencia. Con la ilusion que me hacia... ¨Sera que no interesa el tema? Solo dire que los bancos son de los principales usuarios; eso ya los hace muy atractivos de estudiar. ¨Estaran pasados de moda? Pues tampoco, aunque en los 80 parecia que iban a desaparecer. En un primer momento pense que lo que pasaba es que los mainframes son bastante desconocidos y que ademas los hackers no hablaban de ellos en las e-zines porque les da rabia la imposibilidad para hackearlos. En realidad hice mal la busqueda. Hay referencias a 'Main frames' en SET15 (Red Global de IBM, de fca0000, y en los SET24 (Modems, de IMOEN) y SET04 (Metodos de hacking, de warezzman!!!). Que bien... pero no me satisfacen. ­Yo quiero mas informacion! El presente texto pretende ofrecer una vision global del confuso concepto de mainframe. La informacion aqui contenida no siempre es correcta ni objetiva (menos da una piedra). 2. Que es un mainframe? ------------------------ Eso me pregunto yo. Despues de dudar de mi propia idea de mainframe, y tras buscar en el Google, llego a la conclusion de que en Internet hay demasiada informacion y ningun metodo automatico para resumirla al gusto de uno mismo. Asi que he intentado resumir las referencias del apartado final (y otras que no menciono). Y este es el resultado. Etimologicamente, mainframe se refiere a la estructura o sistema (frame) principal (main), en referencia a la convergencia en un solo bloque principal de las diferentes unidades (procesamiento, comunicacion, datos...) que tuvo lugar con los primeros mainframes. El concepto suele aplicarse sobretodo a ordenadores grandes en general, variando entre miniordenadores y macroordenadores segun la definicion. Los originales ocupaban grandes salas. Los actuales son como armarios. Otras definiciones no menos precisas, se concentran en el hecho de procesar muchos datos, o procesar datos muy deprisa, o lo equiparan al concepto de servidor grande o al concepto de multiusuario, incluso se llega a referenciar como un sistema operativo en si mismo... un cajon de sastre! Segun el diccionario de IBM, su principal fabricante, un mainframe es 'un ordenador, generalmente de un centro computacional, con amplias capacidades y recursos a los que otros ordenadores pueden ser conectados para poder compartir facilidades (...).' Algo asi como un procesador de la ostia con una gran base de datos y con capacidad de servir el resultado a otra maquina. Otra definicion adecuada y muy flexible es la que sostiene que un mainframe es 'una plataforma de computacion de uso general en continua evolucion y que incorpora en su definicion arquitectural la funcionalidad esencial requerida por las aplicaciones a las que va dirigida'. Es una definicion mas basada en el software del cliente que en el hardware. En mi humilde opinion, un mainframe es una gran maquina (o varias) de computacion, los sistemas operativos por los que corre, las arquitecturas de red que lo soportan, y las aplicaciones que ejecuta y que lo mantienen, y que posee una suprema capacidad para almacenar, procesar y compartir enormes volumenes de datos y de procesos de forma altamente rapida y extraordinariamente segura. ¨A que mola? Es un poco larga. ¨Como que no mola? Pues saca tu propia e igualmente valida conclusion despues de repasar la historia de los mainframes y las principales caracteristicas de los actuales. 3. Breve historia de los mainframes ----------------------------------- La historia de los mainframes tiene 60 anos (12 lustros, maldita enye!). Empieza con el nacimiento de maquinas enormes capaces por ejemplo de realizar multiplicaciones en pocos segundos (que ya es mas que muchas personas). P.ej., el SSEC de IBM de 1944, el ENIAC de 1942, BINAC de 1949... Posteriormente, en la decada de los 50's, nacen los ultimos ordenadores basados en tubos de vacio como los IBM 701, 650 y RAMAC 305, y los primeros basados en transistores como los IBM DPS 7070, 1401 y 7000. Consultad la web de IBM para un listado mas completo. A partir de los 60's los mainframes sufren un redisenyo radical. Aparece la serie IBM System/360, un sistema con tecnologia SLT (Solid Logic Tech.), economicamente mas asequible y con mejores prestaciones de almacenamiento, procesamiento y recuperacion de datos. La decada de los 70's trae la serie M de Hitachi y la serie IBM System/370 con los recien nacidos circuitos integrados en placas de silicio. Se incorporan chips cada vez mas miniaturizados y con cableado de circuitos cada vez mas corto, sus sistemas de refrigeracion mejoran notablemente, empiezan a poder utilizar mas de un procesador en paralelo... Los modelos IBM 30xx de la decada de los 80's parece que son mejoras de la serie System/370, con chips con mayores capacidades (p.ej., familia SAMOS) y con innovaciones en refrigeracion y mantenimiento del hardware. Coincidiendo con la expansion y crecientes posibilidades del PC y de las work- stations, empiezan a escucharse malos augurios sobre los mainframes. Por entonces se les llego a dar menos de 10 anos de vida. Los fabricantes empiezan a fusionarse y a reestructurarse. Pero con la llegada de internet, IBM introduce ya en los 90's la serie System/390 y la arquitectura ESCON z/os, dirigida al e-business de grandes empresas, y compuesta de circuitos ultradensos, comunicaciones por fibra optica, capacidades multiplicadas de supercomputacion y de optimizacion de los recursos (procesadores CMOS en vez de procesadores bipolares) que reducen el precio final. Los 90's tambien traen la tecnologia de control en paralelo de los Hitachi MP5800. El exponencial desarrollo de internet y la e-tecnologia ha traido la familia IBM eServer, con sus omnipotentes representantes z900, z800 y z990. Con el anuncio de Hitachi de dejar de fabricar sus mayores modelos Trinium y Pilot se deja el monopolio en manos de IBM. El resto de mercado se lo reparten pocas companias mas, sobretodo asiaticas como Hitachi, Ahmdal, Fujitsu... Las joyas actuales son los IBM z990. Salen a la venta en 2003. Introducen la puntera tecnologia MCM (MultiChip Module): un modulo mas pequeno que tu mano con 3 millones de transistores ultradensos aislados con tecnologia SOI capaces de procesar 9000 MIPS (millones de instrucciones por segundo). La virtualizacion que tienen les confiere la capacidad de soportar miles de servidores en un solo aparato. Posee exquisitos mecanismos dinamicos de redireccionamiento de recursos (y 256 GB de RAM). Y su seguridad y control de intrusiones y fallos es extrema. ¡¡Sus 32 procesadores creo que lo hacen mejor que mi Pentium II!! Aunque tanta excelencia es muy cara: suelen costar entre 10.000 a 500.000 dolares USA. 4. Y quien puede permitirse unas maquinas tan caras? ----------------------------------------------------- Los mainframes son sistemas-maquinas-servidores que gestionan el procesamiento diario de cantidades desorbitadas de datos y de modo concurrente. Por ello, son maquinas utilizadas basicamente por empresas que generan ese tipo de datos y que pueden pagar tantos millones (principalmente aerolineas y empresas de transporte, holdings bancarios, grandes almacenes...), centros superiores de investigacion privados y publicos, e instituciones publicas civiles y militares. No obstante, en el terreno de la investigacion tambien tenemos a los monstruos capaces de realizar predicciones y simulaciones metereologicas, sismicas, militares, geologicas, fisicas... que no por grandes se llaman mainframes. La mayor centralizacion del uso de mainframes para empresas privadas reside en las grandes capitales economicas y politicas (Madrid y Barcelona en el caso de Espana). A pesar de crecer el volumen de transacciones y el mercado de negocio de estas empresas, que en ultima instancia se procesa en los mainframes, el maldito capitalismo subsubcontratista privado y amoral, se concentra en explotar y despedir al personal que lo mantiene funcionando. 5. Principales caracteristicas de un mainframe ---------------------------------------------- Intentar encontrar puntos comunes a todos los mainframes actuales es tarea dificil. Basicamente son las siguientes, no necesariamente todas ni en el orden expuesto (ten en cuenta la definicion dinamica del mainframe segun el fin al que se destina): - Aspecto: Las maquinas suelen ser del tamano de un armario o estanterias de biblioteca. Tienen gran ramificacion de conexiones y un sistema de refrigeracion fuera de lo normal (aire y/o agua). (En las referencias hay fotos). - Elevadisima velocidad de ejecucion de instrucciones de maquina (cientos a miles de MIPS; MIPS = millon de instrucciones por segundo). Aqui se pueden englobar varias caracteristicas: 1- Generalmente tienen varias CPU's (hasta una trentena). 2- Se comparten recursos por reasignacion dinamica de procesos al procesador disponible. P.ej., tecnologia IRD de IBM o PCT de Hitachi. 3- Tecnologia VMS (Virtual Machine System): Permite soportar diferentes sistemas operativos en cada maquina virtual. El gran desarrollo de la virtualizacion amplian la memoria disponible y por tanto su poderio. 4- Gran velocidad de I/O. La conectividad entre componentes (CPU o circuiteria de ejecucion, memoria o almacen de datos, y unidades perifericas) esta muy optimizada. 5- Pueden incluso poseer un juego propio y mas amplio de instrucciones de maquina, de registros, de interrupciones... Un ejemplo es el High Level Assembly Language, que nada tiene que ver con el ensamblador para 80x86 que tanto me cuesta seguir. - Elevadisimo numero de accesos a bases de datos sin cabida a la corrupcion de datos por contencion de procesos. Aqui juega un gran papel la tecnologia de la base de datos (DB2, IMS, Oracle...), el soporte (cinta, disco, cartucho, disco optico...), y el metodo de acceso (utilidades del fabricante). Hasta 7 Terabytes a disposicion de la empresa. Hasta varios millones de registros generados al dia a ser procesados en tiempo real (y en batch, ya no te cuento). - Gran numero de usuarios en concurrencia (p.ej., miles de usuarios), gracias a tecnologia TSS (Time Share System). - Uso continuado 365 dias al ano y 24 horas al dia. Permiten la reparacion de fallos sin dejar de dar servicio al usuario. - El mainframe suele ser la maquina de ejecucion (jobs) y de almacen (bases de datos), y el resultado se envia a un terminal conectado (estaciones de tele- working). - Soporta diferentes protocolos y arquitecturas de red y de comunicacion: SNA, TSO, emulacion T3270, TCP/IP, ftp's, intranets y LAN's... Creo que de todo. - Los sistemas operativos soportados suelen ser especiales: z/OS, OS/390, MVS, VM, VSE, WindowsNT, UNIX e incluso Linux (almenos los IBM). - Soportan aplicaciones generalmente programadas en COBOL, REXX, FORTAN, PLI, REXX, SAS, ASM, C, C++, Java, XML... - Utilizan en inteligente sinergia las tecnologias mas punteras en seguridad contra errores internos y contra accesos no autorizados (p.ej. ACL o Access Control List, RACF o Resource Access Control Facility, DES o Data Encrypting Standard, firewalls y gateways, transacciones SSL o Secure Socket Layers, incluso pueden albergar utilidades criptograficas intrinsecas en la propia CPU...). 6. Conclusion ------------- La vaguedad, amplitud y flexibilidad del concepto 'mainframe' hacen de el un sustantivo dificil de utilizar, a la vez que encaja en muchas definiciones. En mi opinion, seria preferible hablar en terminos de sistema operativo o de la plataforma de comunicacion o de hardware que esta siendo utilizando, mas que de mainframe. O incluso de la empresa que lo utiliza. Bueno, amiguetes, espero que os haya interesado. 7. Referencias -------------- 1.- http://www-1.ibm.com/ibm/history/exhibits/mainframe Historia de los mainframes IBM. 2.- http://www-1.ibm.com/ibm/history/documents/pdf/glossary.pdf Dictionary of IBM and Computing Terminology 3.- http://www.mainframes.com/whatis.htm Lo que yo me pregunto: que es un mainframe. 4.- http://www.sdl.hitachi.co.jp/english http://www.amdahl.com Paginas de la principal competencia de IBM. 5.- http://www.thocp.net/hardware/mainframe.htm Excelente web sobre la historia de la informatica. Visitadla! 6.- http://www.ibm.com Miles de manuales tecnicos de productos IBM (serie RED books). -[ 3x04 ]-------------------------------------------------------------------- -[ interpolando ]------------------------------------------------------------ -[ by Fca0000 ]------------------------------------------------------SET-29-- /* Hola a todos, ninios y ninias. Bienvenidos a otra excitante leccion del profesor Siesta. Nuestro tema de hoy va a consistir en la imposibilidad de la interpolacion numerica.Este es un tema para el que son necesarias unas bases matematicas de las que se estudian cuando tiene 15 anios, que es aproximadamente cuando se estudian polinomios en una variable. Para los que lo han olvidado (o nunca lo han sabido), un polinomio de grado-n es una funcion inyectiva, continua, derivable hasta n veces, con dominio R (los numeros reales) y campo R o un subconjunto suyo, y que se expresa como constantes multiplicativas de potencias de la variable. Esto quiere decir mas o menos que: -se definen como f(x)=a*x^n + b*x^(n-1) + c*x^(n-2) + ...+ t*x^2 + u*x + v Por supuesto, el simbolo '^' significar elevar a la potencia, o sea, multiplicarlo por si mismo tantas veces como indique el exponente) -la variable x puede tomar cualquier valor Real. Esto incluye valores como 1, 5, 0, -17 , 24/5 , PI, raiz cuadrada de 2, raiz sexta de 17 -en cambio, valores no permitidos de x son: infinito, raiz cuadrada de -1 , matrices, conjuntos de numeros, valores de 2 dimensiones, y otros bichos raros -cuando se toma una variable x y se le aplica la funcion f(x) se obtiene un valor y. Normalmente se representa en un sistema de coordenadas, con una abcisa x y una ordenada y. Si, ese dibujo que tiene una raya vertical y otra horizontal y una curva continua. -ser una funcion inyectiva significa que para un valor de x solo puede haber un valor de y. Por ejemplo, una circunferencia no puede provenir de un polinomio porque existen rayas verticales que cortan a la circunferencia en 2 puntos. -es continua: si tomas un valor de x1 y otro cercano x2, sus respectivos valores y1 , y2 tambien estan cercanos. En otras palabras, no hay saltos al pintar la curva, ni huecos en medio. Por ejemplo: f(x)=x+9 f(x)=x^2 - 1 f(x) =x^400000 + x^ 399999 f(x) = (x-2) * (x+2) f(x) = (x^4)/3 + 2*(x^3)/3 + 3*(x^2)/2 + 4*x + 5 f(x)=7 Pero NO son polinomios: f(x) = 88*(x-5)/(x^4) f(x) = sqr(x) , donde sqr es la raiz cuadrada. f(x) = x^x f(x)= 2^x f(x) = cos(x) , donde 'cos' es la funcion coseno Lo que trato de mostrar aqui es que cualquier funcion cuyos datos sean todos valores enteros (numeros sin decimales, vamos) es posible expresarla como un polinomio Por ejemplo: si f(1)=2 , f(2)=4, f(3)=6, f(4)=8, f(5)=10, f(6)=12 , cuanto crees que vale f(7) ? La respuesta logica es 14, pues f(x)=2*x Otro ejemplo: f(1)=1, f(2)=4, f(3)=9, f(4)=16, f(5)=25, f(6)=36, f(7)=49, cuanto crees que vale f(8) ? Esta vez la respuesta logica es 64, pues f(x)=x^2 Seguro que es mas dificil si uso polinomios con mayores exponentes de x, y los valores de las constantes las uso negativas y con fracciones (decimales). Pero no se trata aqui de complicarnos la vida. Una aplicacion inmediata es cuando se usa f(x)=g(f(x-1)) por ejemplo, para hallar el siguiente de una serie de numeros. Esto es, en los que cada numero depende solamente de su posicion en la lista. Vamos alla: cual es el numero siguiente en esta serie: 2, 4, 6, 8, 10, 12, ? La respuesta logica es 14, pues siguiente(x) = f(x) , siendo f(x)=x*2, siendo x su posicion en la lista. Y en esta serie: 0.0001 , 0.0004, 0.0009, 0.0016, 0.0025, 0.0036, 0.0049, ? La respuesta es 0.0064 , y aqui f(x)=(x^2)/10000 Bien, pues ahora supongamos que tenemos unos numeros de serie de un programa, o unos numeros de recarga de tarjetas de moviles, o simplemente un test psicotecnico de esos en los que piden cual es el numero que sigue a otros. Concretando, la cuestion se reduce a: partiendo de una serie de numeros (tan larga como se quiera) nos piden averiguar el siguiente. Bueno, pues la solucion es 'cual quieres que sea?' En efecto, cualquier numero puede seguir la secuencia. Por eso, si alguien me da una lista de 25 numeros para recargar tarjetas de pre-pago de moviles yo soy capaz de decir cual es el siguiente numero: 220 (pues este es mi numero favorito), y soy capaz de demostrarlo. Por supuesto que tambien puedo demostrar que es cualquier otro numero, por eso no me sorprendo cuando me dicen el siguiente numero y no coincide con el mio. La demostracion mas convincente es dar la formula: N +----- N \ --------- \ | | f(x)= \ { Y *| | (X - X) / } / i | | j / (X - X) / | | / i j / | | +------ j=1 i=1 j!=i Que quiere decir este dibujo? El primer simbolo se llama sumatorio. Quiere decir tomar los valores desde 1 hasta N , hacer algo con cada uno de ellos, y al final sumarlos todos. El segundo simbolo se llama producto multiple (el nombre correcto seria productorio). Quiere decir tomar los valores desde 1 hasta N , pero solo si i es distinto de j, hacer algo con ellos , y luego multiplicarlos todos. Cada vez que aparece X o X quiere decir tomar el valor i j de X en la posicion i-esima , es decir: la primera, la segunda, la decimo-septima (es totalmente incorrecto decir diecisieteava; eso significa otra cosa) o la 127-esima. Similarmente, Y es el valor conocido en el punto X i i Tomemos la serie 1,2,3,4 . El siguiente valor es 220. No te lo crees? Dicho de otro modo: f(1)=1, f(2)=2, f(3)=3, f(4)=4, f(5)=220 Para verlo, usamos este poligono interpolador, de acuerdo con la formula que hemos dicho antes: f(x)= { 1 * [ (x-2)*(x-3)*(x-4)*(x-5)]/[ (1-2)*(1-3)*(1-4)*(1-5)] } + { 2 * [(x-1)* (x-3)*(x-4)*(x-5)]/[(2-1)* (2-3)*(2-4)*(2-5)] } + { 3 * [(x-1)*(x-2)* (x-4)*(x-5)]/[(3-1)*(3-2)* (3-4)*(3-5)] } + { 4 * [(x-1)*(x-2)*(x-3)* (x-5)]/[(4-1)*(4-2)*(4-3)* (4-5)] } + {220* [(x-1)*(x-2)*(x-3)*(x-5) ]/[(5-1)*(5-2)*(5-3)*(4-5) ] } Efectivamente f(1)= { 1 * [ (1-2)*(1-3)*(1-4)*(1-5)]/[ (1-2)*(1-3)*(1-4)*(1-5)] } + { 2 * [(1-1)* (1-3)*(1-4)*(1-5)]/[(2-1)* (2-3)*(2-4)*(2-5)] } + { 3 * [(1-1)*(1-2)* (1-4)*(1-5)]/[(3-1)*(3-2)* (3-4)*(3-5)] } + { 4 * [(1-1)*(1-2)*(1-3)* (1-5)]/[(4-1)*(4-2)*(4-3)* (4-5)] } + {220* [(1-1)*(1-2)*(1-3)*(1-5) ]/[(5-1)*(5-2)*(5-3)*(4-5) ] } calculando f(1)= { 1 * [ 24 ]/[ 24 ] } + { 2 * [ 0 ]/[ -6 ] } + { 3 * [ 0 ]/[ 4 ] } + { 4 * [ 0 ]/[ -6 ] } + {220* [ 0 ]/[ 24 ] } O sea, f(1)=1*24/24 + 0 + 0 + 0 + 0 = 1 Igualmente f(2)=2 , f(3)=3, f(4)=4, y f(5)= { 1 * [ 0 ]/[ 24 ] } + { 2 * [ 0 ]/[ -6 ] } + { 3 * [ 0 ]/[ 4 ] } + { 4 * [ 0 ]/[ -6 ] } + {220* [ 219 * 218 * 217 * 216 ]/[ 219 * 218 * 217 * 216 ] } O sea, f(5)=0+0+0+0+ 220 = 220 Como queriamos demostrar. Es posible que la gente a la que se lo cuentes no puedan entenderlo. Bueno, las matematicas son sencillas cuando se tienen los conceptos claros. Aqui no hay mas que 4 operaciones: sumas, restas, multiplicaciones y divisiones. Esta funcion es una curva algo asi: 220| / | | | | | | | | | | | / | | | | | | | | 4| / | / 3| / | / 2| / | / 1| / |/ +-+-+-+-+-+------- 1 2 3 4 5 Otro ejemplo mas sencillo. Si un crio de 2 anios bebe 0 litros de cerveza al mes, y un anciano de 99 anios bebe 0 litros de cerveza, ?Cuantos bebe un chico de 23 anios? La solution, por supuesto, es 220 Simplemente porque la grafica de consumo de cerveza verifica que f(1)=0 f(99)=0 f(20)=220 La funcion que cumple esto es: f(x)= 0.0 +0.0 * ( (x-23.0)*(x-99.0))/( (1.0-23.0)* (1.0-99.0) ) +220.0 * ((x-1.0)* (x-99.0))/((23.0-1.0)* (23.0-99.0)) +0.0 * ((x-1.0)*(x-23.0) )/((99.0-1.0)*(99.0-23.0) ) Claro que esto dice que un chaval de 4 anios bebe 37.5 litros, pero las matematicas no mienten... a menos que se les obligue. Para finalizar doy un programa que dice la funcion que pasa por unos puntos (x,y) Cambia los parametros y sorprende a tus amigos ! Conviertete en el centro de atraccion de las fiestas ! Una diversion sana y barata ! */ /* Este programa averigua una funcion que es capaz de interpolar unos valores. Sirve para demostrar que el siguiente numero en la secuencia 10, 20, 30, 40, 50, ??? debe ser 220 Si quieres, modifica los valores y[1], y[2], y[3], .... Luego compila el programa y ejecutalo por primera vez. Escribira en pantalla una funcion float f(x) .... Pega esas lineas otra vez en el codigo; compila y ejecuta de nuevo, y fijate en las ultimas lineas. Verificaran que esta funcion cumple los requisitos, y ademas mostrara otros valores */ #include #include #define N 6+1 /* pega entre esta linea */ /* --------------------- */ float f(float x) { float f; f=0 + 10.00 * ( (x-2.00)*(x-3.00)*(x-4.00)*(x-5.00)*(x-6.00) )/( (1.00-2.00)*(1.00-3.00)*(1.00-4.00)*(1.00-5.00)*(1.00-6.00) ) + 20.00 * ( (x-1.00)* (x-3.00)*(x-4.00)*(x-5.00)*(x-6.00) )/( (2.00-1.00)* (2.00-3.00)*(2.00-4.00)*(2.00-5.00)*(2.00-6.00) ) + 30.00 * ( (x-1.00)*(x-2.00)* (x-4.00)*(x-5.00)*(x-6.00) )/( (3.00-1.00)*(3.00-2.00)* (3.00-4.00)*(3.00-5.00)*(3.00-6.00) ) + 40.00 * ( (x-1.00)*(x-2.00)*(x-3.00)* (x-5.00)*(x-6.00) )/( (4.00-1.00)*(4.00-2.00)*(4.00-3.00)* (4.00-5.00)*(4.00-6.00) ) + 50.00 * ( (x-1.00)*(x-2.00)*(x-3.00)*(x-4.00)* (x-6.00) )/( (5.00-1.00)*(5.00-2.00)*(5.00-3.00)*(5.00-4.00)* (5.00-6.00) ) + 220.00 * ( (x-1.00)*(x-2.00)*(x-3.00)*(x-4.00)*(x-5.00) )/( (6.00-1.00)*(6.00-2.00)*(6.00-3.00)*(6.00-4.00)*(6.00-5.00) ) ; return f; } /* --------------------- */ /* y esta linea */ main(int argc, char *argv[]) { int i=1, j=1, t; float x[N], y[N]; for(i=0;i