Blog

No consigo compilar un plugin…

En esta entrada detallo los pasos que he dado para intentar compilar un plugin de compiz, por si a alguien le resulta de utilidad (si esta intentando lo mismo y no quiere cometer los mismos errores).

No tengo apenas experiencia con gcc, y ninguna con make, autogen, etc, por lo que puede haber cosas que os resulten evidentes y para mi no lo sean. Si alguien tiene solucion para algo, le estaría mil veces agradecido.

Sigue en la pagina de la entrada…

Los plugins no parecen tener una estructura excesivamente complicada (para hacer alguna chorradita sencilla al menos), pero si no los puedes compilar y probar, te da lo mismo que lo mismo te da.

Lo primero fue intentar seguir las instrcciones del archivo INSTALL del cvs. Así que lo primero fue descargar todos los fuentes:

cvs -d :pserver:anoncvs@cvs.freedesktop.org:/cvs/xorg login#Sin password (presionar tecla enter)cvs -d :pserver:anoncvs@cvs.freedesktop.org:/cvs/xorg co app/compizcvs -d :pserver:anoncvs@cvs.freedesktop.org:/cvs/xorg logout

Sin embargo el autogen no iba bien, intale autogen, automake, libtool, y no hubo manera. Lo siguiente es la salida de script:

Script iniciado (jue 09 mar 2006 18:16:15 CET) ]0;lopez@corocota: ~/pru/app/compiz  [?1h =lopez@corocota:~/pru/app/compiz$ ./autogen.sh [?1l >autoreconf: Entering directory `.'autoreconf: configure.ac: not using Gettextautoreconf: running: aclocal autoreconf: configure.ac: tracingautoreconf: running: libtoolize --copyPutting files in AC_CONFIG_AUX_DIR, `config'.libtoolize: `config.guess' exists: use `--force' to overwritelibtoolize: `config.sub' exists: use `--force' to overwritelibtoolize: `ltmain.sh' exists: use `--force' to overwriteautoreconf: running: /usr/bin/autoconfautoreconf: running: /usr/bin/autoheaderautoreconf: running: automake --add-missing --copy --no-forceautoreconf: Leaving directory `.'checking for a BSD-compatible install... /usr/bin/install -cchecking whether build environment is sane... yeschecking for gawk... gawkchecking whether make sets $(MAKE)... yeschecking whether to enable maintainer-specific portions of Makefiles... nochecking for style of include used by make... GNUchecking for gcc... gccchecking for C compiler default output file name... a.outchecking whether the C compiler works... yeschecking whether we are cross compiling... nochecking for suffix of executables... checking for suffix of object files... ochecking whether we are using the GNU C compiler... yeschecking whether gcc accepts -g... yeschecking for gcc option to accept ANSI C... none neededchecking dependency style of gcc... gcc3checking for library containing strerror... none requiredchecking for gcc... (cached) gccchecking whether we are using the GNU C compiler... (cached) yeschecking whether gcc accepts -g... (cached) yeschecking for gcc option to accept ANSI C... (cached) none neededchecking dependency style of gcc... (cached) gcc3checking how to run the C preprocessor... gcc -Echecking build system type... i686-pc-linux-gnuchecking host system type... i686-pc-linux-gnuchecking for a sed that does not truncate output... /bin/sedchecking for egrep... grep -Echecking for ld used by gcc... /usr/bin/ldchecking if the linker (/usr/bin/ld) is GNU ld... yeschecking for /usr/bin/ld option to reload object files... -rchecking for BSD-compatible nm... /usr/bin/nm -Bchecking whether ln -s works... yeschecking how to recognise dependent libraries... pass_allchecking for ANSI C header files... yeschecking for sys/types.h... yeschecking for sys/stat.h... yeschecking for stdlib.h... yeschecking for string.h... yeschecking for memory.h... yeschecking for strings.h... yeschecking for inttypes.h... yeschecking for stdint.h... yeschecking for unistd.h... yeschecking dlfcn.h usability... yeschecking dlfcn.h presence... yeschecking for dlfcn.h... yeschecking for g++... g++checking whether we are using the GNU C++ compiler... yeschecking whether g++ accepts -g... yeschecking dependency style of g++... gcc3checking how to run the C++ preprocessor... g++ -Echecking for g77... nochecking for f77... nochecking for xlf... nochecking for frt... nochecking for pgf77... nochecking for fort77... nochecking for fl32... nochecking for af77... nochecking for f90... nochecking for xlf90... nochecking for pgf90... nochecking for epcf90... nochecking for f95... nochecking for fort... nochecking for xlf95... nochecking for ifc... nochecking for efc... nochecking for pgf95... nochecking for lf95... nochecking for gfortran... nochecking whether we are using the GNU Fortran 77 compiler... nochecking whether  accepts -g... nochecking the maximum length of command line arguments... 32768checking command to parse /usr/bin/nm -B output from gcc object... okchecking for objdir... .libschecking for ar... archecking for ranlib... ranlibchecking for strip... stripchecking if gcc static flag  works... yeschecking if gcc supports -fno-rtti -fno-exceptions... nochecking for gcc option to produce PIC... -fPICchecking if gcc PIC flag -fPIC works... yeschecking if gcc supports -c -o file.o... yeschecking whether the gcc linker (/usr/bin/ld) supports shared libraries... yeschecking whether -lc should be explicitly linked in... nochecking dynamic linker characteristics... GNU/Linux ld.sochecking how to hardcode library paths into programs... immediatechecking whether stripping libraries is possible... yeschecking if libtool supports shared libraries... yeschecking whether to build shared libraries... yeschecking whether to build static libraries... yesconfigure: creating libtoolappending configuration tag "CXX" to libtoolchecking for ld used by g++... /usr/bin/ldchecking if the linker (/usr/bin/ld) is GNU ld... yeschecking whether the g++ linker (/usr/bin/ld) supports shared libraries... yeschecking for g++ option to produce PIC... -fPICchecking if g++ PIC flag -fPIC works... yeschecking if g++ supports -c -o file.o... yeschecking whether the g++ linker (/usr/bin/ld) supports shared libraries... yeschecking dynamic linker characteristics... GNU/Linux ld.sochecking how to hardcode library paths into programs... immediatechecking whether stripping libraries is possible... yesappending configuration tag "F77" to libtoolchecking for ANSI C header files... (cached) yeschecking for stdlib.h... (cached) yeschecking sys/time.h usability... yeschecking sys/time.h presence... yeschecking for sys/time.h... yeschecking for unistd.h... (cached) yeschecking whether byte ordering is bigendian... nochecking for pkg-config... /usr/bin/pkg-configchecking pkg-config is at least version 0.9.0... yeschecking for COMPIZ... configure: error: Package requirements (libpng        xcomposite    xfixes        xdamage       xrandr        ice        sm        libstartup-notification-1.0 >= 0.7) were not met.Consider adjusting the PKG_CONFIG_PATH environment variable if youinstalled software in a non-standard prefix.Alternatively you may set the COMPIZ_CFLAGS and COMPIZ_LIBS environment variablesto avoid the need to call pkg-config.  See the pkg-config man page formore details. ]0;lopez@corocota: ~/pru/app/compiz  [?1h =lopez@corocota:~/pru/app/compiz$ make [?1l >make: *** No se especificó ningún objetivo y no se encontró ningún makefile.  Alto. ]0;lopez@corocota: ~/pru/app/compiz  [?1h =lopez@corocota:~/pru/app/compiz$  [?1l >Script terminado (jue 09 mar 2006 18:17:59 CET)

Luego intenté compilar a pelo con gcc un plugin solo (que es lo que me interesa), pero el archivo resultante genera una violación de segmento al ejecutar compiz…

gcc -fPIC -I../include -c rotate.c -o rotate.ogcc -fPIC -share rotate.o -o librotate.so

Ya digo que no tengo mucha idea, así que puede ser que ni siquiera tenga sentido lo que he hecho XDD. Por cierto en algun punto del proceso bajé algunos archivos de cabecera:

/usr/include/X11/extensions/wget http://webcvs.freedesktop.org/*checkout*/xorg/lib/Xdamage/include/X11/extensions/Xdamage.h?rev=1.3/usr/include/X11/extensions/wget http://webcvs.freedesktop.org/*checkout*/xorg/xc/include/extensions/damagewire.h?rev=1.2.8.1/usr/include/X11/wget http://webcvs.freedesktop.org/*checkout*/xorg/xc/lib/X11/Xregion.h?rev=1.1/usr/include/mkdir libsn/usr/include/libsn/wget http://webcvs.freedesktop.org/*checkout*/startup-notification/startup-notification/libsn/sn.h?rev=1.1/usr/include/libsn/wget http://webcvs.freedesktop.org/*checkout*/startup-notification/startup-notification/libsn/sn-launchee.h?rev=1.4/usr/include/libsn/wget http://webcvs.freedesktop.org/*checkout*/startup-notification/startup-notification/libsn/sn-launcher.h?rev=1.6/usr/include/libsn/wget http://webcvs.freedesktop.org/*checkout*/startup-notification/startup-notification/libsn/sn-monitor.h?rev=1.6/usr/include/libsn/wget http://webcvs.freedesktop.org/*checkout*/startup-notification/startup-notification/libsn/sn-common.h?rev=1.3/usr/include/libsn/wget http://webcvs.freedesktop.org/*checkout*/startup-notification/startup-notification/libsn/sn-util.h?rev=1.2/usr/include/GL/wget http://webcvs.freedesktop.org/*checkout*/xorg/xc/extras/Mesa/include/GL/gl.h?rev=1.4/usr/include/GL/wget http://webcvs.freedesktop.org/*checkout*/xorg/xc/extras/Mesa/include/GL/glext.h?rev=1.1.1.5/usr/include/GL/wget http://webcvs.freedesktop.org/xorg/xc/extras/Mesa/include/GL/glx.h?rev=1.1.1.3&view=log/usr/include/GL/wget http://webcvs.freedesktop.org/xorg/xc/extras/Mesa/include/GL/glxext.h?rev=1.5&view=log

Un saludo, espero que mis errores os puedan servir de algo.

PD: Cualquier información de como compilar un plugin será recibida con los brazos abiertos.

wikicities llega tarde

El otro dia, antes de crear el wiki en editthis, lo había intentado en wikicities. Solo despues de hacer la solicitud vi que tardaban entre 2 y 10 dias (mucho tiempo), y podían no dartela. Al final han tardado 4, pero aun así llegan tarde, ya está todo empezado en editthis (aunque halla sido yo el único). La verdad que el de wikicities está mas “españolizado”, y que dan una lista de correo, aunque tiene la misma publicidad, y en editthis proporcionan otras cosas.

Conclusión, si hay restricciones para crear una cuenta en un servicio, hay que dejarlas bien claras antes de que el usuario solicite la cuenta, si no puede que se creen cuentas innecesarias. Además, si tardas 4 dias en hacer algo, no esperes que el usuario se tome la molestia de nada mas ver vuestro error comunicaros que una cuenta innecesaria a sido abierta… (supongo que lo haré, pero hoy no)

Un saludo, yo seguiré aunque no me acompañeis en el viaje 😉

PD: hoy no hay “post datas”

wiki sobre compiz

LLevo un par de días recordando los viejos conocimientos sobre C/C++, que ya tenia casí olvidados, echandole un vistazo a la librería compiz.h (no es una librería con muchos comentarios precisamente) y veo que hay algunas cosas que no entiendo muy bien que hacen (como las funciones relacionadas con timeout de display.c) y que otra persona puede que si entienda. Me gustaría ver como se hace un plugin y hacer alguna pijadina, pero aun no estoy preparado para ello. Además me he dado cuenta de que los paquetes nuevamente han cambiado, y seguro que mas de uno de vosotros se habia dado cuenta, pero yo no, así que no cambié el script. Por todo esto hoy he creado un wiki sobre compiz, para que estas cosas no ocurran, para que todo este lo mas actualizado posible, y para tener toda la información de compiz junta. Tiene un poco de publicidad, pero de entre los que ofrecían el alojamiento para media wiki me pareció el mejor (no me he fiado de los que no tenian publicidad y prometian el oro y el moro a cambio de nada). Así que quiero “retar” a Fernando Monllor y a todos los que hallais estado trasteando con el compiz a aportar vuestro granito de arena. Si sólo lo habeis ejecutado y habeis tenido problemas (aunque no sepais como se resuelven) anotarlos tambien, que alguien sabrá como resolverlos. Ya sabeis como es un wiki, toda información es buena.

Dicho esto, me piro que no quiero llegar tarde como de costumbre.

Un saludo, y aportar lo que sea, no me dejeis solo 😉

PD: Si alguien sabe de un alojamiento mejor, que lo mueva, no tengo ninguna preferencia especial por editthis.com

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), elinterprete 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 bastanteslibrerias 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.

{-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é.

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…

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.

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 paqueteswget http://download.opensuse.org/distribution/SL-OSS-factory/inst-source/suse/i586/xgl-cvs_060216-2.i586.rpmwget http://download.opensuse.org/distribution/SL-OSS-factory/inst-source/suse/i586/compiz-0.0.2-3.i586.rpmwget http://download.opensuse.org/distribution/SL-OSS-factory/inst-source/suse/i586/libsvg-cairo-0.1.6-6.i586.rpmwget http://download.opensuse.org/distribution/SL-OSS-factory/inst-source/suse/i586/libsvg-0.1.4-6.i586.rpm#Pasarlos a .debsudo apt-get install aliensudo alien *.rpm#Instalarlossudo dpkg -i xgl*.debsudo dpkg -i compiz*.debsudo dpkg -i libsvg-cairo*.debsudo dpkg -i libsvg?0*.deb#Lo que necesitan (al menos en mi caso) para ejecutarsesudo apt-get install libxfont1sudo apt-get install gconf-editor #no es necesario pero si muy recomendablecd /usr/X11R6/lib/X11sudo 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.debsudo dpkg -i libdrm*.debsudo apt-get install libwnck18sudo apt-get install libglitz1sudo 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.