jueves, 23 de febrero de 2012

controlar que un programa no se ejecute más de una vez

Cómo controlar que un programa Java se cargue más de una vez. Es decir, que si ya lo hemos lanzado, evitemos que se vuelva a lanzar.

Existen formas desde Java Web Start y el modo SingleInstanceService para evitar que un programa se cargue dos veces. Pero en nuestro caso vamos a realizarlo de una forma "manual" en Java, pero muy efectiva.

El truco es que el programa Java cree un objeto que esté escuchando a un puerto específico del ordenador. Para ello utilizamos un ServerSocket, objeto que nos permite crear un objeto escuchando a un determinado puerto.
private static ServerSocket SERVER_SOCKET;
SERVER_SOCKET = new ServerSocket(12345);
Escoge un puerto que no sea el estándar de los protocolos: 80 para el http, 21 para el ftp,...

Además vemos que el objeto ServerSocket que hemos instanciado es un objeto estático dentro de nuestro programa. Así, nuestro programa tendrá un listener sobre un puerto, al que nadie dirá nada, pero que lo dejará como reservado.

Lo que sucede es que si intentamos volver a crear un ServerSocket sobre ese puerto, saldrá una excepción indicando que el puerto ya está en uso. Esto nos permite controlar que ya hay una instancia de nuestro programa ejecutándose.
try {
       SERVER_SOCKET = new ServerSocket(12345);
       System.out.println("La primera instancia de la aplicación...");
       System.in.read();
} catch (IOException x) {
       System.out.println("La aplicación ya se está ejecutando...");
}

Muy simple y con esto podemos evitar que un programa Java se ejecute dos veces.

viernes, 17 de febrero de 2012

proteger nuestro servidor: iptables bloquear y desbloquear una IP

Proteger nuestro servidor de ataques es primordial. También es muy cómodo usar paquetes que te hacen todo el trabajo como fail2ban.

 Una opción para proteger el servidor en este caso de ataques DDOS es usar los script de InetBase estos nos dan la posiblidad de protequerlo en sencillos pasos. Se trata de un script que analiza el trafico comprobando posibles ataques. Instalarlo en nuestro servidor web es sencillo

wget http://www.inetbase.com/scripts/ddos/install.sh
chmod 0700 install.sh 
./install.sh 


Igualmente tienes el widget para desinstalar si ya no lo deseas:
wget http://www.inetbase.com/scripts/ddos/uninstall.ddos 
chmod 0700 uninstall.ddos 
./uninstall.ddos 


Una vez instalado DoS-Deflate, podemos editar la configuración que se ubica en /usr/local/ddos/ddos.conf:
* FREQ=1.- Cada cuantos minutos correr el script. Viene programado para correr cada minuto, lo que parece razonable, teniendo en cuenta que de un minuto a otro podrían saturarte mucho el servidor web.  
* NO_OF_CONNECTIONS=150.- Indica el límite de conexiones, 150 en este caso. Si una conexión IP hace más conexiones que este límite, se le bloqueará por el tiempo que se especifica en BAN_PERIOD.  
* APF_BAN=1 . Si es igual a uno (1) se usará APF, sino lo tienes instalado, cámbialo por cero (0) para usar iptables.  
* BAN_PERIOD=600. Cantidad de segundos en que la IP estará bloqueada. Son 10 en la configuración predeterminada, puedes cambiarlo por una hora (3600 segundos).

Teniendo funcionando el script, se nos enviará un mail con el detalle de la ip bloqueada.

Si deseas que alguna IP conocida realice muchas conexiones hacia tu servidor web, y la tienes bien identificada puedes indicarlo en /usr/local/ddos/ignore.ip.list para que no sea bloqueada.

Por mucho paquete que incluyamos en nuestro servidor par hacerlo más seguro. Es muy fácil que una máquina atacante se salte estas restricción, ya que puede que cada 1 minuto intente validarse con un usuario y contraseña. Si es una opción muy poco común, pero creerme que existe.

En estos casos la solución es muy rápida y fácil con iptables.
//Bloquear dirección IP
sudo iptables -A INPUT -s dirección_ip -j DROP
//En caso de  querer desbloquear usar
sudo iptables -D INPUT -s dirección_ip -j DROP

jueves, 16 de febrero de 2012

nmap y que no te engañen

Los cortafuegos (firewalls) al detectar un scaneo de puertos se defienden mandando ACK a todos los puertos de esta forma mostrará que tiene todos los puertos abiertos.
sudo nmap -sS 10.10.0.1


Nmap cuenta con el parámetro -T donde podemos indicar la velocidad con la que escaneará los puertos. Con la cifra más alta es más agresiva y con la más baja será difícil detectar el tráfico. Dependiendo de nuestro interés a la hora de escanear, podemos elegir entre los siguiente valores
paranoid (0)
sneaky (1)
polite (2)
normal (3) opción por defecto
aggressive (4)
insane (5)

Para evitar que el firewall nos engañe mostrándonos todos los puertos abiertos podemos probar con -T2
sudo nmap -sS 1.2.3.4 -T2

miércoles, 15 de febrero de 2012

Ubuntu por consola ver espacio libre

Una situación complicada en la de administración de un servidor vía consola es saber cuanto espacio libre queda en el servidor o cuales son los ficheros de mayor tamaño para identificar donde está el problema del espacio. Os dejo una lista de comandos que pueden ser útiles.

Conocer el tamaño total, el espacio usado y el espacio libre del sistema.
df -h

Lista los ficheros como "ls" pero nos muestra los tamaños de los archivos.
ls -sh

Listar todos los ficheros del disco duro cuyo tamaño sea mayor a 1Giga.
find / -size +1G


lunes, 6 de febrero de 2012

Navegador web en papel, para diseñar páginas

Buscando por internet me he topado con estas peculiares herramientas para diseñadores web muy interesantes.


Paper Browser son plantillas en papel listas para descargar e imprimir. Reproducen la ventana del navegador web con rejillas y guías para diseñar páginas web en distintos tamaños (800, 960, 1024 píxeles)

Se pueden descargar con distintas configuraciones o comprar en forma de cuadernos de espiral con esas mismas plantillas como páginas.

Ideales para diseñadores web que saben que siempre se debe comenzar a bocetar en papel, no en Photoshop.








App Sketchbooks El dibujo de las hojas varía dependiendo del cuadernillo que escojamos:



  • iPad App Sketchbook: el tamaño y las siluetas de cada página son las del iPad, punteadas en la parte central como guía para el dibujo de los elementos de la pantalla.
  • iPhone App Sketbook: lo mismo, pero la versión iPhone. Hojas con tres siluetas de tres pantallas y espacio para anotaciones.

  • UX Sketchbook: un cuaderno de diseño general de sitios y aplicaciones web. Cada hoja tiene siluetas de un navegador web, con un grid para ayudar al dibujo y espacio para comentarios.
  • Responsive Design Sketchbook:  Las siluetas están preparadas para pensar en las diferentes resoluciones y diseñar una interfaz adaptable a todas ellas.
El precio es el mismo para todos ellos: 12,95$.






El Web Design Sketchbook  es un libro de bocetos pensado para diseñadores web. Sus páginas tienen impresas rejillas para dibujar, además de prototipos de ventanas de navegadores web en diferentes tamaños y espacios libres para tomar notas.

El equipo que ha editado este libro también ha publicado un PDF con varias plantillas para descargar libremente desde la web.

Su precio es el más caro de todas las opciones que comentamos en este artículo: 30$.










UI Stencils  es una tienda online para diseñadores web y de aplicaciones para móviles. Se hicieron populares cuando mostraron al mundo su nueva idea: una regla de dibujo como las de toda la vida, pero con patrones de diseño de inferfaces de usuario en vez de formas geométricas. Es una regla que te ayuda a tomar medidas y a dibujar botones, iconos, formularios, etc.
En la tienda puedes encontrar unos librillos de hojas con cuadrículas de ayuda para el dibujo y con algunas siluetas ya impresas: navegadores web, contornos de iPhone/iPad… e incluso puedes comprarlos como hojas normales o con adhesivo, para poder quitar las hojas y pegarlas donde quieras.

Es un rollete artesano y simple, aunque para no tener tapas ni anillas creo que es un poquitín caro, comparándolo con otras soluciones. Para ver en detalle una hoja de los librillos, está disponible una plantilla de navegador web en A4 para descargar en PDF.

Un librillo cuesta 13.95$ y te hacen descuento si compras varios a la vez.
Las reglas cuestan 26.95$, también te hacen descuento por varias compras y viene con un lapicero.







Behance Outfitter, en la tienda online puedes ver el catálogo completo. Tienen libretas pequeñas pensadas para la movilidad, paquetes de hojas y tarjetas basadas en su método de gestión de tareas, cuadernos con diferentes tapas y anillas…
Pero la joya son el Dot Grid Book y el Action Book. El primero es un cuaderno un poco más grande que un A4 con un papel de gran grosor y textura, perfecto para dibujar, pintar y tomar notas. Con anillas resistentes y unas tapas duras muy elegantes que da gustito tocarlas.

El segundo, el Action Book, es exactamente el mismo cuaderno que el Dot Grid, pero pensado para los seguidores de la metodología. En las caras frontales de las páginas, incluye un lateral con espacios para capturar las acciones a realizar y después recortarlas o trasladarlas donde quieras.

Estos dos valen 15$ cada uno.

Ficheros: conocer la fecha de modificación en Java

En primer lugar deberemos de acceder al fichero mediante la clase File.
File fichero = new File("test.txt");

Ahora que ya tenemos instanciada la clase File utilizaremos el método .lastModified(), el cual nos devolverá la fecha de la modificación pero en formato de milisegundos.
long ms = fichero.lastModified();

Así, las siguientes líneas tendrán que servirnos para convertir los milisegundos en una fecha. Esto, en Java, lo podemos conseguir mediante una clase Calendar, la cual instanciaremos mediante un Date y el resultado devuelto por .lastModified().
Date d = new Date(ms); 
Calendar c = new GregorianCalendar();
c.setTime(d);

Por último nos apoyaremos en las constantes Calendar.DATE, Calendar.MONTH, Calendar.MINUTE,... para sacar los valores que nos ayuden a obtener la fecha de modificación de un fichero con Java.

dia = Integer.toString(c.get(Calendar.DATE));
mes = Integer.toString(c.get(Calendar.MONTH));
annio = Integer.toString(c.get(Calendar.YEAR));
hora = Integer.toString(c.get(Calendar.HOUR_OF_DAY));
minuto = Integer.toString(c.get(Calendar.MINUTE));
segundo = Integer.toString(c.get(Calendar.SECOND));

un saludo

viernes, 3 de febrero de 2012

Aumenta tu creatividad con estos 29 consejos


Esta es la lista de cosas que nos recomienda el vídeo:
  1. Elabora listas 
  2. Llévate un cuaderno de notas a todas partes 
  3. Practica la escritura libre 
  4. Aléjate del ordenador 
  5. Deja de castigarte a ti mismo 
  6. Relájate 
  7. Canta en la ducha 
  8. Toma café 
  9. Descubre nueva música 
  10. Mantén una actitud abierta 
  11. Rodéate de gente creativa 
  12. Escucha 
  13. Colabora 
  14. No te rindas 
  15. Practica, practica, practica… 
  16. Permítete cometer errores 
  17. Viaja a nuevos lugares 
  18. Enumera tus virtudes 
  19. Descansa mucho 
  20. Asume riesgos 
  21. Rompe las reglas 
  22. No fuerces nada 
  23. Lee una página del diccionario 
  24. Crea tu propio esquema de trabajo 
  25. Deja de intentar ser alguien perfecto 
  26. ¿Tienes una idea? Anótala 
  27. Mantén ordenado tu espacio de trabajo 
  28. Diviértete 
  29. Acaba algo 
visto en Soy Gik

jueves, 2 de febrero de 2012

Tiempo de un vídeo con HTML5

Podemos consultar el tiempo total de un vídeo utilizando el atributo duration del HTMLMediaElement.
var fvideo = document.getElementById("miVideo");
document.write(fvideo.duration);

En este caso el atributo duration, no nos devolverá ningún valor. Esto es debido a que la información del tiempo total de un vídeo no es cargada hasta que tenemos la información de los metadatos del vídeo.

Para ello tenemos el evento loadeddata. Así que tendremos que poner un listener sobre dicho evento en el elemento video. En este caso utilizaremos el método.addEventListener() para llevar a cabo dicha tarea.
var fvideo = document.getElementById("miVideo");
fvideo.addEventListener("loadeddata",function(ev){
       ...
},true);

Será dentro del listener dónde codifiquemos el acceso al campo duration del HTMLMediaElement para obtener el tiempo total de un vídeo HTML5.

var fvideo = document.getElementById("miVideo");
fvideo.addEventListener("loadeddata",function(ev){
       document.getElementById("tiempoTotal").innerHTML = fvideo.duration;
},true);

un saludo