sábado, diciembre 05, 2009

Macro muy cutre y para los muy pobres

Hace tiempo que no publico nada, pero no he conseguido hacer algo de útil para humanidad que vea bueno para compartir. Ayer tuve un momento de inspiración, quería probar hacer fotos macros pero tengo un equipo muy sencillos, el kit de A350 con el objetivo 17-70mm 5.6, con la limitaciones de mi equipo y esta crisis que me ahoga tuve una gran idea, me pregunté ¿cómo podría ampliar mi objetivo para hacerlo macro? mi respuesta fue inminente una lupa. Con la lupa que me regaló mi abuelo cuando era pequeño me puse a jugar con la cámara.


La puse delante del objetivo, y este a subé en modo MF, y una apertura de 11.




He conseguido hacer unas muy buenas fotos.



Eso si recomiendo el uso de un soporte rígido o un trípode para hacer las fotos si no os costará la propia vida mantener el pulso para hacer la foto mientras sujeta con una mano la lupa y la otra la cámara

*Artículo posteado en sonystas

lunes, marzo 02, 2009

Hacer un script para un Backup en un equipo remoto

Esta práctica me la han pedido ya varías personas y pensaba que estaba colgada aquí y me he dado cuenta de que no, así que la voy a colgar por si alguien la necesita.. Consiste en realizar el backup de unos directorios concretos y mandarlo a un equipo remoto:

##Script de David Delgado santos
#!/bin/bash
##Antes de empezar a realizar toda las operaciones, tenemos que ubicarnos en el directorio donse se va a realizar las operaciones
cd /media/hda4/backup
##luego empezamos a declarar las variables necesarias, la primera varible declarada aquí es una variable que coja la fecha y le de un formato bonito
fecha=$(date +%d-%B-%Y)
##esta variable lo que hace es ponerle nombre al fichero, con el nombre de la máquina y la fecha de cuando se ha creado
nombre=`hostname`_$fecha.tar.bz2
##esta variable calcula el tamaño que pesa el directorio etc en kb
etc=`du -s /etc/ | awk '{print $1}'`
##esta variable calcula el tamaño que pesa el directorio home en kb
home=`du -s /home/ | awk '{print $1}'`
##esta variable calcula el tamaño que pesa el directorio var/lib en kb
varlib=`du -s /var/lib/ | awk '{print $1}'`
##esta variable calcula el tamaño que pesa el directorio var/log en kb
varlog=`du -s /var/log/ | awk '{print $1}'`
##calcula el espacio libre donde se va almacenar la copia de seguridad
espacio_libre=`df |grep hda4| awk '{print $4}'`
##realiza la operación para ver si hay espacio
realizarcopia=`expr $etc + $home + $varlib + $varlog - $espacio_libre`
##si el espacio libre es mayor que 0 se realizará la copia
if [ $realizarcopia -lt 0 ]; then
##comprime los directorios, que hemos decididos que deben hacer una copia de seguridad, con el nombre que hemos creado
tar cjf $nombre /etc /var/lib /var/log /home
##cuando se acaba de hacer la copia mostrará un mensaje diciendo que se ha realizado la comprimición.
echo "Se ha hecho con exito la copia de seguridad"
##ahora mira el espacio disponible en talut, la máquina donde se va almacenar la copia de respaldo
espaciotalut=$(ssh copia@192.168.1.51 df |grep sda3| awk '{print $4}')
##mira el tamaño que ha ocupado la copia local
tamano=`du $nombre | awk '{print $1}'`
##compara el tamaño del backup con el espacio disponible, si hay espacios disponible realizará la transferencia
if [ $tamano -lt $espaciotalut ]; then
##antes de mandar el backup, le mira el valor md5sum para comprobar que se haya pasado correctamente
valor=$(md5sum $nombre | awk '{print $1}')
##manda el backup a la otra máquina con el nombre
scp $nombre copia@192.168.1.51:$nombre
##cuando se haya echo muestra un mensaje diciendo que se ha realizado la copia
echo "Se ha pasado la copia de seguridad a talut"
##ahora mira el valor md5sum del backup de la máquina de talut 
valorexterior=$(ssh copia@192.168.1.51 md5sum $nombre | awk '{print $1}')
##si es el mismo del que hay en la máquina local mostrará un mensaje diciendo que se ha realizado la copia correctamente y se acaba el proceso del backup
if [ $valor = $valorexterior ]; then
echo "Se ha pasado la copia de seguridad correctamente"
else
##si no es el mismo mostrará un mensaje y se volverá a enviar
echo "No se ha podido pasar la copia de seguridad correctamente, se intentará de nuevo"
##creamos una varible contador que cuente las veces que se intenta mandar, por si en realidad hay problemas en la red y no se quede en un bucle infinito transferiendo el archivo
contador=0
##realizará el envio hasta que contador sea 3 que tres o los valores de md5sun sea iguales en la dos máquinas
while [  $probar != $valorexterior -o $contador -lt 3 ]; do
##mira el valor en la otra máquina
##realiza otra ves el envio del backup
scp $nombre copia@192.168.1.51:$nombre
##mira en valor en la máquina de talut de nuevo
valorexterior=$(ssh copia@192.168.1.51 md5sum $nombre | awk '{print $1}')
##incrementa el contador
   contador=`expr $contador + 1`
   done
##si el contador es igual a 3 mostrará un mensjae de que tiene problemas en la red
if [ $contador -eq 3 ]; then
echo "No se ha podido hacer la copia correctamente, pongase en contacto con el administrador de la red"
fi
fi
else
##si no hay espacio en talut cuando se realiza la comprobación de espacio en la máquina mostrará un mensaje
echo "No hay suficiente espacio en Talut"
fi
else
##si no hay espacio en la máquina local mostrará un mensaje diciendo que no hay espacio
echo "No hay suficiente espacio para hacer la copia de seguridad"
fi



##ahora para automatizar la tarea, introduciremos en el crontab una línea para que ejecute el script 1 vez al día a la 12 de la mañana. Para realizar esta operación que hacerla como superusuario ejecutamos el comando "crontab -e" y añadimos la línea "00 12 * * * sh /root/backup.sh" donde 00 es el minuto, 12 es la hora a la que se va a ejecutar y * * * es el día, mes y año en el que se va a ejecutar, lo dejamos con * para que se ejecute todos los días a la misma hora.

lunes, febrero 23, 2009

Modificar un informe en Abanq 2.3

Hace tiempo que no escribo, es por flojo, no por otra cosa pero bueno. Ahora ando currando en una empresa donde se adquirió Abanq y he tenido que realizar unas modificaciones para un cliente. Las modificaciones eran que en los informes aparecían las descripciones de los artículos, y el cliente quería que si fuera un envase lo que había en el informe apareciera la descripción del envase en vez de la descripción del artículo. Y como encontré muy poca información para realizar esto os voy a dejár el ejemplo de las modificaciones que realicé para el informe de "Albaranes clientes":
En el archivo flfactinfo.qs declaré arriba la funcion que iba a crear:

function desEnvase(nodo:FLDomNode, campo:String):String {
return this.ctx.oficial_desEnvase(nodo, campo);
}

y luego la definí:

function oficial_desEnvase(nodo:FLDomNode, campo:String):String
{

var codEnvase:String = nodo.attributeValue("lineasalbaranescli.codenvase");
var valor:String;
if (codEnvase && codEnvase != "") {
valor = nodo.attributeValue("envases.descripcion");
} else {
valor = nodo.attributeValue("lineasalbaranescli.descripcion");
}
return valor;
}

En el archivo i_albaranescli.qry añadí los siguientes elementos:

empresa,albaranescli,envases

En el  select añadí los siguientes campos:

 lineasalbaranescli.codenvase, envases.codenvase, envases.descripcion,

Y ya en el from pegaré la línea entera para que vea más claro:

empresa,albaranescli INNER JOIN lineasalbaranescli ON albaranescli.idalbaran = lineasalbaranescli.idalbaran  LEFT OUTER JOIN envases ON envases.codenvase = lineasalbaranescli.codenvase  LEFT OUTER JOIN movilote ON movilote.idlineaac = lineasalbaranescli.idlinea LEFT OUTER JOIN lotes ON movilote.codlote = lotes.codlote

Por última hay que modificar el archivo i_albaranescli.kut para modificar el Field de la descripción del artículo que se encuentra en "Cabeceras de listas de artículos" por la siguiente línea:
< calculationtype="6" functionname="flfactinfo.desEnvase" backgroundcolor="'255,255,255'" bordercolor="'0,0,0'" borderstyle="'0'" borderwidth="'1'" commaseparator="'44'" currency="'32'" datatype="'0'" dateformat="'11'" field="'lineasalbaranescli.descripcion'" fontfamily="'Arial" fontitalic="'0'" fontsize="'9'" fontweight="'50'" foregroundcolor="'0,0,0'" halignment="'0'" height="'20'" negvaluecolor="'0,0,0'" precision="'2'" text="'[lineasalbaranescli.descripcion]'" valignment="'1'" width="'287'" wordwrap="'0'" x="'94'" y="'1'"> < / CalculatedField>


miércoles, febrero 20, 2008

Examen: Instalar y configurar un servidor Bind9

Se me ha ocurrido publicar mi examen de "IAI", puede que sirva a alguien de ayuda. No sé que nota tendrá este ejercicio en el examen, pero el resultado final es de 7,4 así que no debe esta mal:

Instala y configura bind9 en el dom0 como servidor DNS de la red virtual de trabajo 10.0.1.0/24 cuyo nombre de zona ser´a examen.gonzalonazareno.org, incluyendo un entrado de tipo MX con el FQHN del dom0. Configura tanto el dom0 como wilson para que lo utilicen como servidor DNS
primario.


Después de instalar el bind9 (#aptitude install bind9) hay que editar el archivo
/etc/bind9/named.conf.local y añadirle las siguientes líneas
zone "1.0.10.in-addr.arpa" IN {
type master;
file "/etc/bind/db.10.0.1";
};
zone "examen.gonzalonazareno.org" IN {
type master;
file "/etc/bind/db.examen";
};
y luego creamos los archivos “db.10.0.1” y “db.examen” en el directorio
/etc/bind9”, y escribimos en cada archivo:

db.10.0.1:

$ORIGIN 1.0.10.in-addr.arpa.
$TTL 1D
@ IN SOA rydag.examen.gonzalonazareno.org.
hostmaster.examen.gonzalonazareno.org. (
12 ; serial
28800 ; refresh (8 hours)
14400 ; retry (4 hours)
2419200 ; expire (4 weeks)
86400 ; minimum (1 day)
)
NS rydag.examen.gonzalonazareno.org.
131 PTR rydag.examen.gonzalonazareno.org.
4 PTR wilson.examen.gonzalonazareno.org.

db.examen:

$ORIGIN examen.gonzalonazareno.org.
$TTL 1D
@ IN SOA rydag. hostmaster. (
1 ; serial
8H ; refresh
4H ; retry
4W ; expire
1D ) ; minimum
; name server (NS) and mail exchange (MX)
IN NS rydag
IN MX rydag
localhost IN A 127.0.0.1
rydag IN A 10.0.1.131
wilson IN A 10.0.1.4

Luego recargamos el demonio de bind9 “/etc/init.d/bind9 reload” y añadimos a la
máquina física y virtual, en el archivo “/etc/resolv.conf”, la línea “nameserver
10.0.1.131

*dom0 es la máquina física
*wilson es una máquina virtual
*gonzalonazareno.org es el nombre de dominio de mi instituto
*rydag es el nombre de la máquina física

jueves, febrero 14, 2008

Gonsiwiki: Redireccionar un directorio a otra partición

Mi instituto ha tenido la gran idea de montar una wiki para que los alumnos de los ciclos podamos colgar nuestros, trabajos, proyectos y apuntes. Y puesto que voy a pasar algunos a punte a esa wiki me parece bien que publique aquí algún que otro artículo de curiosidad. Aquí tenéis el primero

Esto sirve para redireccionar un directorio a otra partición para mejor gestión de equipo. Por ejemplo direccionar el directorio /home a otra partición por si se formatea la partición donde esta montado el sistema operativo no se pierda el contendido del directorio /home. Tenemos que todas las operaciones como superusuario del sistema y luego montaremos la partición que deseamos redireccionar el directorio en un directorio

#mount /dev/(partición) /(directorio donde lo montaremos)

Ejemplo:

#mount /dev/sda6 /mnt

Después copiamos el contenido del directorio al directorio montado

#cp -a /(directorio que deseamos redireccionar)/* /(directorio montado)

Ejemplo:

#cp -a /home/* /mnt

Borramos el contendido del directorio para no tener datos duplicados

#rm -fr /(directorio origen)/*

Ejemplo:

#rm -fr /home/*

Luego desmontamos la partición montada

#umount /(directorio donde esta montada)

Ejemplo:

#umount /mnt

Y por último editamos el archivo /etc/fstab añadiendo la línea para la partición que hemos creado

/dev/(partición) /(punto de montaje) (sistema de partición) defaults 1 1

Ejemplo:

/dev/sda6 /home ext3 defaults 1 1

martes, febrero 12, 2008

Wikiproyecto: Libro de los nombres


Llevo varios días intentando poner en pie un wikiproyecto y lo he llamado Libro de los nombres, es muy simple y muy básico, se trata de los nombres, significado, procedencia, onomástica, curiosidades.., de momento he creado varios artículos de prototipo y me queda mucho para refinarlo antes de presentarlo a la cúpula de la wikipedia. Si alguien se anima a participá o aportar una idea nueva que se ponga en contacto conmigo dejando algún comentario aquí o en la wikipedia.

viernes, febrero 08, 2008

Receta para compilar un kernel

Es la paso a paso de como se debe compilar un kernel definida por mi profesor Alberto Molina:

  1. Obtener el núcleo. La opción sencilla es (puede obtenerse también de www.kernel.org):
    • aptitude install linux-source-2.6.18
    • El resultado es el fichero /usr/src/linux-source-2.6.18.tar.bz2
  2. Crear un directorio para la compilación y descomprimir en él el núcleo:
    • mkdir ~/linux
    • cd ~/linux
    • tar xjf /usr/src/linux-source-2.6.18.tar.bz2
  3. Utilizar el fichero de configuración del núcleo actual como punto de partida. Para ello:
    • cp /boot/config-`uname -r` ~/linux/linux-2.6.18/.config
  4. Configurar el núcleo
    • Etiquetar el nuevo núcleo poniendo un número significativo en la constante EXTRAVERSION que aparece en el fichero Makefile (por ejemplo -10)
    • Configurar el núcleo con una de las siguientes opciones:
      • make menuconfig (necesita las bibliotecas de desarrollo de ncurses)
      • make gconfig (necesita las bibliotecas de desarrollo de gtk)
      • make xconfig (necesita las bibliotecas de desarrollo de qt)
  5. Compilar la parte monolítica, los módulos y generar un paquete debian con todo:
    • make deb-pkg
    • El paquete así generado se almacena en ~/linux
  6. Instalar el nuevo núcleo en el sistema
    • dpkg -i linux-2.6.18-10_2.6.18-10_i686.deb
    • Generar la initrd: mkinitramfs -o /boot/initrd.img-2.6.18-10 2.6.18-10
    • Actualizar GRUB: update-grub
  7. Reiniciar y probar.
  8. En caso de que tengamos o queramos volver a compilar, tendríamos que seguir uno de estos dos caminos:
    • make clean y continuar por el punto 4 (manteniendo el fichero .config previo)
    • make mrproper y continuar por el punto 3 (para empezar de cero).