Category Archives: Español

Cambio de permisos de forma selectiva

En ocasiones queremos cambiar los permisos de un directorio completo, incluyendo todos sus subdirectorios y ficheros. Lo habitual es hacer un cambio de permisos recursivo como:

chmod -R 644 datos/

Con esto pondriamos los permisos: -rw-r–r– Es decir, lectura/escritura para el propietario y lectura para el grupo y los otros. Pero en el caso de que tengamos un subdirectorio dentro de “datos/”, a este también le habremos puesto esos permisos, lo que significa que no podremos entrar en el directorio ya que el permiso de ejecución en un directorio significa que se puede entrar en el.

Esto supone un problema, queremos cambiar los permisos de todos los archivos y subdirectorios de “datos/” pero si lo hacemos como hemos visto asignamos unos permisos a los subdirectorios que no son correctos. La solución:

find data/ -type f -exec chmod 644 '{}' \;
find data/ -type d -exec chmod 755 '{}' \;

Antes de ; va una barra contraria a /, no se pq motivo se pierde al visualizar el post.

Con estos dos comandos estaremos haciendo ‘chmod 644’ solo a los ficheros que esten dentro de “data/” y sus subdirectorios, y se hará ‘chmod 755’ a los subdirectorios de “data/”. Por supuesto se pueden poner los permisos que nos convengan o indicar el directorio que queramos.

Comandos mldonkey para limitar descargas

El cliente P2P que utilizo es mldonkey, se pueden configurar diversos parámetros mientras esta en ejecución y los que me resultan más utiles són los que limitan las descargas o subidas:

# Sin limites = 0
set max_hard_download_rate 5
set max_hard_upload_rate 3
set max_concurrent_downloads 0
set max_upload_slots 3

Este ejemplo limitaria los downloads a 5 KB/s y los uploads a 3KB/s, permite que se descarguen un numero ilimitado de archivos a la vez pero solo permite que se suban 3 archivos simultaneamente.

Texto “cifrado”

Es muy curioso este texto invertido/cifrado/…. no se bien bien como catalogarlo 😉

“Sgeun un etsduio de una uivenrsdiad ignlsea, no ipmotra el odren en el que las ltears etsan ersciats, la uicna csoa ipormtnate es que la pmrirea y la utlima ltera esten ecsritas en la psiocion cocrrtea. El rsteo peuden estar ttaolmntee mal y aun pordas lerelo sin pobrleams. Etso es pquore no lemeos cada ltera por si msima snio la paalbra cmoo un tdoo. Pesornamelnte me preace icrneilbe…”

Libros recomendados por un amigo

Luis me recomendó hace tiempo unos libros, tengo guardado los nombres en un fichero de mi HD y no quiero perderlos así que mejor los pongo en el blog. Los libros que me recomendó fueron:

“La oración de la rana” Anthony de Mello
“Veronika decide morir” de Paulo Cohelo
“La trilogía de Nueva York” de Paul Auster
“El caballero de la armadura oxidada”de Robert Fisher

Visual Basic for Applications (MS Access)

Entre ayer y hoy he aprendido a utilizar VBA en Access para realizar unas modificaciones en unas bases de datos, lo pongo aqui como referencia por si vuelvo a necesitar hacer algo del estilo:

' ExecuteQuery: Realitza una modificació a la BD
' Provar amb:
'  ExecuteQuery "INSERT INTO CamaraEnvasadoPreenvasado VALUES ('test', 'borrar')"
Sub ExecuteQuery(strSQL As String)
   Dim cnn          As ADODB.Connection
   Dim lngAffected  As Long
   
   ' Open the connection.
   Set cnn = CurrentProject.Connection

   ' Execute the query.
   cnn.Execute CommandText:=strSQL, _
               RecordsAffected:=lngAffected, _
               Options:=adExecuteNoRecords

   'Debug.Print "Records Affected = " & lngAffected
   
   ' Close connection and destroy object variables.
   cnn.Close
   Set cnn = Nothing
End Sub

' TransformDB: Agafa els registres de Frustas_Hortalizas amb el
' camp "checkField" a true i guarda el num. suscriptor junt amb
' "idEnvase" a la taula RelacionEnvase
' Provar amb: TransformDB "Pre_codigo_PLU", 25
Sub TransformDB(checkField As String, idEnvase As Integer)
    Dim cnnDB As ADODB.Connection
    Dim recordSt As New ADODB.Recordset
    Dim strSQL As String
    Dim idSuscriptor As String
    Dim i As Integer
   
    ' Connectar a la BD actual:
    Set cnnDB = CurrentProject.Connection

    ' Obtenim els registres que tenen el camp indicat a true
    strSQL = "SELECT * FROM Frustas_Hortalizas WHERE " & checkField & " = -1"
    With recordSt
        Set .ActiveConnection = cnnDB
        .CursorType = adOpenKeyset
        .CursorLocation = adUseClient
        .LockType = adLockOptimistic
        .Open strSQL
    End With
    
    ' Insertar a la taula RelacionEnvases una relacio entre
    ' l'idSusbcriptor dels registres trobats i el idEnvas corresponent
    ' al camp que hem comprovat
    i = 0
    If Not recordSt.EOF Then
        recordSt.MoveFirst
    End If
    Do While Not recordSt.EOF
        idSuscriptor = recordSt.Fields("Numero de suscriptor").Value
        ' Insertar amb ID de "envasado" 26
        ExecuteQuery "INSERT INTO RelacionEnvases VALUES ('" & idSuscriptor & "','" & idEnvase & "')"
        i = i + 1
        recordSt.MoveNext
    Loop
    'Debug.Print "Fields " & recordSt.Fields.Count
    Debug.Print "Found " & i & " registers with field " & checkField & " = true. idEnvase = " & idEnvase
   ' Close Connection object and destroy object variable.
   cnnDB.Close
   Set cnnDB = Nothing
End Sub

Mientras editamos el modulo en MS Access podemos pulsar CTRL+G para mostrar la ventana “Inmediato” y ahi se pueden ejecutar las funciones.

Apache, PHP5 y MySQL en Windows

Ayer en el trabajo instalé y configuré por primera vez un Apache con soporte PHP5 y MySQL en un sistema Microsoft Windows 98. Lo necesitabamos para hacer pruebas, las aplicaciones web finales se albergan en un servidor GNU/Linux pero las estaciones de trabajo tienen Windows y ahi es donde queriamos hacer las pruebas. Sobretodo probar PHP5, concretamente la Release Candidate 3.

Pasos que he tenido que dar:

  1. Bajar:
    Apache 1.3.31
    PHP 5.0.0 RC3 versión sin instalador
    MySQL 3.23 versión sin instalador (la versión 4.0.x no la conseguí hacer funcionar)
  2. Apache: instalamos y modificamos el archivo de configuración para que el DocumentRoot apunte a “c:/phpWeb/” y también el lugar donde se especifican los permisos de “c:/phpWeb/” (antes hacia referencia tanto esto como el DocumentRoot a “c:\…\htdocs”). En el menú aplicaciones de Inicio aparece un enlace al archivo de configuración.
    DocumentRoot "c:/phpWeb/"
    ..
    <Directory "C:/phpWeb/">
    ...
    </Directory>
    ...
    DirectoryIndex index.html index.php index.htm welcome.htm welcome.html index.php3
    ...
    LoadModule php5_module C:/php-5.0.0RC3/php5apache.dll
    AddModule mod_php5.c
    AddType application/x-httpd-php .php...
    
  3. PHP: Descomprimo el zip en “c:\php-5.0.0rc3”, copio el php.ini-recommended a “c:\windows” y lo renombro a “php.ini”, lo edito y lo configuro a mi medida:
    register_globals = On
    ...
    register_long_arrays = On
    ...
    extension_dir = "C:\php-5.0.0RC3\ext"
    ...
    extension=php_mysql.dll
    

    Copio el php5t??.dll a “C:\windows\system”.

  4. MySQL: Descomprimo el zip en “c:\mysql”, creo un archivo llamado my.ini en “c:\windows” conteniendo:
    [mysqld]
    # set basedir to your installation path
    basedir=c:/mysql
    # set datadir to the location of your data directory
    datadir=c:/mysql/data
    skip-innodb
    

    Y copio la libreria “libmysql.dll” a “c:\windows\system”, esto es necesario para que podamos activar la extensión MySQL de PHP.

  5. Arrancamos la mysql:
    cd c:\mysql\bin\
    mysqld --console
    

    Para acceder por consola:

    cd c:\mysql\bin\
    mysql -p -u root
    

    El password de root por defecto esta vacio, es decir, simplemente es necesario pulsar enter. Es recomiendo que os bajeis el MySQL Control Center, esta disponible tanto para MS Windows como para GNU/Linux y permite administrar MySQL de forma gráfica. Otra alternativa es usar PHPMyAdmin para poder administrar la MySQL por web (necesita un apache con soporte PHP y MySQL funcionando).

  6. Arrancamos Apache: a través del menú aplicaciones de Inicio podemos ejecutarlo.
  7. Prueba: Creamos en “c:\phpWeb” un fichero que se llame index.php con:
    < ?php phpinfo(); ?>
    

    E intentamos acceder con nuestro navegador a “http://localhost/”

  8. Esto es todo 😉

Webfs: Compartir archivos por HTTP

Ayer me baje de los servidores de GPL Tarragona unos videos de unas jornadas de bulma que habiamos puesto a disposición de todos. Lo baje en la misma universidad, utilice wget ya que estan disponibles a través del servidor web, es decir, HTTP… y me bajo todo a una velocidad de 1 Mega por segundo.

Antes siempre que tenia que bajarme algo del servidor en la universidad usaba sFTP (SSH), cosa que esta bien si se tratase de archivos privados ya que usa encriptación, pero para el resto de casos es terrible, la velocidad es muy inferior. Así que quedé encantado con la posibilidad de bajar archivos por HTTP o incluso de compartirlos, asi que hoy me he puesto a hacer una rapida búsqueda por el portage de Gentoo y he descubierto una pequeña maravilla: WebFS

Mmmm…. estaba empezando a escribir sobre webfs cuando me he dado cuenta que mejor lo hago en GPL Tarragona. Luego os pongo un link al artículo aqui 😉

Actualización Ya he escrito el artículo: Compartir directorios con webfs:

Webfs es un servidor web muy simple que permite acceder a cualquier tipo de contenido estático, es decir, nada que ver con servidores web de la categoría de Apache. Ni tan siquiera dispone de archivo de configuración, todas sus funcionalidades se pueden controlar por parámetro. Entonces… ¿Qué tiene de interesante webfs?

¿Cuantas veces nos ha pasado que queremos pasar algún archivo a un amigo por la red usando GNU/Linux y no tenemos nada configurado para llevarlo a cabo? A mi me ha pasado en más de una ocasión y suele ser engorroso ponerte a configurar un servidor FTP o Samba.

Es más, ¿Cuantas veces ha pasado que queremos pasar un archivo a otra persona desde un GNU/Linux a un sistema MS Windows y el usuario no tiene ni idea de que es un cliente FTP? Aquí siempre hay 2 opciones:

a) Le explicas que es un FTP y os bajais un cliente de FTP.
b) Bajas tu un cliente de FTP y pasas el archivo sin explicaciones 😛

En función de quien es el usuario es muy probable que si se elige la opción a) al cabo de media hora acabemos saltando a la opción b).

¿En que nos puede ayudar webfs? Vayamos por puntos:

  1. Puedes compartir cualquier directorio de tu sistema GNU/Linux con un comando, por ejemplo:
    webfsd -F -r /home/usuario/peliculas -p 2000
    

    Esto indica que no queremos que se ponga en segundo plano como demonio (-F), queremos compartir el directorio “/home/usuario/peliculas” y debe escuchar por le puerto 2000. Para pararlo basta hacer ctrl+c. Si quitamos el -F, al ejecutar webfsd automáticamente nos quedará libre la terminal y se ejecutará en segundo plano, para pararlo tendremos que ejecutar “killall webfsd” o “kill pid_webfsd“.

  2. ¿Que ordenador no tiene hoy en día un navegador? ¡Prácticamente cualquier sistema operativo dispone de un navegador web! Por tanto desde el otro ordenador podremos abrir el navegador y apuntar a nuestro servidor: http://[nuestra_ip]:2000/

    Esto nos mostrará un listado de los directorios y ficheros que tenemos en “/home/usuario/peliculas”, podremos elegir el fichero que queramos y descargarlo. Incluso podríamos usar gestores de descarga para poder resumir/reanudar, como el wget:

    wget -c http://192.168.0.33:2000/accion/ToyStory2.avi
    

    El archivo se descarga en el lugar donde se ejecute wget, en caso de que queramos pararlo podemos presionar ctrl+c y para reanudar más adelante, en el mismo directorio se vuelve a ejecutar wget pero con el modificador “-c” y así completará el archivo que habíamos dejado a medias.

Alguien podría decir: ¡Pero es que yo voy a pasar el archivo a través de una red pública donde hay más usuarios y no quiero que estos se aprovechen y accedan a lo que comparto! Hay solución:

webfsd -F -r /home/usuario/peliculas -p 2000 -busuario:password

De esta forma cuando alguien intente acceder al servidor se le preguntará por un usuario/password y debe especificar el mismo que hayamos indicado al ejecutar webfsd (no es necesario que corresponda a un usuario real del sistema).

Es más, incluso es posible utilizar SSL y hacer que las comunicaciones estén encriptadas. Con esto perderemos velocidad, pero ganamos en privacidad y mantenemos la flexibilidad. Esta característica no he conseguido que funcione:

webfsd -S -C /etc/apache2/conf/ssl/server.crt -F -r ./ -p 2000

Es necesario disponer de un certificado para que pueda realizar la encriptación, estos certificados los podemos generar nosotros mismos con OpenSSL:

openssl genrsa -out domainname.key 1024 
openssl req -new -key domainname.key -out domainname.csr 
openssl x509 -req -days 36000 -in domainname.csr -signkey domainname.key -out domainname.crt

Con esto generamos primero una llave RSA no protegida por ningún password (si nos roban esto, podran desencriptar nuestras comunicaciones con esta llave o hacerse pasar por nosotros), a continuación creamos la petición de certificado y finalmente creamos el certificado firmado por nosotros mismos (en sitios de comercio electrónico los certificados suelen ser firmados por entidades certificadoras, las cuales cobran por hacer esto… aunque tb hay webs que firman certificados de prueba temporales como FreeSSL).

Si intento acceder con Mozilla a “https://localhost:2000” me indica: “Mozilla and localhost cannot communicate securely because they have no common encryption algorithms”. Si alguien consigue hacerlo funcionar agradeceria que añadiese algun comentario al artículo.

¿Qué os parece webfs? ¿Utilizáis algún otro método para compartir archivos? Seria interesante integrarlo en gnome, concretamente el navegador de disco nautilus, utilizando los nautilus-scripts. Se me ocurre ahora mismo un método:

1) Tener un directorio que siempre es compartido, por ejemplo /home/usuario/Desktop/shared/
2) Al iniciar la sesión en gnome se ejecuta automáticamente webfs: webfsd -r /home/usuario/Desktop/shared -p 2000
3) Hacer un nautilus script que permita compartir carpetas y lo que hara en realidad es un enlace simbólico dentro de shared/ que apunta al directorio que hemos indicado. Así podremos compartir varios directorios con una única instancia de webfs. También podriamos hacer que se añadiese un emblema para marcar esa carpeta como compartida.
4) Para dejar de compartir una carpeta:
   a) Hacer un nautilus script, vas a un directorio compartido, lo seleccionas y ejecutas el “descompartir”, el script borra el enlace simbólico y quita el emblema.
   b) El usuario puede borrar directamente el enlace de la carpeta shared/. Esto implica que no se pueda quitar automáticamente el emblema en el caso de que se pueda implementar esto.

La idea queda en el aire 😉

GP32 ya esta aqui!

Ya esta a la venta la consola portatil GP32 de la que he hablado en otros posts: GP32 (1) y GP32 (2).

Creo que he superado por ahora la “necesidad” de comprarla, los motivos:

1) GP32 salió en el 2000, que llegue a Europa ahora no quiere decir que sea nueva. Eso hace que ya tenga una gran comunidad detras pero también implica que su futuro sea más reducido.

2) He descubierto Zodiac, otra consola portatil que solo esta la venta en EEUU y que parece otra maravilla. Mejor procesador, targeta grafica ATI, pantalla tactil…. mezcla de PDA y consola. Por supuesto, también mucho mas cara 😀 Viendo que existe esta otra maravilla… quieras o no quita las ganas de comprarse una GP32, Zodiac es más joven pero ya tiene sus comunidades detras. De todas formas tampoco pienso comprarme una Zodiac de importación 😀

3) GP32 puede arrancar un GNU/Linux, fantastico, maravillo…. pero cuando ya se haya pasado la ilusión del arranque, que? Que haces con una consola con un GNU/Linux? A priori poca cosa. Lo emocionante seria hacer que el kernel de Linux funcione con la GP32, etc, etc… pero el producto final… no se, usar el mplayer para reproducir videos quizás… de todas formas la CPU es muy pobre. Vamos, que me encanta que tenga un GNU/Linux pero que ahora mismo no veo la utilidad real.

4) No juego. No suelo invertir el tiempo en juegos, lo invertiria en la GP32? Los primeros dias quizas… después no creo.

5) Reproductor de MP3, la GP32 solo acepta como maximo memorias de 128. No acepta tarjetas de más cantidad pq requieren mayor voltaje. Actualmente ya hay buenos reproductores y más compactos, por no decir que con un poco de tiempo empezarán a bajar los reproductores con capacidades del orden de 15 GB.

Así que en definitiva he superado la “crisis” 😛 Ya lo se ya… paso del blanco al negro, que le vamos a hacer… a veces soy muy impulsivo y con el tiempo lo medito 😉

Yo, robot

Me acabo de enterar a traves de barrapunto que se va a estrenar este año la pelicula basada en el libro “Yo, robot” de Isaac Asimov!! Me gustó el libro así que tengo muchas ganas de ver la pelicula 😉 Segun comenta en la web de la pelicula “Yo, robot” en España sale el 30/07/2004. Lo que más me ha sorprendido es que actua Will Smith, uno de mis actores preferidos 🙂 Se perfila como la pelicula del verano (para mi, claro xD).

KDE. Gentoo.

Ayer me instale KDE, las motivaciones supongo que eran que estaba algo chafado en parte pq cosas tan básicas como buscar un archivo usando nautilus (GNOME) resultaba complicado. Quieren simplificar tanto el escritorio que acaban complicando la vida al usuario.

Por desgracia en KDE aguante unos 20 minutos, es completamente saturante… demasiadas opciones! Ambos escritorios son extremistas, me gustaria que hubiese algo más situado en el termino medio entre la usabilidad y la configurabilidad. De todas formas me sigo sintiendo más cómodo en GNOME, quizás sea la costumbre… supongo que aquellos que empiecen con KDE y esten acostumbrados a esa aglomeración de opciones, cuando entren en GNOME les sabra a poco.

Dejando de lado los escritorios… hoy he leido un breve pero interesante post de Tomàs en el que enlaza un artículo que explica algunos trucos del portage de Gentoo. He aprendido cosas muy útiles y que desconocia de Gentoo 🙂

En Gentoo puedes mezclar paquetes, teniendo el sistema con las versiones estables de los programas pero instalando programas puntuales en su versión inestable. Esto puede provocar problemas como por ejemplo que cuando quieras actualizar todo el sistema con ’emerge -pUD world’ no te lo permita, indicando que hay programas inestables con dependencias inestables. Hasta ahora, cuando ocurria eso tenias que probar a intentar actualizar el sistema con ’emerge -puD world’ cosa que hacia que se instalasen versiones estables de los paquetes inestables (reemplazando). Nada, todo problemas.

Resulta que es posible configurar que programas queremos que sean inestables en un fichero de configuración, de forma que emerge siempre coge por defecto esta versión inestable y ya no hay problemas para hacer un ’emerge -pUD world’ o ’emerge -puD world’. Este fichero es el /etc/portage/package.keywords:

net-im/guifications ~x86
net-im/gaim-encryption ~x86
net-im/gaim ~x86
=media-sound/rhythmbox ~x86
=media-plugins/gst-plugins-faad ~x86
=media-libs/faad2 ~x86
x11-themes/redhat-artwork ~x86
=media-video/ati-drivers ~x86
media-video/totem ~x86
=app-dicts/stardict ~x86

Otra cosa interesante es que podemos hacer que un programa determinado tenga unas USE determinadas diferentes a las USE del sistema por defecto, /etc/portage/package.use:

x11-themes/redhat-artwork kde
media-video/totem -gstreamer

Esto me recuerda que totem es un gran reproductor de video/audio siempre y cuando no utilice gstreamer como base de reproducción, mejor que use las librerias de xine, sinó se convierte en algo bastante inestable y no reproduce todo lo que deberia. De todas formas mplayer gana en cuanto a cantidad de videos que puede reproducir, pero totem es más visual y más sencillo para usuarios noveles.

Sigo con Gentoo… como muchos sabeis, hay paquetes que no tienen versión estable y a estos se les dice que estan en mascarados, con los métodos que hemos visto hasta ahora podemos “desenmascararlo” facilmente indicando que queremos utilizar la versión inestable en el packages.keywords. Pero hay otros programas que estan fuertemente enmascarados (hard masked), estos suelen ser programas que són muy inestables o tienen fallos de seguridad como realone. Si queremos instalarlos a pesar de eso debemos añadir a /etc/portage/package.unmask:

media-video/realone

Finalmente, he entendido como funciona el ’emerge depclean’ que permite desinstalar programas/dependencias que no son necesarias. No es tan peligroso como se indica en otros lugares siempre que tengas el archivo /var/cache/edb/world coherente. Esto me ha permitido eliminar programas que tenia en mi sistema solo ocupando sitio sin que nadie los utilizase, esta característica era algo que también echaba en falta de Gentoo (resulta que no es que no la tuviese, es que yo no la conocia en profundidad).