Primer lenguaje de programación

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.

Continue reading

6 Reglas para programar correctamente en java

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.

Continue reading

Redireccionar puertos

Buenas gente, acá les dejo un mini script para redireccionar puertos a otra ip. Para que funcione primero tiene que hacer:
sysctl net.ipv4.ip_forward=1
Acá va el script:

#!/bin/bash
[ $# -eq 0 ] && { echo "Usage: $0 puertoPrincipal puertoSecundario IP"; exit 1; }
iptables -t nat -A PREROUTING -p tcp --dport $1 -j DNAT --to-destination $3:$1
iptables -A FORWARD -p tcp -d $3 --dport $1 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -p udp --dport $1 -j DNAT --to-destination $3:$1
iptables -A FORWARD -p udp -d $3 --dport $1 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -p udp --dport $2 -j DNAT --to-destination $3:$2
iptables -A FORWARD -p udp -d $3 --dport $2 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
exit 0

Resetear el password de chamilo

Me extrañó lo poco documentado que está esto, y lo sencillo que es. Pero bueno este post les evitará browsear en el código. Hay 3 posibilidades:

Texto plano)
update user set password = ‘051195’ where user_id =1;
MD5)
update user set password = md5(‘051195’) where user_id =1;
Sha1) Obvio que está era la mía
update user set password = sha1(‘051195’) where user_id =1;

Muy sencillo. Saludos a todos.

Google storage

Hola a todos, nos estabamos quedando sin espacio de disco para una empresa editorial para la que trabajo, y buscando algún servicio de almacenamiento di con GoogleStorage, realmente es muy barato y nos deja almacenar todo lo que querramos. Una vez que instalamos la aplicación sólo tenemos que crear la nueva carpeta:

gsutil mb gs://nuevacarpeta

y subir los archivos:

gsutil cp -R -n -c * gs://nuevacarpeta/

A mi me sirvió para dejar nuestros discos a un 90% de su capacidad retirando proyectos que ya no necesitaremos. Espero les sirva a ustedes, yo lo recomiendo.

Saludos

Balance de carga entre servicios

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

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.

Continue reading