Cargando

28 febrero, 2006

Haskell

Haskell es un "lenguaje funcional puro". Mi contacto con el se a basado, solamente, en el empleo de este para la practica de una asignatura. Mientras espero las notas, para poder pedir el titulo y buscarme la vida por fin (ya se que ya podría haberlo hecho, pero "como estudiando no se vive"), a vosotros (quienes seais los que leeis esto) os toca agunatar mis ratos ocioso.

La cosa es que el lenguaje me gustó, sencillo, facil de aprender (al menos lo básico), ... Incluso me dió la sensación de que si le pones delante a alguien que no sepa nada de programación este lenguaje, y otro imperativo u orientado a objetos (que son los que se llevan), si había estudiado matematicas en el colegio, le sería mas facil de aprender este que los otros.

Lo poco que yo he leido no es nada complicado, pero trata (mas o menos) todos los temas necesarios, excepto las monadas, que deben ser un poco paranoicas (si leo algo donde lo expliquen bien ya os lo pasare ;) que se usan para entrada salida y cosas así. Creo que están basadas en teoria de enteros, pero no me hagais mucho caso.

Las principales caracteristicas de este lenguaje son: la evaluacion perezosa, que las funciones son un elemento más, definicion parcial, aparte de otras típicas de muchos lenguajes como puede ser la no necesidad de declaración de tipos (seguro que me dejo mucho en el tintero, esto es lo que me viene ahora a la mente).
  • Evaluación perezosa significa, que sólo evalua lo que necesita evaluar, lo que permite el uso de estructuras potencialmente infinitas, y la no restricción de los tipos de los elementos. Por ejemplo el tipo Integer es el de todos los enteros (y cuando digo todos es TODOS), el interprete o el compilador (hay mas) se encargan de los bits, sin tener que preocuparnos de ir a usar un entero demasiado grande. Otro ejemplo, es que [1..] es la lista de todos los naturales (nuevamente TODOS), el sistema se encarga de generar los que necesite.
  • Que las funciones sean un elemento mas, implica que se pueden almacenar o pasar como parametro, como cualquier otro dato. Esto hace que no nos tengamos que preocupar de pasarlas como punteros. Además se iguala al sistema que usamos en matematicas ya que podemos resolver un problema para x, sin preocuparnos (en general) de que es x, y cuando tenemos la solución sustituirla por lo que queramos.
  • La definicion parcial nos permite definir facilmente funciones en función (valga la redundancia) de otras funciones, asignando valores a los parametros que tengamos, y dejando para la llamada a la nueva función el reto.


Como ya he dicho, es un lenguaje facil de entender (una vez que se entiende ;), que facilita una implementación rápida, y que para (hasta donde se) ser un "lenguaje de laboratorio" tiene bastantes librerias de todo tipo y herramientas, alguna que permite integrar librerias de c en los programas haskell, e incluso hay quien a integrado haskell en programas .NET.

En la pagina de la entrada os dejo un "chuletario" de funciones, que me hice para repasar antes de entrar al examen, donde podreis ver ejemplos que os daran una idea de lo que es haskell (se puede hacer muchisimo mas).


{-RESUMEN DE FUNCIONES-}
{-
Las que funcionan en hugs tal cual carga, sin añadir nada:
Hugs session for:
/usr/lib/hugs/libraries/Hugs/Prelude.hs
/usr/lib/hugs/libraries/Prelude.hs
/usr/lib/hugs/libraries/Hugs/Base.hs

Paquetes instalados:
hugs
libhugs-http
libhugs-hunit
libhugs-missingh

Algunas cosas funcionan diferente (reinstale todo el sistema, asi que seran paquetes mas actuales) de cuando hice la practica. Por ejemplo, al hacer la practica para hacer la raiz de dos, primero tenia que pasarlo a real. Ahora no es necesario.
-}


{-FOKKER y las que he ido recordando sobre la marcha-}

-- sqrt x = Raiz cuadrada de x

raizDe2= sqrt 2

-- sin x = Seno de x
{- Se le pasan radianes, asi que sin 90 da 0.98..., y sin (pi/2) da 1.0-}

senoDe90 = sin 90
senoDePiMedios = sin (pi/2)

-- cos x = Coseno de x

cosenoDePi = cos (pi)

-- sum l = Suma de los elementos de l

sumaDe1a10 = sum [1..10]

-- length l = Nº de elementos de l

longitudDe1a10 = length [1..10]

-- reverse l = Devuelve l al reves

de10a1 = reverse [1..10]

-- product l = Multiplica los elementos de l

factorialDe3 = product [1..3]

-- pi = numero pi con 14 decimales

piCon14 = pi

-- abs x = valor absoluto de x

tres = abs (-3)

-- signum x = el signo de x o 0 si es 0

menos1 = signum (-3)

-- gcd x y = El maximo comun divisor de x e y

dos = gcd 4 6

-- log x = logaritmo neperiano de x

cero = log 1

-- exp x = exponencial de x (e^x)

e = exp 1

-- fromInteger x = Pasa x a cual quier tipo numerico que necesites
{- Como comento arriba al hacer la practica para hacer la raiz cuadrada de un entero x, necesitaba hacer (sqrt.fromInteger) x. Ahora, supongo que por actualización de algun paquete, no es necesario.
El tipo de la funcion es:
fromInteger :: Num a => Integer -> a -}

uno:: Float
uno = fromInteger 1

-- round x = Redondea x al entero mas cercano

seis = round 5.5

-- floor x = redondea al entero mas pequeño

cinco = floor 5.5
menos6 = floor (-5.5)

-- even x = True si x es par

falso = even 7

-- odd x = True si x es impar

verdadero = odd 7

-- null l = si una lista esta vacia

vaciaMasVacia = null ([]++[])

-- and l = hace && con los elementos de la lista

f = and [True, False, True]

-- or l = hace || con los elementos de la lista

v = or [True, False, True]

-- take n l = los primeros n elementos de l

unoA3 = take 3 [1..10]

-- drop n l = l sin los primeros n elementos

de4a10 = drop 3 [1..10]

-- map f l = aplica la funcion f a todos los elementos de l

de2a4 = map (+1) [1..3]

-- head l = primer elemento de l

el1 = head [1..10]

-- tail l = todo menos el primer elemento de l

de2a10 = tail [1..10]

-- error c = devuelve la cadena c en vez del valor de la funcion

convierteEn5 x | x==5 = error "Ya es 5"
                       | otherwise = 5

yaEs5 = convierteEn5 5

-- show x = cadena para mostrar por pantalla
{-Si un tipo no tiene una funcion show, hay que poner la opcion de hugs -u para que no pite-}

valorDe x | x/=7 = "el numero es "++(show x)
               | otherwise = "el numero es 7"

elNumeroEs8 = valorDe 8

-- infix n o = define el operador o con prioridad n y como no asociativo
-- infixr n o = define el operador o con prioridad n y asociativo por la derecha
-- infixl n o = define el operador o con prioridad n y asociativo por la izquierda
{-Si no te acuerdas de la asociatividad o prioridad de un operador, pon parentesis, mas vale pasarse de parentesis, que equivocarse en lo otro-}

x ++++ y = (x+1, y+1)

infixl 1 ++++

tresY4 = 2 ++++ 3

-- filter c l = devuelve una lista con los elementos de l que cumplen c

impares = filter odd [1..10]

-- foldr o b l = Aplica el operador o a la lista l teniendo de caso base (colocando a la derecha) b
{-El caso base debe ser del tipo que devuelve la funcion:
menoresDe10 = foldr (<) 10 [1..9]
no vale-}

concatenada = foldr (++) [] ["con","ca","te","na","da"]

-- foldl o p l = Aplica el operador o a la lista l teniendo de primer elemento (colocando a la izquierda) p
{-Generalmente el caso base, o el primer elemento suelen ser el elemento neutro para esa funcion, de tal modo que si la lista solo tiene un elemento pueda aplicar la funcion, y si no tiene elementos devuelve el elemento neutro-}

concatenadaTb = foldl (++) [] ["con","ca","te","na","da","Tb"]

-- until c f x = aplica la funcion f a x HASTA que cumpla la condicion c

quince = until (10<=) (\x->x+x+1) 0

-- rem a b = resto de la division entera entre a y b manteniendo el signo
{- Tambien existe mod pero es un poco distinto-}
menos7 = -27 `rem` 10

-- quot a b = division entera de a entre b
{- Tambien existe div, pero es un poco distinto-}
menos2 = -27 `quot` 10

{-mod y div dan el mismo valor que quot y rem excepto cuando el signo del resto es contrario al signo del denominador. En ese caso usando mod y div al cociente se le suma -1 y al resto se le suma el denominador. Están definidas así:
    n `quot` d           = q where (q,r) = quotRem n d
    n `rem` d            = r where (q,r) = quotRem n d
    n `div` d            = q where (q,r) = divMod n d
    n `mod` d            = r where (q,r) = divMod n d
    divMod n d           = if signum r == - signum d then (q-1, r+d) else qr
      where qr@(q,r) = quotRem n d
En general se deberia usar siempre quot y rem. En alguno de los apuntes habia leido que rem era como mod, pero que mod mantenia el signo y rem no, casi siempre he usado mod, y en algun ejercicio he tenido problemas yno sabia porque. -}

-- [] = lista vacia
-- (:) a l = pone el elemento a al inicio de la lista l
-- (++) l1 l2 = concatena la lista 1 con la 2

de1a7 = 1:2:[3,4]++(5:6:7:[])

-- .. = en la definicion de una lista es algo asi como incremento hasta, pudiendose omitir el hasta.
{-Si se omite el hasta se iran añadiendo elementos mientras se pidan, si no se especifica, el incremento es 1. El hasta no es hasta que sea igual a ese valor, si no hasta que se sobrepase. Algunos ejemplos: -}

cincoA7 = [5..7]  --[5,6,7]
cincoAinf = [5..]  --[5,6,7,...]
deMediosHasta6 = [2.5..6]  --[2.5,3.5,4.5,5.5,6.5]
de3en3 = [1,4..10]  --[1,4,7,10]
deMedioEnMedio = [3.5,4..6]  --[3.5,4.0,4.5,5.0,5.5,6.0]
cerosInf = [0,0..3] -- [0,0,0,0,...]

--concat ll = concatena las listas contenidas en la lista de listas ll

concatenadaMasAun = concat ["con","ca","te","na","da","Mas","A","un"]

--init x = x sin el ultimo elemento

hol = init "hola"

-- last x = el ultimo elemento de x

a = last "hola"

-- (!!) l n = devuelve el elemento n de la lista l siendo el primero el 0

l = "hola" !! 2

--elem x l = True si x es elemento de la lista l

false = 'j' `elem`"Jhon F. Keneddy"

--notElem x l = False si x es elemento de la lista l

true = 'j' `notElem` "Jhon F. Keneddy"

--takeWhile c l = devuelve los elementos de l mientras cumplan la condicion c
--dropWhile c l = devuelve los elementos de l desde el ultimo que cumple la condicion c

tupla = (takeWhile c l, dropWhile c l)
        where l = "tupla"
              c = ('l'/=)

--splitAt n l = separa en dos listas a partir del elemento n
{-Lo mismo que hacer un take y un drop pero mas eficiente-}

tuplas = splitAt 3 "tuplas"

--span c l = separa en dos listas desde el ultimo que cumple la condicion
{- Lo mismo que hacer un takeWhile y un dropWhile pero mas eficiente-}

masTuplas = span (/='T') "masTuplas"

-- words c = separa la cadena c por los espacios

holaMas = words "hola         Mas"  --["hola","Mas"]

-- unwords l = Une las cadenas de la lista poniendo como separador espacios en una sola cadena

masHola = unwords ["mas","Hola"] --"mas Hola"

--lines c = separa por los caracteres de salto de linea '\n'
{-Ojo, "esto\nno\nson\nvarias\nlineas"-}

lineas = "esto"++('\n':"Son")++('\n':"Lineas")

estoSonLineas = lines lineas

--unlines l = Une las cadenas de l usando '\n' como separador

tBestoSonLineas = "tB"++('\n':(unlines estoSonLineas))

--repeat x = crea una lista infinita en el que todos los elementos son x

masCerosInf = repeat 0

--iterate f x = Crea una lista infinita con los resultados de aplicar f a x recursivamente

hombres = iterate (\x->x++x) " O-|-< "

--zip l1 l2 = devuelve una lista de tuplas que contienen los elementos de l1 y de l2
{-Si las listas no son de igual tamaño se descha el resto de la grande-}

numera = zip [1..] estoSonLineas

--zipWith f l1 l2=Devuelve una lista de los elementos de 1 y 2 combinados mediante f

numeraLineas = zipWith (\x y-> (show x)++(' ':y)++['\n']) [1..] estoSonLineas

--curry f = devuelve una funcion que hace lo mismo que f pero de forma currificada
{- Currificada quiere decir que recibe los parametros separados, si no los recibe juntos en una tupla-}

algo (x,y) | x==1 = 200
           | y==0 = 100
           | True = 0

doscientos = curry algo 1 0

--uncurry f = devuelve una funcion que hace lo mismo que f pero toma los parametros en una tupla (un solo parametro)

cincuentaY3 = uncurry (+) (47, 6)



{-PEÑA MARÍ-}

--all c l = True si todos los elementos de l cumplen la condicion c

mayoresQue0 = all (>0) [1..10]

--any c l = True si algun elemento de l cumple la condicion c

algun0 = any (0==) [0..5]

--id x= Devuelve x

diHola = id "diHola"



{-LABRA-}

--negate x= Devuelve x negado (-x)

menos8 = negate 8

-- lcm x y = Devuelve el minimo comun multiplo de x e y

veintiuno = lcm 3 7

-- tan x = tangente de x (en radianes)

unoDouble = tan (pi/4)

--atan x= arco que tiene tangente x (en radianes)

grados45 = 180*(atan 1)/pi

-- asin x = arco que tiene seno x (en radianes)

grados90 = 180*(asin 1)/pi

-- cos x = arco que tiene coseno x (radianes)

double0 = acos 1

-- fromEnum x = el entero asociado a x en "la enumeracion"
{-x tiene que pertenecer a la clase Enum-}

sesentaY5 = fromEnum 'A'

-- toEnum x =devuelve el elemento x de "la enumeracion"

aMayuscula :: Char
aMayuscula = toEnum 65

-- |x<- = Se usa para definir listas
{- La ultima variable crece mas rapido que la anterior, y así sucesivamente. Una variable puede estar en funcion de las anteriores nunca que las posteriores. Tambien se puden poner condiciones.-}

variasTuplas :: [(Int, Int, Char)]
variasTuplas = [(x,y,z) | x<-[1..5] , y<-[1..x], z<-[toEnum(65)..toEnum(65+x+y)],x<3,z/='C']
--[(1,1,'A'),(1,1,'B'),(2,1,'A'),(2,1,'B'),(2,1,'D'),(2,2,'A'),(2,2,'B'),(2,2,'D'),(2,2,'E')]

--flip f a b = cambia el orden de sus parametros a f b a
{-Es la que se usa cuando iniciamos una funcion parcialmente con el operando a la derecha, como (+2) (*2) (/2)-}

dos'5 = (flip (/)) 2 5

-- type Para crear sinonimos de tipos: type String = [Char]
-- data Para crear verdaderos nuevos tipos: data Pila a= PilaVacia |P (a Pila)


Un saludo, espero que esto os anime a echarle un vistazo al haskell.

PD: Parece que en la universidad de málaga se explica un poco lo que son las monadas, pero aun no me lo he leido. Ya os diré.

24 febrero, 2006

O no saben lo que hacen o lo saben muy bien...

Seguramente sea lo segundo. Como suele pasar con esta compañía, al poco de lanzar sus google-pages han restringido el acceso. Mas bien lo han prohibido, si quieres puedes apuntarte a la lista de espera...

No les ha pasado ni una vez, ni dos. ¿Alguien va a decirme que les ha pillado de improviso? No me lo creo. Mas bien parece una muy buena táctica de marketing (donde hay cerebro que se note). Pones algo a disposicion del publico, en cuanto la publicidad gratuita es suficiente, y antes de que empiece a decaer restringes el acceso al servicio. ¿Hay algo que nos guste más a las personas que lo que no podemos tener? ¿Algo más que lo que nos prohiben?

Una pena que Miguel de Reina (director de google en España) halla dejado de lado su bitacora, ya que se encarga de marketing y publicidad (creo) y podría contar si todo esto no son mas que "cosas que pasan" o está premeditado.

1 541uD0 (disfrazado, como debe ser estos dias)

PD: Que quede claro que no es una crítica...

22 febrero, 2006

S.U. vs Super Generador de Ahorros Electrónicos

¡ATENCION! Esta entrada es grosera e irreal, las voces de los superhéroes son pobres invenciones, debido a su contenido les aconsejamos que no la lean.

AVISO: Cualquier parecido a la realidad es una mera coincidencia. Esta entrada sólo pretende ser un chascarrillo "desde el afecto y el cariño" a situaciones cotidianas que día a día se leen por la red, y va dirigida única y exclusivamente a aquellas personas que se toman la vida con humor y no saltan a la mínima. Si usted es una persona (física o entidad) susceptible, impresionable, o si ve fantasmas donde sólo hay sabanas y aire, tiene terminantemente prohibido leerla. Cualquier incumplimiento de esta prohibición libra de cualquier responsabilidad al autor o autores de la misma.


Comenzaba el turno de noche en el Hospital Especializado en Lamedores Laborales, en el que se pretendía curar a aquellos que pretenden ascender y mejorar solo a base de besar y lamer culos, en vez de siendo mejores. Prometía ser una apacible noche, hasta que una enfermera quiso experimentar una nueva técnica insertando archivos en la memoria de los dormidos pacientes.

-Dormir, dormir tranquilos, que con estos archivos creados por el Médico "Omeópata" a partir de la Zupia Arrancada de Reales Trabajadores os sentiréis mejor mañana, y facilitara vuestra adquisición de conocimientos no conscientes...

De repente se oyó un gran estruendo, y apareció de la nada un resplandor enorme. En el centro de este había un ser encorvado y se oía un chirrido de fondo que parecía sonar algo así como "mío, mío, solo mííío". La enfermera soltó un chillido al ver como ese ser se acercaba a ella mientras se erguía. Al tenerle frente a ella le pareció enorme, y a pesar de tener una cara angelical que inspiraba confianza, no pudo evitar sentir un escalofrío de pavor.

-¿Quién eres? ¿Qué quieres? ¡¡No me hagas daño!!, por favor.

-No temas, soy el Super Generador de Ahorros Electrónicos, y no te voy a hacer daño. Sólo me conectaré a tu puerto de conexión económica trasera para transferirme el diezmo de tus ahorros, y haré lo mismo a todos los pacientes a los que les transmitas el archivo MOZART, pues un tataratataratataratataratataranieto de su creador me cedió su propiedad a cambio de un envoltorio de sugus. ¡Ja, ja, ja!

-¡Oh no! Debí haber hecho caso a mis padres cuando me decían que no debía llevar ahí detrás el conector de transferencia económica, que alguien me quitaría mis ahorros. ¡Socorro! ¡Que alguien me ayude!

Lamentablemente nadie parecía haber oído los gritos de la enfermera, y el ser que tenia frente a ella ya estaba a punto de conectar su clavija al puerto de transferencia de la pobre muchacha... Sin embargo, justo en el momento antes de que pudiera realizar la conexión, apareció un muchacho tras unas gafas de pasta que usaba un inhalador (presumiblemente para no respirar las emanaciones paralizantes del villano).

-¡Super Ususaaaaario al rescate! No temas, me he visto todos los episodios de Mc Gyver, y con un trozo de papel albar y unos limones (que casualmente hay en esta esquina) haré un chip de transferencia ed2k, y así el Super Generador de Ahorros Electrónicos no podrá meterte mano.

El malvado dio un grito de rabia, y al enfadarse no pudo mantener la mascara angelical que llevaba, dejando al descubierto su verdadera y horrenda cara.

-No te permitiré que la liberes Super Usuario, esos diezmos me pertenecen. Aunque pretenda usar los archivos MOZART para curar, no renunciaré a mi parte tan fácilmente. ¡Ataque abogadoooooo!

Dijo esto mientras lanzaba hacia delante sus mangas y de estas salían pequeños hombre con traje y maletín, que corrían con movimientos espasmódicos como si estuvieran automatizados, y de sus bocas solo salía una cosa "pi-ra-ta, pi-ra-ta".

-Ya es tarde SU, nos ha lanzado sus abogados, ya no puedes hacer nada, nos destruirá- Dijo la muchacha asustada.

-No temas, pondré este escudo que nos protegerá- Intento calmarla el Super Usuario

-¿Que haces? ¿Estas gilipollas? ¿De verdad crees que un trozo de papel con dos palabras podrá detener sus cien abogados? Eres imbécil chaval, en buena hora te he pedido ayuda. Se un macho-juaker de verdad y hazle un DoS que se cague por las patas pa bajo.- Dijo la enfermera, al parecer enfadada con el Super Usuario que la había ido a ayudar.

-¡Nooo! Eso sería ilegal y estupido, y daria la razon a su ataque abogado que me llama pirata. Confía en mi, las palabras que lleva escritas ese papel son el talón de Aquiles del Super Generador de Ahorros Electrónicos. El escudo resistirá.

-¿A si? Sorprendeme, ¿cuales son?- Espetó aun incrédula.

-Te lo diré, esas palabras que otorgan el poder al escudo son ...



...¡CO-PIA PRI-VADA!


-¡Nooo!- Grito el Super Generador de Ahorros Electrónicos, viendo como su ataque sucumbía ante el poder del escudo- Esta vez me has vencido Super Usuario, pero nuestros caminos se volverán a cruzar y habré tramado algo con lo que vencerte- Y se desvaneció tras una cortina de humo.

Contentísima se quedo la enfermera, y abrazándose al cuello de SU le dijo:

-¡Oh! gracias Super Usuario, nunca dudé de ti. Eso sí, dame tu teléfono, que si algún día enfermo por el chip ed2k que me has puesto, por que me este bajando programas ilegales para hacer funcionar programas de pago sin pagar, te lo echaré en cara.

-Bueno, está bien, pero creo que ha llegado el momento de hablar de mis honorarios.

-¿Tus honorarios? ¿Estas de cachondeo? Si no has hecho nada. Además, a ti que sabes de esto, no te cuesta nada.

-¡Oh claro! Jugarme la vida enfrentándome a un super villano no me cuesta nada, crearme un enemigo mortal hasta el fin de mis días no me cuesta nada, haber usado todas mis defensas posibles para protegerte no me cuesta nada. Es flipante. En fin, que se le va a hacer, si quieres podemos hacer un intercambio de servicios. Tengo aquí un forúnculo peludo y duro que me podrías mirar.- Dijo conformista el Super Usuario, bajándose los pantalones.

-¡Ni hablar de eso!¡Subete los pantalones! Pertenezco a la asociación de Personas "Umanas" Terminantemente "Anti-intercambio" de Servicios, y nuestros estatutos nos prohíben realizar ningún tipo de trabajo sin una compensación económica.- Dijo poniéndose digna con los brazos en jarra.

-Me estas diciendo que como eres una integrante de esa asociación, ¿no me vas a solucionar lo de mi forúnculo peludo y duro? Además, sí recibes una compensación económica, no pagar a quien ha evitado que el Super Generador de Ahorros Electronicos se te conectase por detrás y te quitara el diezmo de tus ahorros, ¿no te parece suficiente?- Dijo SU anonadado, estupefacto ante la poca gratitud de la enfermera.

-No, lo siento, no puede ser, y ahora vete que tengo que seguir con mi trabajo. Si tengo algún problema con tu chip ya te llamare.- Dijo la enfermera mientras empujaba al Super Usuario hacia la salida.

-Muy bien, me iré, y si me llamas, como soy un pringado te volveré a ayudar, pero permiteme que te diga algo antes de irme...

-Dime lo que quieras, pero vete.

-El que escribas las palabras entre comillas no evita que estén mal escritas.- Dijo, al menos orgulloso.

-¿Qué me estas contando?

-No, nada, deja lo.- Contesto dubitativo, sin saber muy bien que palabras habían salido de su boca, ni de donde habían venido.

Y así se marcho nuestro héroe, sin desdoro ya que había logrado el objetivo que se había marcado, pero cabizbajo puesto que como de costumbre, le habían chuleado lo que era suyo...

Un saludo, espero que os hallais reido. ¿Se nota mucho que no tengo otro huevo mejor que rascar?

PD: Una reflexión. Que es lo que pensais cuando en una manifestacion pacífica en la que la gente va a expresar sus ideas a favor o en contra de algo, llegan unos cuantos que nunca representan a la mayoría y se ponen a destruir cosas (mobiliario urbano o lo que sea). ¿Y si encima lo llevasen planeando algun tiempo?

20 febrero, 2006

Final del braseo...

Al instalar la nueva versión (060214 y 0.0.2-3) la mitad de los pluggins del compiz no me van. Al volver a la anterior version (060206 y 0.0.1-4) seguian sin ir, y he tenido que activarlos "manualmente" con el gconf-editor. Así que no parece que sea un problema de la configuracion del teclado, en la proxima version puede que funcione, o puede que no, "qui lo sá?". Con esta version me va todo, excepto la combinacion alt+tab y las que usan la tecla "Super". Las de Super las he podido cambiar, pero la otra no se puede cambiar desde las opciones de los plugins en el gconf-editor. En las opciones del cubo pone algo así como que con el espacio pasas a la siguiente cara, y con el retroceso a la anterior, eso tampoco me funciona, eso si, si pulso Ctrl+Alt+Retroceso peta, asi que a lo mejor algo intenta hacer...

Eso es todo, como ya dije intentare mantener las direcciones de los ultimos paquetes que halla en el script, pero se acabó brasear con xgl y compiz, que ya os he contado todo lo que podía. Me van de lujo (esta version), y por lo que sé a algunos otros tambien les va...

Un saludo, y si teneis dudas dejarlas por los comentarios.

PD: Se me olvidaba que tampoco me va lo de las transparencias, no se que es eso de la utilidad "transset".

EDITO: transset es una aplicacion para hacer ventanas transparentes. Usando transset n donde n es un numero entre 0 y 1 (1 es normal, y 0 invisible), por ejemplo transset .5. Aun no se como añadirlo al menu del gnome-window-decorator, si alguien sabe, le estaría muy agradecido. Para ver el "menu" cuando pulsas Alt+Tab hay que añadir el plugin switcher. En el paquete actual (0.0.2-3) viene, en el que tengo yo instalado (0.0.1-4) no, pero se puede sacar del que hay ahora y copiarlo en /usr/lib/compiz, aunque no se ve demasiado bien, funciona.

REEDITO: gracias a cocozz he visto esta pagina donde está todo resuelto, los problemas de teclado, explica las opciones de los plugins, y porque no gira, como hacer un plugin, como usar transset, y tiene un plugin de transparencias.

18 febrero, 2006

Cambios y errores

ACTUALIZADO 27-02-2006

Estoy trabado, que se le va a hacer. Me he dado cuenta de que he puesto atuomatizado en vez de automatizado, y hasta ahora no lo he visto. Es verdad la teoria esa de que leemos lo que esperamos leer. Por otro lado, me avisan de que he metido la pata, con que no es libxfont, es libxfont1. Además los paquetes han cambiado de nombre, intentaré mantener el siguiente script actualizado, pero no prometo nada.

#Bajar los paquetes
wget http://download.opensuse.org/distribution/SL-OSS-factory/inst-source/suse/i586/xgl-cvs_060216-2.i586.rpm
wget http://download.opensuse.org/distribution/SL-OSS-factory/inst-source/suse/i586/compiz-0.0.2-3.i586.rpm
wget http://download.opensuse.org/distribution/SL-OSS-factory/inst-source/suse/i586/libsvg-cairo-0.1.6-6.i586.rpm
wget http://download.opensuse.org/distribution/SL-OSS-factory/inst-source/suse/i586/libsvg-0.1.4-6.i586.rpm
#Pasarlos a .deb
sudo apt-get install alien
sudo alien *.rpm
#Instalarlos
sudo dpkg -i xgl*.deb
sudo dpkg -i compiz*.deb
sudo dpkg -i libsvg-cairo*.deb
sudo dpkg -i libsvg?0*.deb
#Lo que necesitan (al menos en mi caso) para ejecutarse
sudo apt-get install libxfont1
sudo apt-get install gconf-editor #no es necesario pero si muy recomendable
cd /usr/X11R6/lib/X11
sudo ln -s ../../../share/X11/fonts fonts #En vez de esto, se puede llamar a Xgl con la opcion -fp /usr/share/X11/fonts
#sudo cp /usr/lib/libdrm.so.1 /usr/lib/libdrm.so.2
#Mejor que eso es:
wget http://archive.ubuntu.com/ubuntu/pool/main/libd/libdrm/libdrm2_2.0-0ubuntu1_i386.deb
sudo dpkg -i libdrm*.deb
sudo apt-get install libwnck18
sudo apt-get install libglitz1
sudo apt-get install libpng3
#Ejecutarlo
#sudo Xgl :1 & sleep 5 ;DISPLAY=:1 startkde & sleep 30 ; DISPLAY=:1 compiz --replace gconf decoration wobbly fade minimize cube rotate zoom scale move resize place switcher & sleep 5 ; DISPLAY=:1 gnome-window-decorator
#Las opciones que añado son las indicadas en http://en.opensuse.org/Using_Xgl_on_SUSE_Linux para mi tarjeta
#quito gconf de las opciones de compiz porque crea una violacion de segmento. 
#Cambiando el plugin por el anteriro que si funcionaba pasa lo mismo.
#El problema sera de compiz, supongo.
sudo Xgl :1 -accel glx:pbuffer -accel xv:fbo& sleep 5 ;DISPLAY=:1 startkde & sleep 30 ; DISPLAY=:1 compiz --replace decoration wobbly fade minimize cube rotate zoom scale move resize place switcher & sleep 10 ; DISPLAY=:1 gnome-window-decorator


Un saludo, ahora si que tiene que estar todo

PD: Aun no he instalado esos paquetes, hasta que no pase el finde no instalo nada, que hay momentos para la fiesta y momentos para lo demas, pero supongo que todo sea igual.

17 febrero, 2006

Ejecutando gnome-window-decorator

Siempre pasa igual... me habia equivocado de nombre, por eso no rulaba. Ahora las ventanitas ya tienen barra de titulo con su botoncito de maximizar y cerrar y esas cosas. Habría que añadir a lo anterior:

#Lo que necesitan (al menos en mi caso) para ejecutarse
sudo apt-get install libwnck18
sudo apt-get install libglitz1
#Ejecutandolo
sudo Xgl :1 & sleep 5 ;DISPLAY=:1 startkde & sleep 30 ; DISPLAY=:1 compiz --replace gconf decoration wobbly fade minimize cube rotate zoom scale move resize place menu & sleep 5 ; DISPLAY=:1 gnome-window-decorator


Un saludo, creo que ya está todo

PD: Me da algunos problemas de teclado que no tengo en la sesion que corre sobre kdm (por ejemplo no va la tecla AltGr), me suena que entre las opciones que habia para pasarle al Xgl habia unas cuantas sobre el teclado...

Atuomatizando lo anterior

AVISO: Este script contiene varios errores. El script correcto, y que intentaré mantener actualizado está en otra entrada, y en las sucesivas entradas a esta hay mas informacion y explicaciones sobre esto y cosas relacionadas con ello como el decorator o las trasparencias.

Me han avisado de que en dapper está el paquete xserver-xgl para instalar el xgl. De todos modos, aquí os dejo un script que debería funcionar, al menos (en el resto como mucho haciendo algun cambio), en una kubuntu 5.10 que esté funcionando. Solo debeis copiar lo sieguiente en un archivo de texto y hacer un chmod a+x nombreArchivo

#Bajar los paquetes
wget http://download.opensuse.org/distribution/SL-OSS-factory/inst-source/suse/i586/xgl-cvs_060206-3.i586.rpm
wget http://download.opensuse.org/distribution/SL-OSS-factory/inst-source/suse/i586/compiz-0.0.1-3.i586.rpm
#Pasarlos a .deb
sudo apt-get install alien
sudo alien *.rpm
#Instalarlos
sudo dpkg -i x*.deb
sudo dpkg -i c*.deb
#Lo que necesitan (al menos en mi caso) para ejecutarse
sudo apt-get install libxfont
sudo apt-get install gconf-editor #no es necesario pero si muy recomendable
cd /usr/X11R6/lib/X11
sudo ln -s ../../../share/X11/fonts fonts #En vez de esto, se puede llamar a Xgl con la opcion -fp /usr/share/X11/fonts
sudo cp /usr/lib/libdrm.so.1 /usr/lib/libdrm.so.2
#Ejecutarlo
sudo Xgl :1 & sleep 5 ; DISPLAY=:1 startkde & sleep 30 ; DISPLAY=:1 compiz --replace gconf decoration wobbly fade minimize cube rotate zoom scale move resize place menu


Una vez instalado, con la ultima linea es suficiente para ejecutarlo. Tener cuidado de que las lineas no queden partidas o no funcionara, no se como se verá al publicarlo...

Por cierto, yo lo ejecuto en un P4 prescott 2,8G con 512M de RAM y una gForce 128M. Si os va en otras comentarlo, para saber hasta donde llega.

Un saludo, no jugueis demasiado ;)

PD: Como seguía sin saber cual es el boton super he cambiado en el gconf-editor el iniciar y parar el zoom por el boton central del raton. Muy chulo tambien. Está en el gconf-editor en /apps/compiz/plugins/zoom/screen0/options.

EDITO: No se aprecian bien los saltos de linea, así que si dudais en mirar el codigo fuente de la pagina, y solo debe haber saltos de linea donde estan las etiquetas br.

REEDITO: Ya se ve flaman.

Ejecutando compiz

¿Quien dijo que no se podia? XDD

Ya está todo en marcha, lo he estado probando, se ve muy bien. Lo de las ventanas en negro se ha solucionado al ejecutar el compiz. Muy bonito todo, como se minimizan las ventanas mostrando el contenido, como se mueven como si fueran gelatina... Una cosa curiosa que no habia visto en los videos, creo, es que la rotacion en cubo tiene efecto muelle. Si dejas apretada una de las flechas y se pone todo a girar rapidisimo, al soltarla, para y vuelve un escritorio hacia atrás.

Vamos a lo importante. Al ejecutar compiz decia que no encontraba libdrm.so.2, nada mas facil. Me voy a donde está libdrm.so.1, veo que es un enlace, y lo copio cambiando el uno por un dos. Está en /usr/lib. Ya se ejecuta. Sin embargo, la primera vez, al ejecutar Xgl, kde y compiz mientra tenía una sesión de kde abierta funcionando sobre kdm solo se veía un escritorio, y no puedes jugar con el cubo así que primero hay que parar o matar kdm. Ahora lo he vuelto a hacer teniendolo en marcha(kdm), para ver si en el gnome-editor (lo he instalado) ponía cual es la tecla "Super", y va bien. Por si acaso no está de mas pararlo (todo en consolas):
  • sudo /etc/init.d/kdm stop
  • sudo Xgl
  • DISPLAY=:0 startkde
  • DISPLAY=:0 compiz --replace gconf decoration wobbly fade minimize cube rotate zoom scale move resize place menu
Para ejecutar el compiz yo esperaria a que kde halla acabado de cargar. El plugin de zoom no lo he conseguido probar porque no tengo ni idea de cual es la tecla "Super" que hay que usar, además mi raton no tiene rueda (ni 5 botones), asi que cuando averigüe que tecla es, tendré que cambiar la configuracion de eso con el gnome-editor. Tampoco he probado el "decorador de ventanas" del que hablan, no me encuentra el comando...


De momento eso es todo, puede que halla más, quien sabe.

Un saludo, y no quedarse tonto mirando como gira.

PD: Me han solucionado lo del link de fonts, era con ln -s en vz de con link.

16 febrero, 2006

Ejecutando Xgl

Ayer lo dejamos con el Xgl mas o menos preparado. Al ejecutarlo decia que ya hay un servidor en ejecucion en el display 0. Ahora tenemos 3 opciones:
  • Parar o matar kdm
  • Ejecutarlo en otro display, con lo que se nos abre una vena donde lo carga.
  • Ejecutarlo en otro display desde una consola de texto para que se abra a pantalla completa
Yo opto por la tercera. Ctrl+Alt+F1 y sudo Xgl :1, y nos dice "...Could not open default font 'fixed'...". Evidentemente si no hay un directorio fonts en /usr/X11R6/lib/X11/fonts/ dificil que encuentre ninguna fuente. Mirando en /etc/X11/xorg.config veo que las fuentes están en /usr/share/X11/fonts/. Como no se (de momento) como decirle a Xgl que busque en donde debe, intento hacer un enlace pero link me dice que la operacion no esta permitida (siempre pense que root era todo poderoso ;), así que sin complicaciones copio la carpeta del tiron. Ahora si se ejecuta Xgl.


Ir va, sin embargo... si hacemos un DISPLAY=:1 xterm o mejor aun DISPLAY=:1 startkde (1 si habiamos hecho Xgl :1vemos que el interior de las ventanas sale en negro, aunque si habro konsole en el kde, los nombres de los menus y eso si se ven. Puede que halla que pasarle algun parametro o que simplemente no consiga hacerlo marchar bien... De todos modos, el siguiente paso va a ser intentar hacer funcionar el compiz que me dice que no ve libdrm, y el paquete si está instalado.

Un saludo, ahora si creo que será posible...

PD: si alguien sabe porque pasa eso con el link le agradecería la información.

15 febrero, 2006

Pasos para instalar Xgl

Al principio todo era oscuridad, y acabó habiendo luz. Aquí pasa lo mismo, al principio todo iba a ser escueto, anotaciones chorras donde expresara algun parecer en pocas palabras. Además pensaba mantener lo tecnológico alejado, en /., y ahora parece que va a ser que no. Al fin y al cabo si no escribiese nada sobre tecnología, programación o lo que fuese, no escribiría casi nunca, y es inevitable a veces no ser escueto, pues no se puede resumir mas, y aunque lo partiese en secciones no tendria sentido si no se leyese todo el conjunto.

Seguro que ya habeis oído hablar de Xgl un gestor de ventanas (¿o el gestor es compiz y xgl es el servidor? que mas da) para linux (o GNU/linux me da lo mismo que lomismo meda) que liberó novell hace unos días. Seguro que tambien habreis visto los asombrosos vídeos, yo cuando vi el del lanzamiento de compiz escalofríos y todo ¡oiga! tenía por la espalda. Así que como no hay nada (que yo halla visto) en español que diga como instalarlo, y como no tengo otro huevo mejor que rascar, vamos a ello (aviso que no soy ningún experto en esto y puede ser que todo salga mal)

Sigue en la pagina de la anotación.


¿De donde parto? empiezo de una kubuntu mas o menos recién instalada (petó durante los exámenes un disco duro, así que reinstale sin meter mas). Lo único que le he metido ha sido el hugs que ahora mismo ni os viene ni os va, y el automatix como indican en la pagina. Con este no tuve muchos miramientos, marque todas las opciones a ver que pasaba, pero peto cuando estaba reinstalando open office, a saber porque lo reinstalaba. La cosa es que los drivers (a pesar de haber marcado también los de ATI) si los instalo bien (tengo una nVidia). Aun así, si sois pacientes, leeros las opciones.

Al mirar que había en ingles, vi que dicen (creo, aun no me lo he leido, solo lo he mirado muy por encima) que sólo se puede instalar en dapper, así que lo pongo a bajar mientras pruebo otras cosillas. Tardara un par de horas al menos, así que no hay prisas.

Vamos a la pagina de suse sobre Xgl y ¡o sorpresa!, tienen paquetes preparados para instalar Xgl y compiz. Pos a ver si hay suerte, y no hay que tirar del cvs (aunque seguro que ahí está mas actualizado) como hacía el tío de los foros (no se porque me da que al final acabaré haciendo todo lo que el dice). Pos bueno, a descargarlos y a probar.

Son rpm, estos no encajan en un derivado debian. Pregunto a tito google y me dice que instale rpm, pero cuando ejecuto rpm *.rpm me dice que soy idiota y que use un tal alien, así que lo instalo también y este me los pasa a paquetes .deb, estos si son para debian ;) Ejecuto dpkg -i x*.deb y lo mismo para el compiz. Ahora a ver si tiran...

Anotación 2
He mentido un poco mas arriba. No me acordaba ya, de que anoche, como tenía una kubuntu dapper (estoy bajando la otra porque el compiz tiene cosas especificas para gnome) la meti como repositorio y di a actualizar, y para variar peto a mitad (aquí todo peta). Esto lo hice porque no encontraba el directorio X11R6 donde se instalaba el Xgl. Ahora no se si es que lo estaba buscando mal o es que no estaba. La cosa es que al ir a ejecutar Xgl, me ha dicho que no encontraba libXfont, y al decirle al adept (que poco me gusta este programa) que instalase libxfont1, me ha desinstalado medio sistema, y no se si ha sido por la libreria o por el chasco del dapper. Ahora me dice que el servidor ya esta activo, pero antes de hacer nada mas con el Xgl tendré que dejar el sistema como antes, digo yo. Seguire informando...

Anotacion 3
Todo estaba muy inestable, asi que acabé rehaciendo todo. Ahora puedo decir que el problema fue por jugar con el disco del dapper drake. Los pasos que he dado, y así resumimos todo lo anterior son:
  • Instalar kubuntu
  • Instalar automatix:
    sudo apt-get remove automatix-kubuntu
    
    sudo apt-get install xterm libglade2-0 libgnomecanvas2-0
    
    wget http://kambing.vlsm.org/ubuntu/pool/main/z/zenity/zenity_2.10.0-0ubuntu1_i386.deb
    
    sudo dpkg -i zenity_2.10.0-0ubuntu1_i386.deb
    
    wget http://est.unileon.es/jorgev/hack/automatix/automatix_sp_5.3-3_i386.deb
    
    sudo dpkg -i automatix_sp_5.3-3_i386.deb
  • Ejecutar Automatix, e iinstalar las siguientes opciones:
    • Multimedia codecs
    • Firefox Plugins
    • MS TTF Fonts
    • Archives
    • Acrobat Reader
    • Ripper and Tuner
    • File Sharing
    • Multimedia Editing
    • DVD Ripper
    • Mplayer with plugin
    • Media Players
    • Debian Menu
    • Avidemux
    • Programming Tools
    • AUD-DVD codecs
    • SUN JAVA 1.5 JRE
    • SUN JAVA 1.5 SDK
    • Wine
    • Eject CD from Drive
    • AMSN 0.95
    • DMA ON
    • NVIDIA cards
    • Midi capability
    • Firefox 1.5
  • Reiniciar
  • Bajar los paquetes de Xgl y de compiz
  • Actualizar todo el sistema con adept (hay un error asi que instalo synaptic con adept)
  • Instalar alien con synaptic
  • Actualizar el sistema con synaptic
  • sudo alien *.rpm
  • sudo dpkg -i x*.deb
  • sudo dpkg -i c*.rpm
  • sudo Xgl, y como antes falta libXfont
  • Instalar libxfont1 con synaptic (no me desinstala medio sistema)
  • sudo Xgl, ya hay un servidor en marcha
Así ya vuelve a estar todo encaminado. No tocaré nada mas hasta mañana que tengo otros compromisos que cumplir.


Un saludo, volveré con mas

Pd: Me juego mil, a que acabo haciendo lo que hace el tío de los foros de ubuntu....

14 febrero, 2006

Modificación de la plantilla

He modificado un poco la plantilla basica (¿o es simple?) de blogger para dejarla a mi gusto. No son grandes modificaciones (he añadido las estadisticas, technorati, meneame, ad-free blogs, y poco mas) pero tal vez a alguno le sirva de ejemplo o algo. Por si eso aquien la pagina de la entrada os la dejo.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title><$BlogPageTitle$></title>
<!--link rel="shortcut icon" href="http://photos1.blogger.com/blogger/2628/2137/320/favicon.jpg-->
  <$BlogMetaData$>

  <style type="text/css">
<!--Para ocultar la barra de blogger: 
#b-navbar {visibility:hidden;}-->
/*
-----------------------------------------------
Blogger Template Style
Name:     Minima
Designer: Douglas Bowman
URL:      www.stopdesign.com
Date:     26 Feb 2004
Modificado por lopez en febrero del 06 para cerocoma.blogspot.com
----------------------------------------------- */


body {
  background:#fff;
  margin:0;
  padding:40px 20px;
  font:x-small Georgia,Serif;
  text-align:center;
  color:#333;
  font-size/* */:/**/small;
  font-size: /**/small;
  }
a:link {
  color:#58a;
  text-decoration:none;
  }
a:visited {
  color:#969;
  text-decoration:none;
  }
a:hover {
  color:#c60;
  text-decoration:underline;
  }
a img {
  border-width:0;
  }


/* Header
----------------------------------------------- */
#header {
  width:660px;
  background:url(http://photos1.blogger.com/blogger/2628/2137/320/prueba.jpg);
  margin:0 auto 10px;
  border:1px solid #ccc;
  }
#blog-title {
  margin:5px 5px 0;
  padding:20px 20px .25em;
  border:1px solid #eee;
  border-width:1px 1px 0;
  font-size:200%;
  line-height:1.2em;
  font-weight:normal;
  color:#666;
  text-transform:uppercase;
  letter-spacing:.2em;
  }
#blog-title a {
  color:#666;
  text-decoration:none;
  }
#blog-title a:hover {
  color:#c60;
  }

#description {
  margin:0 5px 5px;
  padding:0 20px 20px;
  border:1px solid #eee;
  border-width:0 1px 1px;
  max-width:700px;
  font:78%/1.4em "Trebuchet MS",Trebuchet,Arial,Verdana,Sans-serif;
  text-transform:uppercase;
  letter-spacing:.2em;
  color:#999;
  }


/* Content
----------------------------------------------- */
#content {
  width:660px;
  margin:0 auto;
  padding:0;
  text-align:left;
  }
#main {
  width:410px;
  float:left;
  }
#sidebar {
  width:220px;
  float:right;
  }


/* Headings
----------------------------------------------- */
h2 {
  margin:1.5em 0 .75em;
  font:78%/1.4em "Trebuchet MS",Trebuchet,Arial,Verdana,Sans-serif;
  text-transform:uppercase;
  letter-spacing:.2em;
  color:#999;
  }


/* Posts
----------------------------------------------- */
.date-header {
  margin:1.5em 0 .5em;
  }
.post {
  margin:.5em 0 1.5em;
  border-bottom:1px dotted #ccc;
  padding-bottom:1.5em;
  }
.post-title {
  margin:.25em 0 0;
  padding:0 0 4px;
  font-size:140%;
  font-weight:normal;
  line-height:1.4em;
  color:#c60;
  }
.post-title a, .post-title a:visited, .post-title strong {
  display:block;
  text-decoration:none;
  color:#c60;
  font-weight:normal;
  }
.post-title strong, .post-title a:hover {
  color:#333;
  }
.post div {
  margin:0 0 .75em;
  line-height:1.6em;
  }
p.post-footer {
  margin:-.25em 0 0;
  color:#ccc;
  }
.post-footer em, .comment-link {
  font:78%/1.4em "Trebuchet MS",Trebuchet,Arial,Verdana,Sans-serif;
  text-transform:uppercase;
  letter-spacing:.1em;
  }
.post-footer em {
  font-style:normal;
  color:#999;
  margin-right:.6em;
  }
.comment-link {
  margin-left:.6em;
  }
.post img {
  padding:4px;
  border:1px solid #ddd;
  }
.post blockquote {
  margin:1em 20px;
  }
.post blockquote p {
  margin:.75em 0;
  }

<MainOrArchivePage> 
   span.entrada {display:none;}
</MainOrArchivePage>

<ItemPage> 
   span.entrada {display:inline;} 
</ItemPage>

<MainOrArchivePage> 
   span.principal {display:inline;}
</MainOrArchivePage>

<ItemPage> 
   span.principal {display:none;} 
</ItemPage>

/* Comments
----------------------------------------------- */
#comments h4 {
  margin:1em 0;
  font:bold 78%/1.6em "Trebuchet MS",Trebuchet,Arial,Verdana,Sans-serif;
  text-transform:uppercase;
  letter-spacing:.2em;
  color:#999;
  }
#comments h4 strong {
  font-size:130%;
  }
#comments-block {
  margin:1em 0 1.5em;
  line-height:1.6em;
  }
#comments-block dt {
  margin:.5em 0;
  }
#comments-block dd {
  margin:.25em 0 0;
  }
#comments-block dd.comment-timestamp {
  margin:-.25em 0 2em;
  font:78%/1.4em "Trebuchet MS",Trebuchet,Arial,Verdana,Sans-serif;
  text-transform:uppercase;
  letter-spacing:.1em;
  }
#comments-block dd p {
  margin:0 0 .75em;
  }
.deleted-comment {
  font-style:italic;
  color:gray;
  }


/* Sidebar Content
----------------------------------------------- */

#sidebar ul {
  margin:0 0 1.5em;
  padding:0 0 1.5em;
  border-bottom:1px dotted #ccc;
  list-style:none;
  }
#sidebar li {
  margin:0;
  padding:0 0 .25em 15px;
  text-indent:-15px;
  line-height:1.5em;
  }
#sidebar p {
  color:#666;
  line-height:1.5em;
  }


/* Profile
----------------------------------------------- */
#profile-container {
  margin:0 0 1.5em;
  border-bottom:1px dotted #ccc;
  padding-bottom:1.5em;
  }
.profile-datablock {
  margin:.5em 0 .5em;
  }
.profile-img {
  display:inline;
  }
.profile-img img {
  float:left;
  padding:4px;
  border:1px solid #ddd;
  margin:0 8px 3px 0;
  }
.profile-data {
  margin:0;
  font:bold 78%/1.6em "Trebuchet MS",Trebuchet,Arial,Verdana,Sans-serif;
  text-transform:uppercase;
  letter-spacing:.1em;
  }
.profile-data strong {
  display:none;
  }
.profile-textblock {
  margin:0 0 .5em;
  }
.profile-link {
  margin:0;
  font:78%/1.4em "Trebuchet MS",Trebuchet,Arial,Verdana,Sans-serif;
  text-transform:uppercase;
  letter-spacing:.1em;
  }
#profile-container h2.sidebar-title {display:none;}

/* Footer
----------------------------------------------- */
#footer {
  width:660px;
  clear:both;
  margin:0 auto;
  }
#footer hr {
  display:none;
  }
#footer p {
  margin:0;
  padding-top:15px;
  font:78%/1.6em "Trebuchet MS",Trebuchet,Verdana,Sans-serif;
  text-transform:uppercase;
  letter-spacing:.1em;
  }
  </style>

</head>

<body>

<div id="header">

  <h1 id="blog-title">
    <ItemPage><a href="<$BlogURL$>"></ItemPage>
        <$BlogTitle$>
        <ItemPage></a></ItemPage>
  </h1>
  <p id="description"><$BlogDescription$></p>

</div>

<!-- Begin #content -->
<div id="content">


<!-- Begin #main -->
<div id="main"><div id="main2">

<Blogger>

    <BlogDateHeader>
  <h2 class="date-header"><$BlogDateHeaderDate$></h2>
  </BlogDateHeader>

  
     
  <!-- Begin .post -->
  <div class="post"><a name="<$BlogItemNumber$>"></a>
    <BlogItemTitle>
    <h3 class="post-title">
         <MainOrArchivePage><a href="<$BlogItemPermalinkUrl$>"></MainOrArchivePage>  <!--Si se activan los links externos deberian predominar-->
         <BlogItemUrl><a href="<$BlogItemUrl$>" title="external link"></BlogItemUrl>
            <$BlogItemTitle$> 
         <BlogItemUrl></a></BlogItemUrl>
         <MainOrArchivePage></a></MainOrArchivePage>
    </h3>
    </BlogItemTitle>

                 <div class="post-body">
        <div>
      <$BlogItemBody$>
    </div>
    </div>
    
    <p class="post-footer">
      <em>escrito por <$BlogItemAuthorNickname$> a las <a href="<$BlogItemPermalinkUrl$>" title="permanent link"><$BlogItemDateTime$></a>.</em>
      <MainOrArchivePage><BlogItemCommentsEnabled>

         <a class="comment-link" href="<$BlogItemCommentCreate$>"<$BlogItemCommentFormOnclick$>><$BlogItemCommentCount$> comentarios.</a>

      </BlogItemCommentsEnabled><BlogItemBacklinksEnabled>
<a class="comment-link" href="<$BlogItemPermalinkUrl$>#links">enlaces a esta entrada,</a>  
</BlogItemBacklinksEnabled> 
</MainOrArchivePage> <a class="comment-link" href="http://www.technorati.com/search/<$BlogItemPermalinkUrl$>">en technorati.</a><a class="comment-link" href="http://meneame.net/submit.php?url=<$BlogItemPermalinkUrl$>">Meneame.</a><$BlogItemControl$> 
    </p>

  </div>
  <!-- End .post -->
  
  
  
  <!-- Begin #comments -->
 <ItemPage>
  <div id="comments">

        <BlogItemCommentsEnabled><a name="comments"></a>
        <h4><$BlogItemCommentCount$> Comentarios:</h4>
        <dl id="comments-block">
      <BlogItemComments>
      <dt class="comment-poster" id="c<$BlogCommentNumber$>"><a name="c<$BlogCommentNumber$>"></a>
        <$BlogCommentAuthor$> dijo...
      </dt>
      <dd class="comment-body">

        <p><$BlogCommentBody$></p>
      </dd>
      <dd class="comment-timestamp"><a href="#<$BlogCommentNumber$>" title="comment permalink"><$BlogCommentDateTime$></a>
          <$BlogCommentDeleteIcon$>
          </dd>
      </BlogItemComments>
    </dl>
                <p class="comment-timestamp">

    <$BlogItemCreate$>
    </p>
    </BlogItemCommentsEnabled>      
    <BlogItemBacklinksEnabled>
    <a name="links"></a><h4>Enlaces a esta entrada:</h4>
    <dl id="comments-block">
    <BlogItemBacklinks>
        <dt class="comment-title">
        <$BlogBacklinkControl$>
        <a href="<$BlogBacklinkURL$>" rel="nofollow"><$BlogBacklinkTitle$></a> <$BlogBacklinkDeleteIcon$>
        </dt>
        <dd class="comment-body"><$BlogBacklinkSnippet$>
        <br />
        <span class="comment-poster">
        <em>escrito por <$BlogBacklinkAuthor$> @ <$BlogBacklinkDateTime$></em>
        </span>
        </dd>
    </BlogItemBacklinks>
    </dl>
    <p class="comment-timestamp"><$BlogItemBacklinkCreate$></p>
    </BlogItemBacklinksEnabled>


                <p class="comment-timestamp">
        <a href="<$BlogURL$>">&lt;&lt; Principal</a>
    </p>
    </div>

</ItemPage>

  <!-- End #comments -->

</Blogger>
</div></div>
<!-- End #main -->


<!-- Begin #sidebar -->
<div id="sidebar"><div id="sidebar2">
  
  
  <!-- Begin #profile-container -->
<!--<h2 class="sidebar-title">Sobre el autor</h2>-->
   <$BlogMemberProfile$>
   
  <!-- End #profile -->
    
       
  <h2 class="sidebar-title">Enlaces</h2>
    <ul><!--Mios-->
        <li><a href="http://cerocoma.blogspot.com/atom.xml">Atom</a></li>
        <li><a href="http://barrapunto.com/~lopez/bitacora">En /.</a></li>
        <!--Colegas-->
        <li><a href="http://www.fotolog.com/taxuelboss">Fotolog de taxu</a></li>
        <!--Otros que leo-->
        <li><a href="http://microsiervos.com">Microsiervos</a></li>
        <li><a href="http://barrapunto.com">/.</a></li>
        <li><a href="http://meneame.net">Meneame</a></li>
        <li><a href="http://google.dirson.com">Google dirson</a></li>
        <li><a href="http://alt1040.com">alt1040</a></li>
  </ul>

  
  <h2 class="sidebar-title">Entradas anteriores</h2>
    <ul id="recently">
    <BloggerPreviousItems>
        <li><a href="<$BlogItemPermalinkURL$>"><$BlogPreviousItemTitle$></a></li>
     </BloggerPreviousItems>
  </ul>
    <MainOrArchivePage>

  <h2 class="sidebar-title">Archivo</h2>
    <ul class="archive-list">
          <BloggerArchives>
        <li><a href="<$BlogArchiveURL$>"><$BlogArchiveName$></a></li>
          </BloggerArchives>

  </ul>
  </MainOrArchivePage>
<p><a href="http://www.adfreeblog.org/"><img src="http://www.microsiervos.com/images/adfreebutton.jpg" width="150" height="56" border="0" align="center"></a><br />
<a href="http://wiki.microsiervos.com/Ad-Free_Blogs">Ad-Free Blogs en español</a> <br />
<a href="http://www.microsiervos.com/ad-free-blog.php">Al azar</a>
</p>
      <p id="powered-by"><a href="http://www.blogger.com"><img src="http://buttons.blogger.com/bloggerbutton1.gif" border="0" alt="Powered by Blogger" /></a></p>
      <p><!-- Start of StatCounter Code -->
<script type="text/javascript" language="javascript">
var sc_project=1244194; 
var sc_invisible=0; 
var sc_partition=11; 
var sc_security="36c63396"; 
</script>

<script type="text/javascript" language="javascript" src="http://www.statcounter.com/counter/counter.js"></script><noscript><a href="http://www.statcounter.com/" target="_blank"><img  src="http://c12.statcounter.com/counter.php?sc_project=1244194&amp;java=0&amp;security=36c63396&amp;invisible=0" alt="counter easy hit" border="0"></a> </noscript>
<!-- End of StatCounter Code --><a href="http://my.statcounter.com/project/standard/stats.php?project_id=1244194&amp;guest=1">Estadisticas</a></p>
  
  
  <p><!--SIDEBAR--></p>
 
  


</div></div>
<!-- End #sidebar -->


</div>
<!-- End #content -->



<!-- Begin #footer -->
<div id="footer"><hr />
  <p>Todo conocer depende de la estructura que conoce.</p>

</div>
<!-- End #footer -->



</body>
</html>




Un saludo, nos veremos pronto ahora que tengo mas tiempo

PD: Para hacer esto, en la ayuda de blogger.