Archive for the ‘Programación’ Category

Comparar dos directorios

Wednesday, April 3rd, 2019

Acá les dejo un script que hice en bash para comprar dos directorios, nada del otro mundo pero muy útil. Usa md5sum, no sé, espero les sirva.

#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
dir1=$1
dir2=$2
cd $dir1
find ./  -type f -exec md5sum {} \; > /mnt/virtual5/dir1
cd $dir2
find ./  -type f -exec md5sum {} \; > /mnt/virtual5/dir2
echo "archivos que estan en $dir1 y no en $dir2"
for i in $(cat /mnt/virtual5/dir1 | awk '{print $1}'); do  
    if ! grep -lq $i /mnt/virtual5/dir2; then 
        archivo=$(cat /mnt/virtual5/dir1 | grep $i |cut -c36-);
	archpath="$dir1/$archivo"
	stat -c "%y %n" $"$archpath";
    fi; 
done;

echo "archivos que estan en $dir2 y no en $dir1"
for i in $(cat /mnt/virtual5/dir2 | awk '{print $1}'); do  
    if ! grep -lq $i /mnt/virtual5/dir1; then 
        archivo=$(cat /mnt/virtual5/dir2 | grep $i |cut -c36-);
	archpath="$dir2/$archivo"
	stat -c "%y %n" $"$archpath";
    fi; 
done;

IFS=$SAVEIFS

Primer lenguaje de programación

Tuesday, November 18th, 2014

Hace poco tuve un intercambio de ideas con estudiantes de sistemas sobre qué lenguaje de programación era el mejor para empezar a programar. Ellos defendían fuertemente python, mientras que yo por el contrario, defendía pascal. Y pensé en hacerles un post pequeño para explicarles a todos el porqué. En pascal cuesta mucho programar mal por su fuerte estructura, y listo. Sólo eso. Los que piensen en que perderán tiempo usando pascal, están equivocados. En el transcurso de sus vidas, quienes se dedican a sistemas, deben saber al menos 10 lenguajes de programación al mismo tiempo. Yo en este mismo momento programo en, C, C++, Php, bash, perl, java, vb6, R. y seguro que alguno más. Y seguramente, dentro de 10 años habrá otros lenguajes. Así que a fin de cuentas, todos los lengaujes de programación son expiables en el tiempo.

(more…)

6 Reglas para programar correctamente en java

Thursday, November 13th, 2014

Bueno, últimamente me tocó trabajar con código tan, pero tan mal, que decidí hacer un post sobre como codificar bien (es válido para otros lenguajes OO) con la esperanza que me pase menos. Hace poco me encontré en una esquina con mi amigo de la facultad Ariel Palma, sólo para sacar el cuero a la gente que en lugar de hacer una clase bien utiliza parche sobre parche. A toda esta gente les digo “Lo barato, cuesta caro”. El tiempo que te tomará escribir bien el código es ínfimo comparado al que te tomará hacer un debug un par de meses después. No me da el tiempo de hablar de conceptos como acoplamiento y cohesión, para quien sabe lo que es no hace falta que lea esto. Es simplemente para que programadores con poco nivel entiendan como programar decentemente.

(more…)

Cambiar SRT a xml con inicio y duración

Friday, August 22nd, 2014

Bueno, se me presentaron dos problemas:
1) pasar subtítulos SRT a xml y
2) pasar el inicio – fin de los subs por inicio y duración

Funciona así, uno pone el SRT en el index.html y devuelve un xml. Hubo un problema en windows por lo cual cambie el encoding.

(more…)

Balance de carga entre servicios

Thursday, February 21st, 2013

Hola gente, yo de nuevo por aquí. Hace muy poco tiempo me ha tocado trabaar para una empresa que tenía serios atrasos en un gateway GPS desarrollado en java. Al principio pensamos que era postgres, después el disco, la red, etc. Pero bueno al final el problema era el mismo GW que después de un número N de conexiones se paraba. Solución!, le saqué el polvo a un script que había hecho para balancear conexiones (algún día lo dejaré por aquí también) y lo modifiqué de la siguiente manera para que haga un round robin de conexiones. O sea, se crea una conexión nueva (-m state –state NEW) y se la manda a uno u otro (-m statistic –mode nth) haciendo coincidir el número de paquete (–packet 1), sobre la cantidad total de servicios (–every 3) cada vez que el límite se alcanza, el contador vuelve a cero. Pues bueno, acá les dejo el ejemplo para 3 servicios:

iptables -t nat -I PREROUTING -p tcp --dport 5507 -m state --state NEW -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 192.168.1.4:5507
iptables -t nat -I PREROUTING -p tcp --dport 5507 -m state --state NEW -m statistic --mode nth --every 3 --packet 1 -j DNAT --to-destination 192.168.1.5:5507
iptables -t nat -I PREROUTING -p tcp --dport 5507 -m state --state NEW -m statistic --mode nth --every 3 --packet 2 -j DNAT --to-destination 192.168.1.4:5512

Para los que usen shorewall, tienen que cambiar PREROUTING por net_dnat, les quedaría así:

iptables -t nat -I net_dnat -p tcp --dport 5507 -m state --state NEW -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 192.168.1.4:5507
iptables -t nat -I net_dnat -p tcp --dport 5507 -m state --state NEW -m statistic --mode nth --every 3 --packet 1 -j DNAT --to-destination 192.168.1.5:5507
iptables -t nat -I net_dnat -p tcp --dport 5507 -m state --state NEW -m statistic --mode nth --every 3 --packet 2 -j DNAT --to-destination 192.168.1.4:5512
Y bueno, eso es todo amigos. Espero que los saque del paso.
Saludos.

Mail alerts con pushOver

Wednesday, January 16th, 2013

Bueno una empresa me pidió que le haga un sistema para recibir notificaciones si el servidor de correo cae. Lo que se le puede ocurrir a todo el mundo es usar un telnet y monitorear el servicio, pero cosa de descartar problema de DNS, espacio en disco y demás cosas hice un daemon un poco más complejo.
La idea es:
+ Enviar un correo y revisar si lo recibimos desde otro servidor al nuestro.
+ Luego al revés, o sea, enviar un correo desde nuestro servidor al servidor de control a ver si llega.
Si en ambos casos llegar, todo perfecto, si no envía notificaciones push a una lista de iphones. Más sencillo imposible, y más útil tampoco :P.

(more…)

Aplicación SWT parece colgada

Friday, October 21st, 2011

Gente, no se si se acuerdan que esto pasaba también con las aplicaciones programadas en Visual Basic 6, para el cual teníamos el mágigo DoEvents, que lo que hacía no era más que decirle al sistema operativo que se acuerde que hay que refrescar el display. Bueno después de buscar miles, leer sobre threads y demás encontré una solución tan sencilla como el DoEvents.

Simplemente agreguen al bucle (for while, lo que sea):

display.readAndDispatch();

Donde display es el display que creo la shell compisite o lo que fuese. Esto se complica cuando no es un bucle el que está consumiendo mucho si no una sola instrucción, para eso les recomiendo que lean esto:

http://book.javanb.com/swt-the-standard-widget-toolkit/ch05lev1sec7.html

Saludos y espero que les sirva.

MN

Postgres función para separar en meses en columnas

Wednesday, August 10th, 2011

Bueno, necesitaba hacer un reporte para el SENASA en el que en cada columna haya un mes. Onda enero, febrero, etc. Entonces hice una pequeña función que me ayudará a hacerlo, es muestro como.

(more…)

Quitar espacios del nombre de los archivos

Wednesday, August 10th, 2011

Bueno gente, esto no tiene mucho más de lo que dice el título. Es más lo dejo acá para no olvidarmelo nomás.

ls | while read -r FILE; do mv -v “$FILE” `echo $FILE | tr ‘ ‘ ‘_’ `; done;

Lo saqué de acá: https://bbs.archlinux.org/viewtopic.php?id=36305

Muy piola.

MN

Correr automáticamente geoserver (at boot time)

Thursday, April 14th, 2011

Holass samigos, acá les dejo el script que uso para iniciar geoserver, lo ponen el /etc/init.d y luego corren el comando:

update-rc.d geoserver defaults

Espero les sirva.

#! /bin/sh
### BEGIN INIT INFO
# Provides:          geoserver
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: GeoServer OGC server
### END INIT INFO

# Author: Lennart Juette

# Geoserver configuration - use /etc/default/geoserver to override these vars
# user that shall run GeoServer
USER=root
GEOSERVER_HOME=/opt/geoserver-2.0.3
GEOSERVER_DATA_DIR=$GEOSERVER_HOME/data_dir

PATH=/usr/sbin:/usr/bin:/sbin:/bin
DESC="GeoServer daemon"
NAME=geoserver
JAVA_HOME=/usr/lib/jvm/java-6-openjdk/jre
JAVA_OPTS="-Xms128m -Xmx512m"
DAEMON="$JAVA_HOME/bin/java"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

DAEMON_ARGS="$JAVA_OPTS $DEBUG_OPTS -DGEOSERVER_DATA_DIR=$GEOSERVER_DATA_DIR -Djava.awt.headless=true -jar start.jar"

# Load the VERBOSE setting and other rcS variables
[ -f /etc/default/rcS ] && . /etc/default/rcS

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

do_start(){
	
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started
	
	start-stop-daemon --start --pidfile $PIDFILE --make-pidfile \
		--chuid $USER --chdir $GEOSERVER_HOME \
		-b --test --exec $DAEMON -- $DAEMON_ARGS > /dev/null \
		|| return 1
		
	start-stop-daemon --start --pidfile $PIDFILE --make-pidfile \
		--chuid $USER --chdir $GEOSERVER_HOME \
		-b --exec $DAEMON -- $DAEMON_ARGS \
		|| return 2
}

do_stop(){
	
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred

	start-stop-daemon --stop --pidfile  $PIDFILE \
		--user $USER \
		--retry=TERM/30/KILL/5

	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	
	# Many daemons don't delete their pidfiles when they exit.
	rm -f $PIDFILE
	return "$RETVAL"

}

case "$1" in
  start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
	do_start
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  stop)
	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
	do_stop
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
  restart|force-reload)
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
	case "$?" in
	  0|1)
		do_start
		case "$?" in
			0) log_end_msg 0 ;;
			1) log_end_msg 1 ;; # Old process is still running
			*) log_end_msg 1 ;; # Failed to start
		esac
		;;
	  *)
	  	# Failed to stop
		log_end_msg 1
		;;
	esac
	;;
  *)
	#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
	echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
	exit 3
	;;
esac

: