Google Reader, ¿cómo se renombra una carpeta?

Pues no es tan sencillo, o al menos los de Google no han hecho una forma sencilla de renombrar una carpeta. Ir a la carpeta y buscar la opción de “rename” es sorprendente. ¡No existe!.

La única manera más o menos sencilla y rápida ha sido este manual que me encontrado en los blog de Softonic. De manera resumida, solo hay que crear una nueva carpeta, mover todos los feed de la carpeta antigua a esta nueva, y borrar la carpeta que no queremos ver mas. En el post viene mucho mejor explicado y con fotos que siempre son de mucha ayuda.

Espero que os sirva de ayuda.

Please follow and like us:

Como recuperar un Raid0 tras un fallo de disco en Ubuntu

Hoy me he enfrentado a este problema. Uno de nuestros servidores de respaldo (al menos no era un principal) ha muerto. Tras mirar que ocurría, sencillamente que el raid no existía, nos hemos dado cuenta de que un disco duro había pasado a mejor vida. Obviamente, al ser un Raid0 se pierde toda la información (por lo que hay que tener un respaldo, ya sea en otro equipo, o mediante otro raid), y en nuestro caso, este servidor era el respaldo de otro, por lo que simplemente hay que recuperarlo y volver a sincronizar con el principal.

Antes de nada, recordaros un gran blog que habla mucho sobre estos temas y muchos más, como es el blog de Iván López, que merece ser leído ya que ha hecho cosas muchos más complejas que esto, y del cual saco mucha información que vas a leer más adelante.

¿Como vimos el fallo?. La verdad que fue sencillo ya que tuvimos un apagón y el servidor no se recuperó bien, mediante el comando podemos ver el desastre:

more /proc/mdadm

Todos los discos que forman el raid se encuentran con una (S) a su lado (son discos spare) y falta uno. En nuestro caso, teniamos 7 discos, y solo salian 6.

sudo mount

Y nos encontramos que el raid no esta montado… bueno, toca buscar el disco duro roto. Un buen método es mirar el dmesg y ver cual da error, en nuestro caso no quedaba claro (la bios de la máquina marcaba el disco como conectado, pero luego linux no era capaz de mostrarlo), se fue desconectando uno a uno cada disco hasta que le encontramos. Se substituyo por uno de igual capacidad, ya que no es recomendable mezclar capacidades en Raid0.

Bien, pues substituimos el disco duro que esta averiado por el nuevo, pero este no está preparado para formar parte de un raid, por lo que lo conectamos y arrancamos la máquina (obviamente no montará el raid) y abrimos Gparted (en su defecto lo instalas). Le creas una nueva tabla de particiones, lo formateas a capacidad completa con el tipo de ficheros “sin formato”. Aplicamos y luego nos vamos al menú de “Partición > marcas” (no recuerdo exactamente como se dice en castellano, en ingles es “flags”, ya que mi servidor esta en inglés) y marcamos sólo “raid” de todas las opciones que nos aparecen. Aceptamos y el disco duro ya está preparado para ser parte de un raid.

Ahora tocaba eliminar todo rastro del antiguo raid, primero en los discos anteriores:

# Se tiene que parar o dará un error de que está en uso.
# Si se tienen dudas mirar en /proc/mdadm
sudo mdadm --stop /dev/md0
# Si incluyes el disco duro nuevo, este dará un error
#  no importará sigue adelante
sudo mdadm --zero-superbloc /dev/sd[a-g]1

Ya tenemos los discos impolutos y listos para volver a montar, pero antes hay que eliminar cualquier configuración de la existencia de raid en “/etc/mdadm/mdadm.conf” eliminando cualquier linea del tipo:

ARRAY /dev/md0 level=raid0 num-devices=7 UUID=1803e03e:db1868b2:d2508c3c:95c11b58

Aunque esto último no es obligatorio, ya que se va a reescribir unos pasos mas adelante, nos vendrá muy bien por si necesitamos un reinicio en la máquina, y así el sistema no tratará de montar de nuevo el raid con el fallo de disco.

Tras esto, ya podemos volver a crear nuestro raid:

sudo mdadm --create --auto=yes --verbose /dev/md0 --level=0 --raid-disks=7 /dev/sd[a-g]1

Ojo, que el parámetro auto del comando mdadm es muy interesante, ya que crea, si no existiera, el dispositivo md0, dentro del directorio “/dev“. Si has hecho un reinicio seguramente no tengas dicho dispositivo ya que se elimina si no esta en uso.

Bien, comprobamos que todo funciona, formateando la nueva partición:

sudo mkfs.ext3 -v /dev/md0

Con un simple:

sudo mount -a

remontamos el sistema de ficheros, y podemos acceder al raid. Perfecto.

Ahora queda el paso final, y es volver a crear el fichero /etc/mdadm/mdadm.conf:

cd /etc/mdadm
sudo cp mdadm.conf mdadm.conf.`date +%y%m%d`
sudo sh -c 'echo "DEVICE partitions" > ./mdadm.conf'
sudo sh -c 'mdadm --detail --scan >> ./mdadm.conf'

Testeamos que todo este bien:

more ./mdadm.conf
DEVICE partitions
ARRAY /dev/md0 level=raid0 num-devices=7 UUID=bed08171:06afc57d:9c8da9aa:858c4c7d

Y ahora solo queda sincronizar el contenido, en mi caso con un rsync que va a tardar al menos unas 6 horas en sincronizar mediante una gigalan directa entre servidores, pero puedes hacerlo como sea, como por ejemplo discos duros externos, y ya tu raid vuelve a funcionar tras el susto del fallo del disco.

Actualización: Aveces, si usamos en el fichero “/etc/mdadm/mdadm.conf” la linea “DEVICES partitions“, al reiniciar no funcionan correctamente los raid, y cuando se realiza un “mdadm –examine /dev/sdxx” nos encontramos que tienen un diferente UUID que no cuadra ni con el fichero “mdadm.conf“.

Para evitar esto, la única solución que he logrado, gracias a esta entrada de la web de Ubuntu-es, encontrar es eliminar la entrada de los “DEVICES” y poner en el fichero “mdadm.conf“:

# Obviamente pon los devices que use tu raid
ARRAY /dev/md0 level=raid0 num-devices=3 metadata=00.90 UUID=e1fbf1e6:da616113:e368bf24:bd0fce41 devices=/dev/sda2,/dev/sdb1,/dev/sdc1

Al añadir al final los “devices” los monta correctamente, y sin hacer cosas raras. Según leo, no es muy recomendable (no se porqué) pero hace que al menos en mis maquinas no falle.

Please follow and like us:

Como extender los permisos de Linux: ACLs

Las ACLs o “Access Control List” son una forma de extender los permisos de seguridad que podemos asignar a los directorios y archivos de linux. Estos permisos nos permiten una mayor flexibilidad que el rígido sistema que suelen utilizar los sistemas *nix (también conocido como UGO o “User, Group, Other”), y es muy útil cuando nuestro sistema de permisos se complica por la necesidad de incluir muchos permisos diferentes a usuarios y grupos (la utilización de los permisos tradicionales o UGO son muy complejos en estos casos), ya que nos permite ir dando permisos a cada usuario del sistema/dominio de manera independiente.
El sistema de permisos ACL no substituye al sistema UGO, más bien lo extiende, ya que permite añadir muchos permisos extra partiendo de los UGO. De hecho se siguen respetando los permisos tradiciones (UGO) y se integran dentro de ACL, como y a explicaré más adelante.

Estos permisos, ACL, son necesarios cuando compartimos una carpeta a máquinas Windows (mediante Samba por ejemplo), ya que Windows usará estos permisos, y nos permitirá cambiarlos desde la misma pantalla de propiedades, pestaña de seguridad, de Windows, como muestra la imagen siguiente:

Panel de seguridad de Windows

Panel de seguridad de Windows

En este post, repasaré un poco el sistema tradicional de permisos (UGO) ya que el sistema de permisos ACL lo complementa y es necesario tener conocimientos básicos, aunque no voy a profundizar mucho en él, ya que puedes encontrar muchos manuales sobre el tema en internet (Google es tu amigo).

Importante: Conocer los permisos UGO es fundamental para utilizar los permisos ACL, por lo que te ruego encarecidamente que si no tienes algo de “culturilla” sobre el tema, que te leas el artículo entero aunque no trate directamente de ACL.

Soportar ACL en Linux

Primero de todo, para lograr que linux use este sistema hay que añadir a “/etc/fstab” en la entrada de la partición que queremos que use ACL, el parámetro “acl” al montar una partición, como indica la siguiente linea:

# Entry for /dev/sda2 :
UUID=e4f75e2b-56b5-4857-aa57-04629fbab9c8 /datos ext3 noatime,acl 1 2

Nota: Aunque casi todos los kernel de linux ya traen el soporte activado para ACL (la distribución Ubuntu la trae por defecto al menos), si usas una distro muy antigua, quizás tengas que recompilarte el kernel con ciertas opciones activadas, en internet hay varios manuales de como hacerlo.

De UGO a ACL…

Desde cualquier terminal, podremos ejecutar un “ls -l” (que es una herramienta muy potente para cualquier administrador si se sabe usar) para observar los permisos de los archivos de nuestro directorio actual, como mostramos en el siguiente listado que hemos capturado de un sistema linux cualquiera:

drwxr-sr-x 2 news   news   4096 2009-10-08 12:16 news
drwxr-xr-x 2 ntp    ntp    4096 2009-05-13 23:06 ntpstats
-rw-r--r-- 1 root   root      0 2009-07-09 09:44 pycentral.log
drwxr-x--- 3 root   adm    4096 2009-10-09 10:23 samba
-rw-r--r-- 1 root   root 505653 2009-10-08 13:08 scrollkeeper.log
-rw-r----- 1 syslog adm     564 2009-10-09 11:17 syslog
-rw-r----- 1 syslog adm  485104 2009-10-09 09:36 syslog.0
-rw-r--r-- 1 root   root 383188 2009-10-09 09:16 udev
drwxr-xr-x 2 root   root   4096 2008-03-10 16:24 unattended-upgrades
-rw-r----- 1 syslog adm     736 2009-10-09 09:17 user.log
-rw-r----- 1 syslog adm     274 2009-10-08 12:38 user.log.0
-rw-rw-r-- 1 root   utmp  33408 2009-10-09 11:32 wtmp

Para el tema de identificar los permisos, nos interesa mucho la primera columna (empezando por la izquierda) donde se nos muestran los permisos tradicionales basados en usuario/grupo que tiene un archivo/directorio en el sistema linux. Luego la tercera columna nos indica el propietario del usuario, y la cuarta el grupo propietario del archivo/directorio.

Las partes que nos interesan son el primer bloque (como por ejemplo este: drwxr-x—), donde el primer carácter del bloque nos indica que tipo de elemento esta listando:

  • Fichero regular (o “-“)
  • Directorio (o “d”)
  • Archivo de bloques (o “b”) que suele ser típicos en el directorio “dev”
  • Archivo de carácter (o “c”)
  • Cola FIFO (o “f”)
  • Un enlace (o “l”)
  • Un socket (o “s”)

Como vemos en el primer bloque, después del primer carácter, nos encontramos una serie de caracteres agrupado de tres en tres, es decir 9 caracteres. Estos, básicamente, indican que tipo de permisos tiene asignado ese elemento (sea del tipo que sea) y los hay de 3 tipos:

  • Lectura (o “r”), para poder abrir los ficheros sin modificar.
  • Escritura (o “w”) para poder modificar el fichero.
  • Ejecución (o “x”) para ejecutar un programa o script. Si estamos hablado de un directorio, significa que podremos entrar dentro de el.

Estos permisos se tienen que aplicar a tres posibles escenarios (que equivalen a los tres bloques que hemos hablado antes), y que tienen el siguiente significado:

  • Para el usuario propietario del fichero (normalmente su creador), se identifica con el primer bloque (justo el que esta junto al carácter de tipo de elemento).
  • Para el grupo de usuarios propietario del fichero, se identifica con el segundo bloque. Este grupo no necesariamente tiene que ser a uno al que pertenezca el usuario ya que puede ser cualquier otro.
  • Para el resto de usuarios, que se identifica con el tercer bloque, los tres caracteres de la de derecha.

Es cierto que no solo se pueden aplicar los permisos rwx, ya que se pueden asignar ciertos permisos “especiales”:

  • “Sticky Bit” (o “t”)
  • “Bit Setgid” y “Bit Setuid” (o “s” con permisos de ejecución o “S” sin ella)

Como hemos comentado anteriormente, solo hay 3 posibilidades, permisos al usuario, al grupo del usuario y al resto. Imaginaros que tenemos 50~100 usuarios y los permisos son bastante complejos, tales como que hay varios grupos que tienen que usar cierto recurso o varios usuarios que queremos que sean propietarios de un fichero. Con este sistema de ficheros es bastante complejo de realizar o bien, creando grupos especiales para cada recursos.

Aquí viene ACL al rescate del pobre administrador de sistemas.

Al fin, ACL en nuestro sistema

Con los permisos ACL’s esto cambia, ya que podemos asignar varios permisos a nivel de usuario/grupo a un mismo fichero, lo cual nos permite muchas mas flexibilidad. Pero esto requiere unos cuantos comandos nuevos que no se suelen utilizar, estos comando son:

  • getfacl, el cual nos muestra los permisos que tiene un archivo o fichero.
  • setfacl, nos permite fijar los permisos. Es importante que por defecto nos permite asignar un permiso que no existiera, es decir, no se puede modificar un permiso con este comando.
  • chacl, nos permite modificar permisos.

Por ejemplo vamos a ver los permisos de un directorio, usaremos el comando “getfacl“:

nas001@nas001:~$ getfacl /var
getfacl: Removing leading '/' from absolute path names
# file: var
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

Este comando acepta algún parámetro extra, el cual puedes consultar en su ayuda, pero para este pequeña guía no son especialmente importantes. Solo remarcar el parámetro “-R” que nos permite recorrer recursivamente un directorio para listar los permisos de todos los ficheros y subdirectorios que existan dentro de una carpeta (y normalmente es una burrada de información que te recomiendo que vuelques a un fichero).

Como puedes ver, el comando getfacl tiene una salida diferente a el comando “ls” sobretodo mas descriptivo.

nas001@nas001:~$ sudo getfacl /mnt/raid/Carpeta/
getfacl: Removing leading '/' from absolute path names
# file: mnt/raid/CONTROL
# owner: root
# group: usuarios\040del\040dominio
user::rwx
user:user1:r-x
user:user2:r-x
user:user3:r-x
user:user4:r-x
user:user5:rwx
user:user6:rwx
user:user7:r-x
user:user8:r-x
group:Administracion:rwx
group::---
mask::rwx
other::---
default:user::rwx
default:user:user1:r-x
default:user:user5:r-x
default:user:user8:r-x
default:group:Administracion:rwx
default:group::---
default:mask::rwx
default:other::---

ACE, default y máscaras

Como se puede ver, esto puede ser es bastante mas complejo. Ya no tenemos la terna usuario/grupo/otros, sino que tenemos una lista de usuarios/grupos y luego el resto de los usuarios. Cada una de las lineas, que se identifica con un permiso se denomina “ACE” o “ACL Entry”. Estas ACE pueden referirse a “usuarios propietarios” o “usuarios nombrados”, siendo estos últimos los que se los nombra directamente en cada ACE, como por ejemplo:

user:user1:r-x # usuario nombrado "user1"
user::rwx # Usuarios propietario

En cualquier listado se puede observar el usuario propietario y  el grupo propietario, que se identifican con ACL mediante los ACE:

# ACE con los propietarios
user::rwx
group::---
other::---

Mientras que otros usuarios/grupos nombrados se pueden identificar mediante, en el siguiente listado, se puede ver los permisos del usuario “user1”, y del grupo “Administracion”:

# Entradas ACE con usuarios nombrados
user:user1:r-x
group:Administracion:rwx

Como podemos ver, cada permiso, viene caracterizado mediante 3 campos separados por “:”, algo tipo: “tipo:usuario:permiso”, donde el tipo pueden ser:

  • “u” o user, el permiso se aplica a un usuario
  • “g” o group, el permiso se aplica a un grupo
  • “o” u other, el permiso se aplica al resto de los usuarios que no aparezcan en ninguna entrada en la lista de permisos ACL.
  • “m” o mask, es una máscara de permiso. Se aplica sobre el permiso asignado a un usuario/grupo nombrado para obtener el permiso efectivo.

Otra peculiaridad a destacar, es el permiso que tiene la etiqueta “default”, como la siguiente:

default:user:user5:r-x

Esta entrada nos indica que todas las carpetas que se creen dentro de la carpeta que tiene este permiso, lo mismo que todos los ficheros que se creen, tendrán como permiso ACL heredado esta entrada, es decir, en este caso, el “user5” tendrá permiso de lectura y ejecución sobre todo lo que se cree dentro de esa carpeta.

Existe una entrada ACE que resulta muy curiosa, y es la entrada “mask“. Este entrada sólo afecta a los ACE nombrados, aquellos que tiene un usuarios o grupo en su entrada como ya explicamos, y que suelen cruzarse con los permisos que tengan los usuarios y grupos para generar permisos efectivos.

user:juan:rw- # el user1 tiene un permiso rw-
mask::r-x # Máscara con permisos r-x
# Permisos efectivos reales de user 1: r--

Modificando quien accede y quien no

Resulta que nos encontramos con dos comandos: chacl y setfacl. En casi todas la guías que leas el uso de chacl es prácticamente nulo, ya que todo el mundo usa setfacl (al parecer setfacl es mas completo, o simplemente gusta más que chacl). ¿Pero no decíamos que setfacl no modificaba los valores de los permisos?. Bueno, realmente si lo hace pero incluyendo un parámetro dentro del comando a ejecutar que nos permitirá tal posibilidad.

setfacl -m u:miuser:rwx /home/miuser/

Con estos comandos acabamos de dar permiso a “miuser” en la carpeta “/home/miuser/” para permiso de lectura, escritura y ejecución (en directorios significa poder listar su contenido). El parámetro “-m” significa modificar, lo que nos permite cambiar las ACL y incluir (o modificar) una ACE con el usuario y los permisos indicados.

setfacl -R -d -m u:miuser:rwx /home/miuser/

Como se había comentado antes en este artículo, existe una ACE que puede tener una etiqueta “default“, con este comando, podemos cambiar dicho permiso por defecto. Para ello, se usa el parámetro “-d“.
Como puedes ver, también se incluye la etiqueta “-R” que indica recursividad, es decir, que estos permisos que aplicarán al directorio y a todo el contenido de ficheros/directorios que albergue. No creo que tenga que avisaros que sepáis lo que hacéis cuando se usa un comando recursivo, ya que como metáis la pata vais a tener que andar limpiando por muchos sitios vuestro estropicio :).

Es muy importante en este comando, el tema de los errores. Al menos para mi, son bastante desconcertantes inicialmente ya que suelen generar errores bastante poco descriptivos del tipo:

nas001@nas001:~$ setfacl -m g:user1:rwx /var/log/messages
setfacl: Option -m: Argumento inválido near character 3

El error no esta en el parámetro “-m” (como parece que indica el error), si no en el usuario que se han incluido en el comando.
Fíjate bien, ya que pone una “g” de grupo delante de un usuario, por lo que nos da error, en el caracter 3, curiosamente donde empieza la palabra “user1“. Esto nos indica que el error esta en la terna de “tipo:id:permisos” que en el comando en sí.
Casi todo los errores son debidos a errores de este tipo. Avisado quedas 🙂

Borrando permisos

Tan importante como modificar los permisos, es eliminarlos de la lista de ACL. Si queremos eliminar un usuario, es cierto que podemos simplemente quitarle todos los permisos, pero seguirá apareciendo en la lista de ACL, con su ACE en el listado, lo que nos puede emborronar mucho y darlos listados muy largos y complejos de depurar (y os aseguro que algún día tendréis que mirarlos).

Para realizar una limpieza de permisos o como restaurarlos al defecto, habría que lanzar el siguiente comando (ojo que borra todos los permisos asignados dejando solo los que tenía por defecto):

setfacl -b -k -R directorio

Donde el comando “-b” borra los ACL y el “-k” los ACL por defecto o “defaults”.
Pero si queremos ser más selectivos y solo borrar un permiso en particular, es decir, quitar a un usuario/grupo y que no aparezca en el listado de permisos (pasa a usar los permisos de “other”), tendremos que usar el comando:

setfacl -x u:user1 /var/www

Este comando, eliminaría de los permisos a user1 en el directorio “/var/www”, y este usuario tendría que regirse por los permisos de “other” como ya hemos comentado anteriormente.

Referencias

  • “Using ACLs with Fedora Core 2”, Link.
  • “POSIX Access Control Lists on Linux”, Andreas Grünbacher SuSE Labs, Link.
  • “Uso de Listas de Control de Acceso (ACLs) en Linux”, Ignacio Arenaza Nuño, Proyecto escomposlinux.org, Link.
Please follow and like us:

Como habilitar el escritorio remoto en una máquina de tu dominio

Hoy mismo he tenido que conectar con mi empresa (via VPN) para mirar unos fallos en un programa, y me he visto en la tesitura de cualquiera que quiere acceder por escritorio remoto y nunca lo ha usado con cierta máquina: ¡A que no está activo!.

Ciertamente, no estaba activo. ¿Y como entro yo en mi máquina ahora?.

Partamos de unas premisas, de las que yo he partido para conseguirlo:

  • Estoy en una red con un Active Directory
  • Soy administrador de dominio
  • Al menos una maquina tiene acceso al escritorio remoto. Y claro, que tenga acceso a nuestro ordenador.
  • No hay un servidor Terminal Service funcionando (ya que seguramente no tendrías este problema).

Tras esto, nos conectamos al escritorio remoto a la máquina, y lanzamos “regedit” desde “inicio>ejecutar“, en el pulsamos:

Acceder a un registro remoto desde "Regedit"

Acceder a un registro remoto desde "Regedit"

Tras esto, buscamos la ruta:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server

y la clave “fDenyTSConnections” la cambiamos por “0“.

Ahora podemos tener otro problema, ya que podemos entrar por escritorio remoto, pero (y es un gran pero) cuando nos logeamos en nuestra máquina con nuestro usuario, nos dice “Las directivas locales de este sistema no le permiten iniciar una sesión interactiva“. Esto ocurre porque nuestro usuario no está dentro del grupo de “Usuarios de escritorio remoto“.

Bien, pues abrimos desde “Inicio>Herramientas Administrativas” la consola “Administración de equipos” y pulsamos aquí:

Acceso a una administración de equipos remota

Acceso a una administración de equipos remota

Ahora conectamos a la maquina, y entramos en “Usuarios locales y grupos” y luego en grupos. Buscamos el grupo “Usuarios de escritorio remoto“, y luego en “Propiedades>Agregar” metemos a nuestro usuario.

“Et voilà”…

Please follow and like us:

Como poner un label transparente sobre un picturebox en .NET

Programando, y programando me he encontrado con muchas cosas curiosas, entre ellas esta.

Imagina que quieres poner un texto encima de una imagen, lo normal sería, poner un picturebox, y luego poner encima un label pero si pones un label sobre un picturebox o cualquier otra imagen o control, pasan cosas como esta:

Fallo marcado en rojo

Fallo marcado en rojo

Como veis en la captura de arriba (programa que me he hecho en 5 minutos), esto es un problema como la copa de un pino, ya que se ve gris. Bueno no realmente, se ve del color del Form en el cual están alojados el picturebox y el label. Y este el problema, el “parent” del label es el Form, por lo que al hacer la transparencia, que la esta haciendo, la hace con su padre y no con la imagen que tiene encima, de ahí el color gris.

¿Como lograr entonces la transparencia?, pues hay dos métodos, uno sencillo que es cambiar el “parent” del label y poner el picturebox, por lo que la transparencia la tratará de hacer con el picturebox, y otra, escribir el texto en el evento “Paint” del control picturebox que es más complejo pero infinitamente mas potente.

Os adjunto el código para que nos entendamos, con comentarios:

private void Form1_Load(object sender, EventArgs e)
        {
            // Metodo 1º
            // ---------
            // Sencillo y barato... al menos es el que uso para cosas rápidas

            // Inicialización chorra
            this.label1.Text = "Esta no funciona...";
            this.label2.Text = "Esta si funciona...";

            // No funciona
            // ¿PERO QUE COÑO?
            this.label1.BackColor = Color.Transparent;

            // Funciona
            // Me cago en tó... ¿pero porqué?
            this.label2.Parent = this.pictureBox1;
            this.label2.BackColor = Color.Transparent;

        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            // Metodo 2º
            // ---------
            // Bastante mas complicado pero con muchas mas posibilidades
            Font fuente = new Font("Verdana", 8);
            SolidBrush brocha = new SolidBrush(Color.Black);

            e.Graphics.DrawString("Este si funciona, pero es mas complejo", fuente, brocha, 30, 110);

        }

Si queréis echar un ojo al programa os lo adjunto también: transparenciasLabel.

Please follow and like us:

Como resetear un campo “autoincrement” en SQLite

Muchas veces, tras trabajar en una base de datos y hacer pruebas, queremos borrar toda huella de que hemos “metido mano”, y uno de los problemas que me he encontrado, ha sido que cuando tienes una tabla con una clave autoincrementada, aunque borres toda la tabla entera, esta al insertar una nueva fila continua con la secuencia en la clave autoincremental.

Es decir, si meto 3 registros en una tabla con un campo autoincremental, obtienen el valor 0, 1 y 2, respectivamente. Si borro estas tres y meto una cuarta tras el borrado, recibe el valor 3 (en vez de 0).

En casi todas las bases de datos hay truquillos, y este es para SQLite, ejecutando esta SQL:

D3LETE FROM sqlite_sequence WHERE name='NombreDeTablaAResetear';

Ojo, quita el “3” de la sentencia, ya que mi server no me deja meter SQL en el texto de mis post…

Please follow and like us:

Al fin, como lograr que un cliente linux, actualice el DNS de un Windows 2003 server mediante el DHCP

Disclaimer: Desgraciadamente esto solo esta probado en un entorno con clientes Ubuntu, y servidores Windows 2003 Server. Si no es exactamente esta configuración de equipos, no te aseguro que funcione.

¡Por fin!… Un método que funciona, para que tu cliente Linux, metido dentro de una red con un Active Directory, pueda actualizar el DNS cuando recibe una ip a través de la DHCP del servidor.
El escenario en el cual esta solución es aplicable, es cuando tu ordenador Linux, recibe una ip del servidor DHCP de Windows, pero el resto de los equipos no pueden resolver el nombre de la máquina, solo mediante ip pueden contactar con la máquina. Y tras revisar el fichero “/etc/dhcp3/dhcp.conf” es correcto (en teoria no tendrías que tocar nada de fichero por defecto).

Bien… ¡deja de mirar a tu máquina Linux como la culpable!. La culpa esta en el servidor Windows. Tras mucho revisar a nuestro amigo Google, y culpar a mi pobre Linux, al final he visto que solo hay que tocar el servidor Windows en su servicio de DHCP para que todo vaya fino.

Por partes, solo hay que seguir este manual, aunque yo la voy a traducir y anotar:

  • ad_usuarioLo primero de todo es generar un usuario con los suficiente permisos para incluir registros/punteros en el DNS. Ir a “Usuarios y equipos de Active Directory”, allí crear un nuevo usuario, pon por ejemplo un nombre muy descriptivo (“dhcpTOdns”, o “dhcpAdns” o “noBorrarEstePutoUsuario”) pon un password que sea sencillo de recordar ya que no lo usaras muy a menudo :).
    Tras generarlo, tienes que incluirlo en el grupo “DnsUpdateProxy”, el cual es el que nos concede el permiso para actualizar el DNS. Quitale cualquier otro permiso (quitale del grupo de “usuarios de dominio”).
  • dhcp_configAhora pasamos a la madre del cordero. Configurar el servicio de DHCPdel Windows 2003, para que use este nuevo usuario que hemos incluido. Entramos en la consola de administración del DHCP y pulsamos sobre el arbol de la izquierda sobre el servidor, luego “Propiedades”, allí ve a la pestaña “DNS”, y dejala tal y como pone en la imagen que te aparece en la derecha. Tras esto, solo queda ir a la pestaña de “Opciones Avanzadas” para allí pulsar sobre el botón de “Credenciales”. Pon el usuario/dominio/password del usuario que hemos creado anteriormente.

Ahora en la máquinas Linux, haz un “sudo dhcpclient3 -d ethx” (donde ethx es tu tarjeta de red conectada al dominio) y todo el mundo podrá acceder por tu hostname a la maquina Linux. Huyuuuu….

Please follow and like us:

Como migrar una máquina Linux de dominio

¿Os habeis visto en este problema?. ¿No?, espero que nunca lo tengais que hacer, pero si os toca hacerlo, y migrar vuestra máquina Linux a otro dominio (una vez que lo tengais hecho… claro, si no esta dentro del dominio, pues como si oye llover xD), es tocar lo siguiente (ojo con las mayúsculas que no se ponen porque si):

  • Tocar el “/etc/krb5.conf” (solo marcaré los cambios):
    default_realm = TU.NUEVO.DOMINIO.COM
    [realms]
    TU.NUEVO.DOMINIO.COM = {
      kdc = dcserver.tu.nuevo.dominio.com
      admin_server = dcserver.tu.nuevo.dominio.com
      default_domain = TU.NUEVO.DOMINIO.COM
    }

    En este fichero puede que no tubieras el campo “kdc” ni “admin_server”, aunque es recomendable por temas de velocidad.

  • Cambia el fichero “/etc/samba/smb.conf”:
       workgroup = TU # o TU.NUEVO o como lo tengas montado
       netbios name = NOMBRE_MAQUINA
       realm = TU.NUEVO.DOMINIO
       password server = dcserver.tu.nuevo.dominio.com

Con esto ya estaría. Pero dos grandes apuntes, de la experiencia:

  • Mete al servidor de dominio en el “/etc/resolv.conf”, primero en la forma FQDN, y luego solo el nombre. Te ahorraras, algunos momentos de espera, que no hacen falta.
  • En “/etc/hosts”, mete la siguiente línea:
    127.0.0.1 localhost maquina.tu.nuevo.dominio.com maquina

    Esto, te puede quitar un error, del tipo:  “Failed to set servicePrincipalNames”, al unirte de nuevo al nuevo dominio.

Tras todo esto… la linea mágica:

sudo net ads join -U Administrador

Ya estará en el nuevo dominio. O al menos tendría que estarlo… 😛

Please follow and like us:

Haskell y la belleza perdida

Revisando mis suscripciones a otros blogs, me he encontrado con un trozo de código de un un viejuno informático, y sencillamente me he emocionado (si, los frikis informáticos es lo que tenemos), tras leer esto:

quicksort [] = []
quicksort (s:xs) = quicksort [x|x <- xs,x < s] ++ [s] 
                ++ quicksort [x|x <- xs,x >= s]

En esta época donde todo es .NET, Java, PHP, y OO a saco, donde todo ya esta programado en mastodónticas APIs, se agradece ver código funcional (100% Pure Haskell), puro y puro. Algo tan complicado de entender (o tan sencillo de entenderlo) que es una obra de arte.

¿Y que leches son estas dos lineas de código?, simplemente la ordenación mas rápida, resumida y escrita brillantemente. Toda un QuickSort en dos líneas.

PD: Si, hoy tenia ganas de escribir una frikada y sencillamente, me ha dado esto en la cara y no podía resistirme a escribirlo. Gracias al Cedazo.

Please follow and like us:

Moviendome a WordPress y los clásicos problemas…

Bueno, voy a estrenar mi nuevo blog. Al menos mi nuevo hosting.

Al mirar como moverme de mi antiguo blog en Blogger, a este nuevo en WordPress, me informe bastante del tema, ya que quería hacer la transición mas sencilla posible… No tengo mucho tiempo, así que liarme a cambiar a un hosting y tirarme 2 días para hacerlo no era una opción válida.

Tras ver, que WordPress trae un magnífico importador de Blogger a WordPress, me quede mas tranquilo. Al menos no tendría que hacer algún invento para traerme todos los post antiguos a mi nuevo hosting, aunque “haberlos haylos“.

Aunque como no, me encontré con bastantes problemas, aunque ninguno sin solución:

  • Me busqué un tema mas o menos bonito (Angel traducido al castellano por BlogsBazar, sigo probando, pero hay algunos muy interesantes en Blogohblog), pero me aparecieron las famosas interrogaciones en vez de las palabras acentuadas. La solución mas sencilla fué usar el “Notepad++” o cualquier editro de texto y transformar el juego de caracteres (ojo, transformar no guardar) a UTF-8, ya que venian en ANSI. Salvo el fichero “functions.php” de dicho tema, ya que si no aparecian los malditos errores de “Headers already sents“.
  • Traducir el WordPress. Sencillamente copiar el directorio “/lenguages” de la versión en Castellano. Luego cambiar en el fichero “wp-config.php” cambiar la linea del lenguaje por esta:

    define (’WPLANG’, ‘es_ES’)

    Si te salen las malditas interrogaciones, mira si los ficheros de tu tema estan en utf-8.

  • El importador de Blogger a WordPress mete todos los tags de tus post como categorias. Un problema que iré resolviendo poco a poco.

En cuanto a la web, como podeis observar tiene menos de 1 hora de trabajo echada… lo cual significa que no esta especialmente bien montada, pero por ahora así se va ha quedar, hasta que saque tiempo para ponerla a mi gusto completamente.

Please follow and like us: