Una comunidad en gallego sobre software libre, programación, (in)seguridad informática y demás
Desde finales de julio de este año he tenido la oportunidad de participar junto con @hacklego en la preparación de una comunidad en gallego en torno al software libre, la programación y esos temas y por fin llega el momento de presentarla, así que copio/pego la presentación posteada en HxC que estas ya no son horas de buscar otra forma de hacerlo :P :
Grandes frases
Hoy me encontré con esto, ¿quien no lo pensó alguna vez?... ¿quien no lo pone en práctica todos los días :P?
Hobbes: Pensé que íbamos a hacer la cama.
Calvin: ¿!¿ Y Hacer todo ese trabajo ?!? ¡No, vamos a inventar un robot que haga la cama por nosotros!
Hobbes: ¿Inventar un robot no es más trabajo que hacer la cama?
Calvin: Solo es trabajo si alguien te obliga a que lo hagas.
Escribiendo un salvapantallas para Gnu/Linux [C]
Los salvapantallas son algo que siempre me llamó poderosamente la antención pero hasta hace poco no sabía como se escribían, hoy aprenderemos a hacer uno para el XScreensaver de Gnu/Linux.
El primer paso es hacernos con el archivo vroot.h del xscreensaver (si hacemos apt-get source xscreensaver nos lo encontraremos en el directorio utils/ [o aquí]), y meterlo en el mismo directorio en el que desarrollaremos el resto del código. vroot.h es un archivo (bajo licencia de estilo BSD) usado comunmente para tomar al ventana_raíz, en la que tenemos que escribir si, por ejemplo, queremos hacer un salvapantallas.
Empezamos entonces con nuestro archivo, lo llamaremos salvapantallas.c y empezamos con el código, si bien va todo junto los comentarios hacen las "presentaciones":
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
|
Y ya tenemos el esqueleto de un salvapantallas, vamos a meter algún relleno en drawScreen y ya lo configuramos, así ya se puede ir probando antes de meterse a hacer alguna animación en concreto.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
|
El grupo de if/elses se hace un poco pesando, pero es lo más simple que encontré que pudiese producir una animación coherente y mostrase un poco de todo :/. Bien, ahora a probarlo, primero lo compilamos, hace falta avisarle al
1 2 |
|
Hecho esto, tenemos que guardarlo en /usr/lib/xscreensaver/ sudo mv salvapantallas /usr/lib/xscreensaver/
Luego solo queda añadirlo al archivo .xscreensaver de la carpeta $HOME, al final de la lista para poder encontrarlo fácilmente:
- salvapantallas -root \n\
Y ya lo podemos probar, lanzamos xscreensaver-demo y seleccionandolo se nos muestra una animación:
Bien, así se hace un salvapantallas, ahora vamos a ponerle otra animación, lo primero: borrar todo el código de drawAnimation :), vamos a dibujar la curva del dragón
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
|
Este es el resultado:
Que os parece, animaos a hacer uno vosotros también, todo sea por mirar los colorinchos :P.
ps: Aúa que tirara de tantos static, no se debe hacer, fue para evitar andar a hacer cambios por todo el código, non es algo que se deba hacer en código limpio ;)
Saludos
Activando los logs generales de MySQL sobre la marcha [tip]
Suponed que estamos programando algo que hace uso de una base de datos MySQL y que de repente comienza a comportarse de forma extraña, como podemos saber que peticiones hace, pues activando los logs generales así:
1 2 3 |
|
Lo malo es que hace falta ser root para poder hacerlo (y que el rendimiento cae, claro, no es algo que deba estar siempre activo).
Happy debugging.
Llevando la contraria sobre la sintaxis de arrays en C
Hola, hoy quería mostrar una pequeña ida de olla, hechadle un vistazo al siguiente código:
1 2 3 4 5 6 7 8 |
|
Compila, y hace lo que parece, pero tiene algo extraño... el orden variable [posición] está invertido, por que sigue funcionando.
Lo que pasa es que la posición de memoria se calcula como <dirección a la que apunta 'variable'> + (<posición> * <tamaño de una unidad de la variable>). Para los strings, el "tamaño de una unidad" es 1, así que queda como: <dirección a la que apunta variable> + <posición>, la suma es conmutativa, así que las posiciónes se pueden intercambiar.
ps: Obviamente esto no se debería hacer en código "real", por lo que pueda pasar si cambian los tipos de datos ;)
Saludos
Queda dicho
Leyendo Mimi and Eunice me encontré esto:
- Te denuncio por robar los potenciales beneficios de mi cliente.
- Eso tiene sentido potencial.
- Aquí tienes cien mil potenciales dólares.
One liners (13): sacar un número de urandom en python
1 |
|
-
os.urandom(1024)
Lee 1024 bytes de urandom. -
map(lambda x: ord(x), ...)
Convierte la cadena en un array con los valores de los caracteres. -
reduce(lambda x, y: x * 256 + y, ...)
Junta los bytes respetando el valor dado por la posición.
Recuperando un archivo eliminado pero abierto por otro proceso
Hoy, hace escasos 10 minutos estaba limpiando el disco, así que me dirijí a la carpeta de vídeos y... ¡raaaaca!, 20 archivos a alimentar la bestia del espacio libre. Pero al ver los archivos que habían sobrevivído a la limpieza sobrevino la preocupación sobre el paradero de uno de ellos, y es que quizá al fin y al cabo saltarse el paso de la papelera de reciclaje no fuera buena idea.
El problema era que me había cargado una película que tenía pensado compartir y con más bien pocos seeders, así que tocaba recuperarlo. Por suerte el transmission seguía abierto y seedeando, así que aún había esperanza, al fin y al cabo aún contaría con la información del archivo.
Los pasos a seguir fueron localizar primero el proceso
1 2 3 |
|
Proceso 26127, lo siguiente sería saltar al lugar donde se guarda la
información describiendo los archivos abiertos, este es /proc/
1 2 3 4 5 |
|
A continuación toca buscar el que nos interesa, no podemos llevarnos todos (o sí, pero no es necesario :P)
1 2 3 4 5 6 7 8 9 10 |
|
El que nos interesa en este caso es entonces el último, hacemos caso omiso al '(deleted)' y guardaremos todo lo que contenga, en este caso al archivo 'save' (¡cuidado!, si ya existe un archivo con este nombre lo sobreescribirá).
1 |
|
Cuando acabe y lo hayamos probado ya podemos renombrarlo
1 |
|
Y ya está, como si no hubiera pasado nada.
...Aquí queda como apunte por si alguien se encuentra alguna vez en la misma situación ;)
Diccionarios a lo Javascript en Python
Los "diccionarios" en javascript tienen una propiedad curiosa, que se pueden manejar los elementos como si fuera un array índicando el índice (con una variable) o como si fuera un atributo del objeto:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
En python los diccionarios no tienen esa propiedad, pero es fácil de hacer una clase que sí, apoyandose en que cada objeto tiene un diccionario interno, self.dict que almacena sus atributos, jugando con él (al menos si no nos metemos con los atributos que define la clase :P)...
`true` o `false`, cuantas variaciónes son posibles?
true
y false
son comandos unix que al ejecutarlos simplemente se finalizan
con código 0 y 1 respectivamente, algo que suele significar que hayan acabado
correctamente (0) y haber fallado (no 0).
Cuanta diferencia puede haber entre el código en distintas implementaciones? No mucha verdad?, al fin y al cabo es más simple que un Hola mundo. Pues tiene gracia la cosa =) ...
(Sin ningún órden en concreto)
GNU: escrito en C, jugando con el preprocesador, ¿por que no?.
true.c (78 líneas)
false.c (2 líneas)
80 líneas físicas, SLOCCOUNT: 52
OpenBSD: en bash, un simple exit
.
true.sh (3 líneas)
false.sh (3 líneas)
6 líneas físicas, SLOCCOUNT: 2
FreeBSD: en C, la mitad es licencia :P .
true.c (46 líneas)
false.c (46 líneas)
92 líneas físicas, SLOCCOUNT: 28
Solaris: en C, lo siento, no alcanzo a comprender a que viene _exit() y
después return() ¿?.
true.c (41 líneas)
false.c (41 líneas)
82 líneas físicas, SLOCCOUNT: 16
Busybox: en C, no encontré un repo con los archivos en texto plano, hay que
verlos aquí.
true.c (31 líneas)
false.c (31 líneas)
62 líneas físicas, SLOCCOUNT: 12
NetBSD: en bash, lo mínimo... o menos!
true.sh (2 líneas)
false.sh (2 líneas)
4 líneas físicas, SLOCCOUNT: 2
ps: hay una discusión sobre esto en r/programming.