jueves, febrero 26, 2009

Un poco de relajo...

Hola chic@s, Aquí estamos otra vez, pero hoy con algo relajante.

A día de hoy el camión "normal" más potente del mundo es el Volvo FH16 700 que como su propio nombre indica tiene 700 cv.



El caso es que para darlo a conocer Volvo ha hecho el típico jueguito Flash y creo que está bastante logrado. Sólo hay que usar dos teclas (adelante y atrás) y se trata de hacer un recorrido sin perder la mercancía. El sitio oficial del juego es: http://www.strongesttruck.com/





Hay una fechas señaladas en las que a los 10 primeros les regalan una cazadora de cuero. Todavía quedan 7 intentos, los más próximos el 4 y el 18 de marzo.

Por si alguien quiere compararse estos son mis tiempos:

La primera vez que no sabía de que iba la cosa: 103.521 puntos y he llegado con 6 objetos.
La segunda vez 103.847 puntos.
Tercera vez: 105.197 puntos.
4ª: 179.591.
Luego he seguido jugando un rato y mi actual récord: 44 segundos 70 décimas con los 10 objetos: 193.891 puntos (a 9.000 puntos del premio).

¿Quieres intentarlo? ¿Que puntuación consigues?

Saludos.

martes, febrero 24, 2009

Mono project

Han pasado más de cuatro meses y ya era hora de volver a la página principal del proyecto MONO.





Para el que no sepa de que va este proyecto, se trata de llevar la plataforma .NET a sistemas operativos diferentes a Windows como son GNU/Linux, Mac OSX, etc.

Además de ello, también proporcionan un IDE para el desarrollo .NET en Linux y Mac OSX. Se puede descargar aquí.

Desde el principio el proyecto tuvo su controversia. Algunos opinaban que Microsoft estaba detrás y que perjudicaba a Java que ya existía como opción multiplataforma.
Lo que si podemos decir es que múltiples aplicaciones que inicialmente se pensaron para Windows pueden estar disponibles para sistemas operativos Linux y UNIX gracias a Mono. Para muestra un botón: aquí hay unas cuantas aplicaciones (comerciales algunas, libres otras) corriendo con mono sobre Linux: http://mono-project.com/Screenshots

Más información en la web del proyecto mono: http://www.mono-project.com/Main_Page

Saludos.

lunes, febrero 23, 2009

Small Basic

¿Echáis de menos aquel simpático lenguaje que venía con el MS-Dos (gwbasic y luego qbasic)?
Siempre podréis bajar los intérpretes y trabajar con él en Windows:

Por ejemplo aquí tenéis el interprete gwbasic y programas .bas: http://www.geocities.com/KindlyRat/GWBASIC.html

Ahora bien, hoy en día los lenguajes modernos, incluso los de scripting tienen una sintaxis orientada a objetos.

Microsoft nos proporciona por la patilla el intérprete "Small Basic" con el que no haremos un gran programa, pero tenemos algo rápido para automatizar operaciones, crear alguna función, o símplemente para propósitos educativos.



Zona de descarga: http://www.microsoft.com/downloads/details.aspx?FamilyID=b006d58d-c2c7-44ad-936b-e7e2d7de793e&DisplayLang=en

Y el sencillo manual de apenas 62 hojitas: http://download.microsoft.com/download/9/0/6/90616372-C4BF-4628-BC82-BD709635220D/Introducing%20Small%20Basic.pdf

Por cierto, también hay una tortuga tipo logo.

De todas formas tiene también sus inconvenientes. Por una parte requiere la instalación previa del microsoft framework 3.5. Por otra, un lenguaje de este tipo nunca será tan fácil de entender por un niño comparado con un simple PRINT "HOLA MUNDO".

Saludos.

domingo, febrero 22, 2009

Adquisición de chatarrilla

¡Hola que tal!

Quería comentaros una curiosa compra que he realizado este fin de semana en Bilbao. He estado viendo la exposición de Takashi Murakami en el Guggenheim, y la verdad es que está muy bien pero podemos aprovechar el viaje un poco más...

Si tenéis un poco de tiempo podéis pasar al otro lado de la ría, sacar unas buenas fotos y de paso, buscar una tienda de antigüedades y segunda mano que hay poco antes de llegar al Ayuntamiento.

Esto es lo que he comprado por 7,5 euros (el precio "cómpralo ya" en ebay es de 30 euros).




Es una CASIO MINI CM-602 de 1973.

Sólo puede sumar, restar, multiplicar y dividir, y de "mini" no tiene nada.

Tiene dos cosas bastante curiosas:

1.-El dígito cero sólo llega a la mitad de la altura del resto de dígitos. Cuando lo he visto he pensado que estaba averiado, pero no, las primeras calculadoras "mini" son así. Me imagino que es para distinguirlo fácilmente del ocho.

2.-Tiene un problema de diseño que hace que a veces sea difícil teclear un dígito varias veces sin pasarse.

Más detalles: http://www.teclas.org/maquina.php?mm=C089

Saludos.

jueves, febrero 19, 2009

Retro-informática

Hace algo más de un año un coleccionista de procesadores puso un comentario en barrapunto y le llovieron burlas por todos lo sitios.

Este era el comentario del coleccionista...


Y podéis ver en la fuente original las burlas.

Yo creo que es una afición como otra cualquiera, no hace daño a nadie, y además algunos procesadores pasarán a la historia por lo que tampoco hay que descartar su valor en el futuro.

Ahora bien, puestos a coleccionar tal vez sea más interesante conseguir las máquinas enteritas y operativas.

A esto se ha dedicado el creador de esta web tan bonita: http://www.vintage-computer.com/index.shtml.



Realmente este tío se ha hecho con una super-colección y lo bueno es que ha publicado la valoración actual estimada por lo que se convierte en una web de referencia en caso de querer agenciarnos una antigualla.

Destaca el Kenbak-1 de 5.000 dólares que en su tiempo costaba 750 dólares.
Y son muy curiosos los primeros "portátiles" como el Osborne1.

El Kenbak es especialmente valioso por considerarse la primera computadora personal. En el 2006 escribí un post sobre él:
http://aitoreus.blogspot.com/2006/09/la-primera-computadora-personal-el.html

Ya no me acordaba pero en ese post puse que vi una venta en ebay de un Kenbak-1 por ¡¡¡10.850 dólares!!!.

Saludos.

miércoles, febrero 18, 2009

Controla los procesos de la base de datos II




Hace unos meses comentaba que en cualquier base de datos es importante controlar los procesos pesados para saber donde están los cuellos de botella.

Aquella vez utilizamos el DBMS_SUPPORT.START_TRACE_IN_SESSION

Hoy vamos a hacer algo parecido pero de otra forma. El objetivo va a ser el mismo: Tracear una sesión en lugar de todo el sistema. De esta forma las trazas serán de menor tamaño y más fáciles de analizar.

Lo primero es abrir dos sesiones Oracle. Una es la que lanza el proceso que queremos controlar. La otra para activar las trazas.

Para activar las trazas abrimos hay que iniciar sesión como dba. Podemos usar el svrmgr, el SQL*Plus, el SQL Worksheet, etc.

svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> select v$process.SPID, v$process.USERNAME from
2> v$process, v$session
3> where v$session.PADDR=v$process.ADDR
4> order by v$session.logon_time;

SPID USERNAME
--------- ---------------
675 oracle
1857 oracle
16521 oracle
16522 oracle

Esa select podemos ejecutarla dos veces. Una, antes de lanzar el proceso a analizar, y otra después. De esta forma estaremos seguros del SPID del proceso.

Si el SPID del proceso es el 16521...

SVRMGR>oradebug SETOSPID 16521
Statement processed.

SVRMGR>oradebug event 10046 trace name context forever, level 12

La segunda sentencia incluirá "bind variables" en el fichero de traza.


Más información en las notas técnicas de ORACLE:

Note 115675.1 How to Trace Sessions Using Event 10046 With Level xx in Oracle Applications

Note 76338.1 Tracing Tips for Oracle Applications

Saludos.

martes, febrero 17, 2009

Criptografía III

Ayer era muy tarde y me arme un pequeño lío. Hoy cuando he vuelto a leer el post me he dado cuenta y ya está corregido.

De todas forma voy a resumir lo aprendido hasta ahora:

Algoritmo de cifrado DES: no usar ni para cifrar la lista de la compra.

Característica principal: algoritmos por bloques. Bloque corto de 8 bytes.

Es un desastre. Se diseño por intereses oscuros con una clave muy corta. No utilizar ni de palo. Creo que los chavales de 10 años desencriptan DES con calculadoras programables. Nada más que decir.

Algoritmo de cifrado Blowfish: con una clave larga mejor que mejor.

Característica principal: algoritmos por bloques. Bloque corto de 8 bytes.

Bien, dependiendo de la longitud de la clave que se utilice.
Lo único que el bloque a cifrar es sólo de 8 bytes. Para mensajes más largos hay que pensar en el algoritmo CBC (Cipher Block Chainig Mode o como lo he visto traducido: modo de encadenamiento de bloques cifrado).

Cipher Block Chaining Mode (modo de encadenamiento de bloques cifrado):

Característica principal: En sí mismo no cifra. Hay que utilizarlo conjuntamente con un algoritmo de cifrado.

Permite sobrepasar el límite en el tamaño del bloque que puede tener el algoritmo de cifrado.

Mañana más.
Saludos.

lunes, febrero 16, 2009

Criptografía II

En el post de anteayer, comentaba que el algoritmo DES a secas tiene sus problemas:

1.-Hoy en día es totalmente inseguro. Cualquier PC es un maquinón comparado con lo que había en los años 70 y por fuerza bruta revienta lo que le eches.

2.-La clave es cortísima. El programita Perl que vimos el otro día es el que ponen como ejemplo. Ya vimos que lo que cifras tiene que tener la misma longitud que la clave. Me imagino que en un texto largo, los múltiples cifrados con la misma clave dan muchas pistas al descifrar. También se pueden utilizar diferentes claves (letras de un texto conocido por ejemplo) pero esto facilita el ataque por diccionario.

3.-Ocurre otra cosa que también es un problema: El mismo texto claro (imaginaros una palabra) con la misma clave da el mismo texto cifrado. Esto da una pista buenísima para el espía que quiere descifrar sin clave. Imaginaros todos los artículos que se repiten en este mismo párrafo.

4.-Etc. etc. y más cosas.

Vamos a ver una mejora:

Lo que veíamos anteayer (DES) era un cifrado por bloques. Hay que dividir el texto a cifrar en bloques de tamaño fijo y aplicar el algoritmo de cifrado DES sobre cada bloque. Los problemas son los que he mencionado arriba y otras más.

Ahora pensad lo siguiente: Cifro el primer bloque. Esto me da un bloque cifrado. Ahora, antes de empezar a cifrar el segundo bloque, aplicamos una operación XOR a nivel de bits entre el cifrado del primer bloque y el texto en claro del segundo bloque. Y así sucesivamente. Eso hace el Cypher Block Chaining (CBC) inventado por IBM en 1976.

Resultado: Aunque se repitan palabras en el texto a cifrar, el algoritmo obtiene cifrados diferentes. Aunque sea más difícil de ver, también complica el análisis de la clave común entre los bloques, ya que no se obtiene a partir del texto en claro.

Otra mejora:

Pues un señor muy majo llamado Bruce Schneier diseñó en 1993 un algoritmo de cifrado por bloques (como DES) que no patentó y dejó para libre uso. Lo llamó Blowfish. La ventaja de Blowfish respecto a DES es que la clave en lugar de ser de 56 bits (8 bytes - 8 bits) puede ser desde el mínimo de 8 bytes (64 bits) hasta los 56 bytes (448 bits). Por lo tanto puede ser mucho más segura que DES.

Y ahora la acción:


1.-Igual que hicimos el sábado instalamos el módulo perl Crypt::Blowfish que podemos bajar de aquí: http://search.cpan.org/~dparis/Crypt-Blowfish-2.10/Blowfish.pm.
También hace falta el módulo Crypt::CBC, pero éste nos lo instalamos el otro día. De todas formas, para el que no lo hizo lo puede bajar de http://search.cpan.org/~lds/Crypt-CBC-2.30/CBC.pm

2.-Arreglatelas con sudo para llevar el contenido a /usr/lib/perl/5.8.8/Crypt-Blowfish.

3.-Descomprime y descompacta el contenido. Las instrucciones exactas para esto y lo anterior están en el anterior post.

4.-Ahora las instalación del módulo:
4.1-sudo perl Makefile.PL
4.2-sudo make
4.3-sudo make test
4.4-sudo make install

5.-El programa encriptador:



6.-El resultado:

¿Si el cifrado ha sido con Blowfish, qué aporta el módulo Crypt::CBC?

Podíamos haber utilizado únicamente el módulo Crypt::Blowfish, pero tiene una pega: Puedes utilizar una clave larga (hasta 448 bits), pero el bloque de datos sólo puede ser de 8 bytes.

Lo que aporta el módulo Crypt::CBC es la capacidad de encriptar un texto de longitud arbitraria y además modificando el texto (XOR) antes de encriptarlo, como hemos visto arriba.

Uff, es ¡tardísimo!


Saludos.

sábado, febrero 14, 2009

Criptografía

Hola amig@s, Vuelvo a la carga.

Si habéis estudiado algo relacionado con la informática seguro que conocéis denominaciones de algoritmos de cifrado, pero igual que a mi se os habrán olvidado las características principales.

Hagamos memoria...

Algoritmo DES o "Data Encryption Standard" (Cuidado, hoy en día se considera inseguro. Se puede descifrar sin la clave en menos de 24 horas).

Diseñado por IBM, se elige como algoritmo FIPS (Federal Information Processing Standars) en 1976. Estos estándares públicos eran para agencias no militares y contratistas del Gobierno.

Desde el principio hubo polémica. La clave a utilizar es muy muy corta. Sólo 8 bytes (equivalente a 8 letras). De los 8 bytes (64 bits), 8 son para paridad por lo que la clave efectiva es de 56 bits. Por lo que se dice en wikipedia "es ampliamente aceptado" que la NSA redujo la longitud para tener posibilidades de éxito en caso de utilizar la fuerza bruta contra el cifrado. Vamos, que pensaban que ellos podrían romper una clave de 64 bits con fuerza bruta, mientras que el resto del mundo no iba a poder todavía.

También se sospechaba que hubiera una puerta trasera para que la NSA pudiera descifrar fácilmente. Se hablaba de S-Box manipulada con vulnerabilidad conocida por la NSA. Hoy en día se piensa que no era así. En 1990 se publica unos trabajos conocidos como "criptoanálisis diferencial". Un trabajo que daba luz sobre la forma en la que se podía abordar un ataque al cifrado. Resultó que la S-Box de DES era la más robusta que se podría haber diseñado. En 1994 se publicó el criterio del diseño original demostrando que IBM ya conocía la técnica de criptoanálisis diferencial y que la NSA le obligó a mantener el secreto.

Fuente: http://es.wikipedia.org/wiki/Data_Encryption_Standard
Más información: http://es.kioskea.net/contents/crypto/des.php3
Documento completo de DES en: http://www.elhacker.net/Textos1.htm

¡Vale ya de rollos! Vamos a utilizarlo con Perl.

Para instalarlo en Windows. Descargarlo de aquí y seguir las instrucciones.

En las distribuciones GNU/Linux y en la mayoría de UNIX el Perl viene "de fabrica", pero aún así tendremos que instalar un módulo llamado Crypt::DES

Vamos a esta dirección de CPAN y nos lo descargamos: http://search.cpan.org/~dparis/Crypt-DES-2.05/
Lo dejamos donde queramos. Es un fichero .tar.gz (o sea, primero empaquetado y luego comprimido).

Lo descomprimimos...
gzip -d Crypt-DES-2.05.tar.gz

Ahora desempaquetamos...
tar -xof Crypt-DES-2.05.tar

Creo el directorio /usr/lib/perl/5.8.8/Crypt-DES-2.0.5
y coloco los ficheros desempaquetados en él.

Voy al directorio y...

perl Makefile.PL


make

make test

make install

¿Problemas con la instalación?

1.-Recordad que en Ubuntu para ser root hay que poner por delante el "sudo". Creo que lo he tenido que utilizar para todo.


2.-Ya sabéis que soy un poco desastre :-( Me suena, pero no recuerdo con seguridad si me ha dado un error el make install por no tener instalado el módulo Crypt::CBC. Si os da el error, ir a http://search.cpan.org/~lds/Crypt-CBC-2.30/CBC.pm y lo instaláis como he descrito la instalación de Crypt::DES.


Ahora que está instalado todo bien, entremos en materia

Editamos el siguiente programita Perl que encripta un texto de 8 bytes (limitación de DES).

El texto es: "texto8by"



Y la ejecución del programita:



Y ahora la pregunta del millón:

¿De qué sirve un algoritmo que cifra sólo 8 bytes? Si el alfabeto lo componen 256 letras, un byte (8 bits) se corresponderá con una letra. O sea que hablamos de un mensaje de 8 letras.

Deberíamos completar el programita para que pueda aceptar un mensaje de longitud variable y que vaya cifrando cada letra.

Otra opción es utilizar otro módulo Perl que hace el trabajo por nosotros. Esto en el próximo post.

Saludos.

jueves, febrero 12, 2009

Pacman

Esto del Ubuntu/Kubuntu y GNU/Linux en general es la leche.
Me preguntaba si...¿alguien se habrá molestado en desarrollar un pacman?

Probamos...
#pacman
Me sale el típico mensaje de que no está instalado, pero que si quiero instalarlo que haga sudo apt-get install pacman.

Pues muy bien...
#sudo apt-get install pacman

Y la prueba...
#pacman


Ah, ¡muy bien!
Así nos podemos relajar un poquito comiendo bolitas.

Saludos.

miércoles, febrero 11, 2009

Pequeña cosita en Ubuntu...



Hace un par de semanas decidí instalar Ubuntu en mi puesto de trabajo. Sí, es verdad que hay mucho software para XP, pero en mi caso tengo 3 PC-s en la mesa y no voy a prescindir de nada, simplemente voy a tener más posibilidades.

Quiero explicar una cosa curiosa que ha ocurrido y que creo que es mejorable. Es más, no sé como se les ha podido pasar...

En octubre ya os dije que la instalación de Kubuntu en casa fue perfecta, ya que detectó la configuración de red automáticamente y a correr.

Ahora sin embargo no ha sido así de perfecto. La diferencia sólo ha sido que es un Ubuntu conectado a una red corporativa con IP fija.

Esto es lo que ocurre:

1-Arrancas Ubuntu.
2-Vas a la configuración de red y compruebas que ha detectado bien tu tarjeta. Editas la configuración, introduces la IP, la máscara de subred, el gateway y ya tienes red.
3-Vas al entorno de red, seleccionas un servidor Windows, te identificas y ya tienes acceso a tus unidades de red Windows. Hasta aquí todo perfecto.
4-Al día siguiente arrancas tu Ubuntu y ¡sorpresa! Ha perdido la configuración de red. Vuelta a empezar en el paso 2.

Es verdad, es una tontería darle demasiada importancia.
Editas el fichero /etc/network/interfaces
y pones algo así (por ejemplo):

iface eth0 inet static
address xxx.xxx.xxx.xxx
network xxx.xxx.xxx.0
netmask 255.255.255.0
broadcast xxx.xxx.xxx.255
gateway xxx.xxx.xxx.xxx

Pero ¿no os parece un poco fuerte que un usuario "normal" tenga que editar el ficherito a pelo? No recuerdo si había que utilizar el chmod para los permisos, pero aún así pedirle al usuario que introduzca las líneas anteriores es demasiado.

Además, teniendo en cuenta que el usuario ya ha introducido la configuración de red parece más lógico que por defecto se aplique el cambio sin más. Si luego quiere volver a la situación inicial ya sabe hacerlo.

Por último, no estaría mal que el fichero interfaces tuviera en forma de comentarios unas cuantas configuraciones tipo.

Para aquel que haya llegado a este sitio intentando solucionar el problema, aquí hay un montón de configuraciones: http://www.cyberciti.biz/faq/setting-up-an-network-interfaces-file/

Saludos.

martes, febrero 10, 2009

Microhobby

En aquella época no había Internet pero existían los fanzines y las revistas revistas especializadas. Quiero mencionar una revista especial como Microhobby.

Yo de chaval no tenía paga como los niños de ahora, y por lo tanto, no tenía acceso a estas cosas. Ahora en cambio, gracias a entusiastas y a la empresa Hobby Press S.A. que autorizó la publicación de Microhobby en la web tenemos total acceso a todos los números.

Si tenéis algún antiguo juego no dudéis en buscarlo en el buscador de Microhobby que seguro que en su día publicaron trucos interesantes.

Yo por ejemplo he buscado el Goody y esto esto es una muestra:

lunes, febrero 09, 2009

MS-DOS en GNU/Linux

Al final las "All star" van a tener que esperar porque acabo de llegar del trabajo y no son horas.

A veces me gusta recordar aquellos antiguos juegos a los que jugué con mi entonces flamante Olivetti Prodest PC1 con MS-DOS 3.1.

El primer juego lo trajo a casa el campeón triatleta Eneko Llanos que era amigo de mi hermano. Era el Goody de la gran compañía OperaSoft (autores también del gran "Doctor Livingston Supongo"). Los dos son dificilísimos si no conoces las palabras mágicas. En el Goody el truco es teclear "Gody" al principio para tener vidas infinitas.

Goody es un ladrón que quiere robar un banco. Esta web es de un entusiasta del juego y creo que relata perfectamente la atmósfera del juego: http://macedoniamagazine.frodrig.com/8goody.htm

Podéis jugar al remake del Goody: http://goody-the-remake.softonic.com/

Ahora bien, el original es el original, y ¿qué ocurre si tenéis un Linux instalado y queréis recordar aquel viejo juego que tanto disfrutaste de chaval?

Una emulación DOS es lo que necesitas.

Instalación en Ubuntu/Kubuntu:

Lo de siempre. Primero probar si ya está instalado: #dosemu

Nos dirá:
"The program dosemu is currently not installed. You can install it by typing:
sudo apt-get install dosemu"

Pues eso: #sudo apt-get dosemu y en un minuto instalado.

Ejecutar el emulador

Esto es lo más sencillo:

#sudo dosemu


Eso lo que hace es abrir una pantallita ms-dos igual que el emulador en windows.

Cambiar a la disquetera y a jugar...

c:> a:
a:> cd goody
a:> goody



Por cierto, el sonido ¡clavado!

Saludos.

domingo, febrero 08, 2009

Virtualización libre

Esa es la noticia que me he encontrado en eWeek. La publicaron el pasado día 3 de febrero, pero es que tampoco lo visito todos los días.

La noticia dice que VMware lanza el primer escritorio virtual gratis y open source. Creo que en este caso "free" se refiere a gratis en lugar de a libre, pero todo es posible.

La segunda parte de la noticia se centra en destacar los beneficios que proporciona la virtualización del escritorio en un entorno empresarial.

Destacan que el esfuerzo de VMware trata de contrarrestar las distribuciones GNU/Linux que cada vez más incluyen la virtualización en las mismas.

Saludos.

Por cierto,
Mientras escribía este post tenía la tele puesta, es un programa de ETB en el que chavales de coros cantan una canción conocida y han tocado esta...



Esto me recuerda que tengo que comprar unas "All Star" mañana.

sábado, febrero 07, 2009

Minix. De la 00000 hasta la 000068

Hoy vamos a empezar a analizar el código fuente de MINIX.
Para ello tendremos que recordar algunas nociones de C. El código se encuentra en /usr/src/.

Tanembaun ha numerado cada línea de código desde la 00000 hasta la 28864.
De la 00000 a la 00068 corresponden al fichero include/ansi.h

Recordemos que los ficheros .h son ficheros de cabecera. Una aplicación de cierto tamaño se diseña de forma modular. Cuando se hace un módulo en C (fichero .c), se suele preparar también la interfaz de ese módulo (fichero .h).

La interfaz sirve para hacer público al resto de módulos algunas funciones, variables, tipos de datos y constantes. Los módulos que vayan a utilizar ese módulo lo incluirán por medio de un #include="cabecera.h".

El directorio /usr/src/contiene ficheros de cabecera del estándar POSIX.
Incluye 3 subdirectorios:
-sys: ficheros de cabecera POSIX.
-minix: ficheros de cabecera utilizados por MINIX.
-ibm: ficheros de cabecera específicos de IBM PC.

Ansi.h

Hay una serie de ficheros de cabecera que son de propósito general y se procesan en todas las compilaciones de todos los módulos de MINIX.

Ansi.h es uno de ellos. Es el segundo que se procesa siempre. Sólo se procesa antes /include/minix/config.h

Propósito de Ansi.h:
Comprobar si el compilador sigue los requerimientos del C estándar (ANSI C).
El estándar define varias macros que pueden ser testeadas en tiempo de compilación.

Nota: Para entender Ansi.h hay que conocer las directivas del preprocesador.

Un compilador que siga el estándar establecerá __STDC__ = 1.

Lo primero que se hace en Ansi.h es comprobar el valor __STDC__. Si es 1, entonces _ANSI se define como 31459, que significa que sigue el estándar.

Luego hace una comprobación más (considera que si está definido __GNUC__ también es ANSI). Por lo tanto _ANSI se establece a 31459.

Ahora viene lo más importante. En C antes de utilizar una función hay que declararla por medio de un prototipo. En el prototipo se adelantan los tipos de datos que recibe y el que devuelve. En ANSI C es así:

int calcular(int numero1, int numero2)

Pero en otros C-s puede ser así:

int calcular()

Por medio de la macro _PROTOTYPE el preprocesador transformará nuestros prototipos a la forma adecuada.

Por último, en Ansi.h se define _POSIX_SOURCE como valor 1 en función de otras macros.

Saludos.

jueves, febrero 05, 2009

Una migración siempre tiene su complicación




Os voy a contar un caso real que demuestra que por mucho que prepares una migración, Murphy está siempre al acecho y tarde o temprano tus usuarios descubrirán un error.


Si puedes, solucionarás el problema, y después pensarás en lo que puedes hacer la próxima vez para que ese tipo de error no vuelva a ocurrir.

Este error que os presento es prácticamente imprevisible por eso creo que tiene interés.

Hace unos meses realizamos una importante migración en la empresa. Pasamos de Oracle 9i a Oracle10g. Ya dejé constancia de un bug Oracle.
El bug se detecto en las pruebas realizadas en laboratorio (entorno de pruebas) y no resultó muy problemático ya que Oracle lo tenía identificado, había un parche, y también había un patchset superior que no tenía el problema. La cosa salió bien porque había un laboratorio previo a la migración. Lección aprendida de migraciones anteriores.

Ahora bien, para lo que hemos descubierto esta semana no hay laboratorio que valga. Ni hay una estrategia que asegure el éxito.

Resulta que en Oracle, de toda la vida, cuando hacías un GROUP BY el resultado salía ordenado por los campos que componen el GROUP BY.

Pues en Oracle10 esto ya no es así. La explicación que dan es que la ordenación en las versiones anteriores se producía por el plan de ejecución utilizado por el optimizador. En Oracle10g ha cambiado el método y por lo tanto también el plan de ejecución. Todo ello produce que la salida no salga ordenada.

Solución: Modificar los GROUP BY de todas las aplicaciones incluyendo la ordenación ORDER BY.

Solución2: pan para hoy y hambre para mañana, y además no utilizamos las mejoras del optimizador:
Modificar uno de los siguientes parámetros init/spfile:
"_gby_hash_aggregation_enabled" = false
o
optimizer_features_enabled=9.2.0
o
optimizer_features_enabled=8.1.7
Cuidado: Oracle avisa que a pesar de modificar estos parámetros no se puede asegurar la ordenación clásica.

Saludos.

P.D.: más información en el Doc ID ORACLE: 345048.1 ('GROUP BY' DOES NOT SORT IF YOU DON'T USE ORDER BY IN 10G).

miércoles, febrero 04, 2009

Primera compilación MINIX

Jeje, esto del MINIX es un pequeño vicio. Es bastante sencillo pero potente a la vez.

Vamos a probar el compilador C:

Iniciamos MINIX e iniciamos sesión como root.

Ahora a buscar el compilador. Vemos que gcc no está. Probamos cc y ¡BINGO!

Probamos el primer programa obligado editando con el VI el fichero prueba.c

Aviso: En lugar de los símbolos de mayor y menor pongo asteriscos para no confundir el HTML.

#include *stdio.h*
main()
{
printf("Hola mundo");
}

Compilamos...
#cc prueba.c
En este punto el compilador nos avisa que estamos utilizado una sintaxis antigua en la función main. Se solucionaría con main(void) si es que nos molesta el warning.

Y ejecutamos:  #./a.out
Para que diga: Hola mundo.

Muy bien, la cosa pinta bien, pero, y ¿las llamadas al sistema?

Utilicemos la fork. Recordad (lo decía ayer), que la fork sirve para crear un proceso hijo.

Nota: En lugar del símbolo menor he utilizado *menor*, y en lugar del símbolo mayor: *mayor*

void main(void)
{
   int retorno_fork;
   printf("El proceso %d va a crear un proceso hijo", getpid());
   retorno_fork = fork();
   if (retorno_fork () *menor* 0)
      {
      printf("No se ha podido crear el proceso");
      exit(-1);
      }
   printf("Esto lo ejecutan tanto el proceso padre como el hijo");
   if (retorno_fork *mayor* 0)
      {
      printf("Soy el proceso padre y he creado el proceso hijo numero %d", retorno_fork);
      }
   else
      {
      printf("Soy el proceso hijo. Me voy a dormir");
      }
}

Como se ve en el propio código, si la fork devuelve un número negativo algo ha fallado y no se ha creado el proceso hijo.

Luego viene la parte que la ejecutan tanto el padre como el hijo (es lo que está después del fork).

Por último, montamos otra bifurcación. Sabemos que al proceso padre la fork le ha devuelto un número mayor que 0 y que es el pid del proceso hijo. Al proceso hijo la fork le devuelve un 0.

Saludos.

El proceso FORK

El proceso Fork es la única forma que tenemos en MINIX3 para crear un nuevo proceso (por eso es tan importante).

Crea un proceso idéntico al original (proceso padre). Después del Fork, ambos procesos (el hijo y el padre) se ejecutan de forma separada.

El proceso fork devuelve un valor de retorno que es cero en el hijo y en cambio en el padre es el PID del proceso hijo. De esta forma cada proceso sabe si es padre o hijo. Esto es así, porque normalmente el proceso hijo tiene que ejecutar algo diferente al proceso padre.

Respecto a gestión de procesos sólo hay 9 llamadas al sistema más:

waitpid: de esta forma el proceso padre espera a que termine el hijo.
wait: versión antigua de waitpid.
execve: Reemplaza la imagen core de un proceso.
exit: termina la ejecución de un proceso y devuelve el estado.
brk: establece el tamaño del segmento de datos.
getpid: devuelve el pid del proceso.
getpgrp: devuelve el id del grupo de proceso.
setsid: crea un nueva sesión y devuelve el id del grupo de proceso.
ptrace: utilizado para debugging.

Saludos.

lunes, febrero 02, 2009

Llamadas al sistema

Hola chic@s,
Ya lo siento, he andado muy liado y no he tenido tiempo para nada. Mañana me quito una complicación para una buena temporada :-)

Vuelvo al tema de los sistemas operativos...
Intentaré contestar lo mejor que pueda a estas tres preguntas básicas.

¿Qué son las llamadas al sistema?
¿Qué es POSIX?
¿Qué es UNIX?

Las llamadas al sistema son la forma en las que las aplicaciones interactúan con el sistema operativo. Digamos que es el interface entre los programas y el S.O.

POSIX significa "Portable Operating System Interface". Richard Stallman propuso el nombre. Hoy en día es un estándar internacional ISO ISO/IEC 9945-1.
El estándar se desarrolló por parte de la IEEE para lograr que los programas pudieran ejecutarse fácilmente (portarse) en los diferentes UNIX. Es un conjunto mínimo común de llamadas al sistema.

Minix3, HP-UX, Solaris, MacOSX, AIX, BSD/OS, etc. etc. cumplen alguna de las versiones POSIX. Es curioso que haya windows POSIX, y linux no certificados POSIX. No hay que darle demasiada importancia a la falta de certificación ya que hay un tema de pasta por detrás.

Para definir UNIX vamos a dejar de lado los temas legales relacionados con marcas registradas (propiedad de "The Open Group"). Solo decir que IEEE certifica sistemas UNIX en base al cumplimiento de POSIX, y que existe otra certificación que por resultar más barata que se ha convertido en el estándar de hecho. Si quieres saber más...http://es.wikipedia.org/wiki/Single_UNIX_Specification

Ahora si, entremos un poco en materia:

MINIX3 tiene 53 llamadas al sistema principales. Nos dice Tanenbaum que hay unas pocas más, pero que son muy especiales.

Es importante un matiz. El estándar POSIX especifica un número de procedimientos que el sistema debe contener, pero no quiere decir que todas sean llamadas al sistema. En el caso de MINIX hay procedimientos POSIX que se soportan en forma de librerías. También ocurre que algunas llamadas del sistema son simples variaciones de otras y se implementan con una sola llamada al sistema.

Mañana a ver si empezamos a desgranar la llamada más bonita de todas: fork.

Saludos.