Archivo

Entradas Etiquetadas ‘opensource’

UML y Violeta: Un editor práctico de UML

Lunes, 19 de enero de 2009

Recuerdo hace años cuando en mi primer trabajo comenzamos a usar Rational Rose (Hoy end día IBM) para hacer el modelado de UML; En ese entonces no habían muchos productos (buenos) en el mercado y al final pagamos una suma generosa por varias licencias, al menos para quienes hacíamos el diseño de las aplicaciones web.

En aquel entonces UML era la moda y ningún desarrollador respetable podía hacer un diseño o implementación sin este; Si bien los diagramas de clase y casos de uso nos resultaron super útiles para establecer las bases del diseño (Nosotros usabamos RUP para el desarollo), pronto nos encontramos con que no queríamos generar código directamente de los diagramas UML, además de que la versión de Rational Rose que utilizabamos en aquel entonces no era lo más rapida que digamos.

Los tiempos han cambiado y creo que la gente ahora se preocupa más por entregar código que sirve en vez de mortificarse mostrando dibujos (perdón, diagramas UML).

Pero no sólo eso. También hay mejores herramientas gratuitas, como Argo UML (el cual tiene mucha funcionalidad) o Violet.

En particular Violet me encanta porqué es sencillo (si, no tiene el %99 de las cosas que un proyecto mediano no necesita), corre rápido, se puede integrar con Eclipse y es OpenSource (si usted se siente inclinado a mejorarlo, pues nada a echar código).

Y ustedes, ¿qué utilizan para sus diagramas en UML?

Blogalaxia:, , , ,
Technorati:, , , ,
To2blogs:, , , ,
Del.icio.us:, , , ,

java, opensource , , ,

Instalando Fedora Core 10 en mi laptop, algo me dice que este no es el año de Linux en el escritorio

Sábado, 10 de enero de 2009

En este momento estoy trabajando en un proyecto personal con Veronica, tal y como se los comentaba en una entrada anterior. Si bien la máquina que tengo corriendo OS X es muy poderosa, prefiero utilizar Linux para correr ciertos procesos ya que está mejor equipado para tareas en el lado del servidor (paquetes preparados, es un sistema operativo robusto, etc).

Sin embargo Fedora Core 10 me ha dado dolores de cabeza en su configuración; El primero de ellos es la configuración automática del entorno gráfico, el cual acepta la resolución correcta pero congela (literalmente) todo la laptop cuando termina de cargar. Es un error increíblemente bizarro, el cual no tiene trazas de error y que no ocurre por ejemplo si instaló Ubuntu 7 (si, es la versión que tenia a la mano). Sin embargo para lo que yo necesito no requiero X Windows en la laptop (de hecho ahorro memoria matando al servidor X) así que durante la instalación le dije al instalador que usara el modo de texto:

image=vmlinuz.initrd text

La instalación transcurrió sin problemas, hasta que llegó el momento de detectar mis dispositivos de red: La tarjeta de red inalámbrica (modelo Linksys Wireless-G WPC54G) fué reconocida, pero el firwmare no cargó, ya que no viene distribuido con ninguna distribución de Linux (la tarjeta de red usa un manejador de Broadcom el cual es propietario y posiblemente nunca será abierto).

La tarjeta PCI fué reconocida

[root@hplaptop ~]# lspci|grep -i wire
02:00.0 FireWire (IEEE 1394): Texas Instruments TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link)
07:00.0 Network controller: Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller (rev 03)
[root@hplaptop ~]#

Esto es básico, no está tan mal. Pero hubo un problema en la inicialización del dispositivo:

Jan  7 19:27:40 localhost kernel: firmware: requesting b43/ucode5.fw
Jan  7 19:27:40 localhost kernel: b43-phy0 ERROR: Firmware file “b43/ucode5.fw” not found
Jan  7 19:27:40 localhost kernel: b43-phy0 ERROR: You must go to http://linuxwireless.org/en/users/Dr
ivers/b43#devicefirmware
and download the latest firmware (version 4).Jan  7 19:27:40 localhost firmware.sh[2051]: Cannot find  firmware file ‘b43/ucode5.fw’

Jan  7 19:27:40 localhost NetworkManager: <info>  (eth0): carrier now OFF (device state 3)Jan  7 19:27:40 localhost NetworkManager: <info>  (eth0): device state change: 3 -> 2
Jan  7 19:27:40 localhost NetworkManager: <info>  (eth0): deactivating device (reason: 40).

Ni corto ni perezoso me dirigí al sitio web, tal y siguiendo las instrucciones para la versión del kernel de Fedora Core 10 copié los archivos a la laptop (recuerden, la laptop funcionaba sin problemas con el cliente DHCP usando ethernet con cable). Del log /var/log/messages:

Jan 10 17:02:38 localhost avahi-daemon[2027]: Loading service file /services/ssh.service.
Jan 10 17:02:38 localhost kernel: firmware: requesting b43/pcm5.fwJan 10 17:02:38 localhost kernel: firmware: requesting b43/b0g0initvals5.fw
Jan 10 17:02:38 localhost kernel: firmware: requesting b43/b0g0bsinitvals5.fwJan 10 17:02:38 localhost kernel: b43-phy0: Loading firmware version 410.2160 (2007-05-26 15:32:10)
Jan 10 17:02:38 localhost kernel: Registered led device: b43-phy0::txJan 10 17:02:38 localhost kernel: Registered led device: b43-phy0::rx
Jan 10 17:02:38 localhost kernel: Registered led device: b43-phy0::radioJan 10 17:02:38 localhost avahi-daemon[2027]: Network interface enumeration completed.

¡Muy bien! Ahora sólo tengo que revisar si la interfaz inalámbrica funciona bien. Lo primero es ver si puede detectar las redes vecinas:

[root@hplaptop ~]# iwlist wlan0 scan
wlan0     Scan completed :
Cell 01 – Address: 00:1F:F3:C4:CC:C4
ESSID:”tepuyes2″
Mode:Master
Channel:1
Frequency:2.412 GHz (Channel 1)
Quality=78/100  Signal level:-52 dBm  Noise level=-66 dBm
Encryption key:on
IE: WPA Version 1
Group Cipher : TKIP
Pairwise Ciphers (1) : TKIP
Authentication Suites (1) : PSK
IE: IEEE 802.11i/WPA2 Version 1
Group Cipher : TKIP
Pairwise Ciphers (2) : CCMP TKIP
Authentication Suites (1) : PSK
IE: Unknown: 2D1A2C0217FFFF000000000000000000000000000000000000000000
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
48 Mb/s; 54 Mb/s
Extra:tsf=000000010a58699c
Extra: Last beacon: 656ms ago

Cell 02 – Address: 00:1E:52:79:34:74
ESSID:”Botart’s Network”
Mode:Master
Channel:3
Frequency:2.422 GHz (Channel 3)
Quality=71/100  Signal level:-58 dBm  Noise level=-66 dBm
Encryption key:on
IE: WPA Version 1
Group Cipher : TKIP
Pairwise Ciphers (1) : TKIP
Authentication Suites (1) : PSK
IE: IEEE 802.11i/WPA2 Version 1
Group Cipher : TKIP
Pairwise Ciphers (2) : CCMP TKIP
Authentication Suites (1) : PSK
IE: Unknown: 2D1A4C101BFFFF000000000000000000000000000000000000000000
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
48 Mb/s; 54 Mb/s
Extra:tsf=000000001bbc0180
Extra: Last beacon: 518ms ago

Nada mal, mi red sale en la lista.  ¿Y que tal el estado de la interfaz wlan0?

No está conectada aún. Bueno, hay que configurarla a mano asegurándonos de que pueda ver la red inalámbrica con el SSID adecuado:

[root@hplaptop ~]# cat /etc/sysconfig/network-scripts/ifcfg-wlan0
# Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller
DEVICE=wlan0
HWADDR=00:0c:41:2e:b2:18
USERCTL=yes
ONBOOT=yes
BOOTPROTO=dhcp
TYPE=Wireless
MODE=Managed
#ESSID=tepuyes2
RATE=54Mb/s

En mi caso utilizo WPA, y así que tengo que configurarlo para que la comunicación de los certificados digitales trabaje bien:

[root@hplaptop ~]# cat /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
network={
ssid=”tepuyes2″
psk=”XXXX”
}
[root@hplaptop ~]#

Después de reiniciar un par de veces, volví a revisar la configuración básica:

[root@hplaptop ~]# iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.

wmaster0  no wireless extensions.

wlan0     IEEE 802.11bg  ESSID:”NETGEAR”
Mode:Managed  Frequency:2.462 GHz  Access Point: 00:09:5B:C2:F6:5A

Bit Rate=2 Mb/s   Tx-Power=27 dBm
Retry min limit:7   RTS thr:off   Fragment thr=2352 B
Encryption key:off
Power Management:off
Link Quality=63/100  Signal level:-65 dBm  Noise level=-66 dBm
Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
Tx excessive retries:0  Invalid misc:0   Missed beacon:0

pan0      no wireless extensions.

¿Ya tengo dirección IP?

root@hplaptop ~]# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:02:3F:2F:38:D2
inet addr:10.0.1.194  Bcast:10.0.1.255  Mask:255.255.255.0
inet6 addr: 2002:4577:929d:0:202:3fff:fe2f:38d2/64 Scope:Global
inet6 addr: fe80::202:3fff:fe2f:38d2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:382 errors:0 dropped:0 overruns:0 frame:0
TX packets:196 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:38391 (37.4 KiB)  TX bytes:38171 (37.2 KiB)

lo        Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING  MTU:16436  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

pan0      Link encap:Ethernet  HWaddr 56:58:74:F3:A2:B1
BROADCAST MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

wlan0     Link encap:Ethernet  HWaddr 00:0C:41:2E:B2:18
inet6 addr: fe80::20c:41ff:fe2e:b218/64 Scope:Link
UP BROADCAST MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b)  TX bytes:108 (108.0 b)

wmaster0  Link encap:UNSPEC  HWaddr 00-0C-41-2E-B2-18-F4-EF-00-00-00-00-00-00-00-00
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

[root@hplaptop ~]#

Aún no :( . También hay varios indicadores de la tarjeta inalambrica los cuales me hacen pensar que hace falta algo más:

[root@hplaptop ~]# iwlist wlan0 power
wlan0     Current mode:off

[root@hplaptop ~]# iwlist rate
lo        no bit-rate information.

eth0      no bit-rate information.

wmaster0  no bit-rate information.

wlan0     unknown bit-rate information.
Current Bit Rate=2 Mb/s

pan0      no bit-rate information.

[root@hplaptop ~]# iwlist key
lo        no encryption keys information.

eth0      no encryption keys information.

wmaster0  no encryption keys information.

wlan0     2 key sizes : 40, 104bits
4 keys available :
[1]: off
[2]: off
[3]: off
[4]: off
Current Transmit Key: [1]

pan0      no encryption keys information.

Mucho se ha escrito sobre lo difiicil que es configurar una tarjeta de red en Linux usando manejadores propietarios, y hay mucha información en la red sobre como configurar y resolver problemas de instalación.

Mis recomendaciones por ahora:

  • No compre tarjetas que no funcionan con manejadores nativos de Linux. NDIS y otros proyectos son un parche encima de la incompetencia de los vendedores en proveer manejadores abiertos. En particular la tarjeta que compré fué un gasto de $20 (yo me confié pensando que Linksys por hacer otros productos OpenSource seguro haría lo mismo con la tarjeta de red. Tremendo error).
  • No descarte su enlace por Ethernet si está configurando su laptop.
  • Busque ayuda en la red usando Google y otros buscadores. Avance lo más que pueda y después pida ayuda (eso le permitirá entender mejor el problema, a la vez que aprende).

Por ahora sólo me queda pedir ayuda en la lista de Fedora Core en laptops, para tratar de resolver mi problema de la tarjeta de video y la conexión inalambrica. Mientras sigo intentando tengo conectada la laptop al puerto Ethernet de mi Time Capsule de Apple, con lo cual me puedo concentrar en instalar las aplicaciones que quería montar desde el principio y sobre todo en trabajar en mi proyecto.

¿Y usted que opina, tiene algún consejo que quiere compartir?

Blogalaxia:, ,
Technorati:, ,
To2blogs:, ,
Del.icio.us:, ,

kodegeek, linux, opensource , ,

StupidZombie: Código disponible en Java.net

Viernes, 9 de enero de 2009

StupidZombie

Ya terminé de montar el código de StupidZombie en java.net. La funcionalidad es por los momentos identica a PingBlog. El siguiente cambió es re-escribir la interfaz gráfica y agregar mejor soporte de idiomas (Españols va a ser por omisión :) ).

Sin embargo pienso tocar este proyecto de nuevo dentro de 3 meses; En estos momentos estoy ocupado montando Subversion y Fedora Corre 10 para un proyecto web en el cual estoy trabajando con Veronica y que esperamos terminar dentro de ese lapso de tiempo.

Así que a enfocarse y a echar código. Sin embargo me contenta que la base de StupidZombie ya esté puesta.

Blogalaxia:, , ,
Technorati:, , ,
To2blogs:, , ,
Del.icio.us:, , ,

java, kodegeek, opensource, programación , , ,

Borrando correos masivamente usando Javamail

Martes, 30 de diciembre de 2008

Este articulo es una mejora al código que escribí anteriormente. Jugando un poco con Gmail me di cuenta que los correos aún pueden ser recuperados usando POP3, pese a que fueron borrados con IMAP. Realmente bizarro. Así que modifiqué el programa para que manejara un poco mejor el caso de POP3 o IMAP según las propiedades.

Aquí está el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package com.kodegeek.blog.mail;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
 
import javax.mail.Session;
import javax.mail.Flags.Flag;
import javax.mail.internet.MimeMessage;
import javax.mail.Message;
 
import javax.mail.Folder;
import javax.mail.MessagingException;
import javax.mail.Store;
 
import com.sun.mail.imap.IMAPFolder;
 
import java.io.FileInputStream;
 
/**
 * I wrote this program to erase ALL the email on my GMAIL account. I have over 40,000 email so manually doing so was not an option :)
 * Please check the following resources:
 * <ul>
 * <li> http://java.sun.com/products/javamail/javadocs/index.html</li>
 * <li> http://java.sun.com/developer/onlineTraining/JavaMail/contents.html</li>
 * <li> http://java.sun.com/products/javamail/javadocs/com/sun/mail/imap/package-summary.html</li>
 * <li> http://java.sun.com/products/javamail/downloads/index.html</li>
 * </ul>
 * Also define a properties file with the following (adjust it to your configuration):
 * # As defined by the Javadoc
 * <ul>
 * <li> mail.user=name.lastname@gmail.com</li>
 * <li> mail.password=zzz</li>
 * <li> mail.store.host=pop.imap.gmail.com</li>
 * <li> mail.store.protocol=imap</li>
 * <li> mail.imap.port=993</li>
 * <li> mail.imap.socketFactory.port=993</li>
 * <li> mail.imap.socketFactory.class=javax.net.ssl.SSLSocketFactory</li>
 * </ul>
 * More examples:
 * <ul>
 * <li>POP3: -Dmail.user=name.lastname@gmail.com  -Dmail.password=XXXX -Dmail.store.host=pop.gmail.com -Dmail.store.protocol=pop3 -Dmail.store.folder=INBOX -Dmail.pop3.port=995 -Dmail.pop3.socketFactory.port=995 -Dmail.pop3.socketFactory.class=javax.net.ssl.SSLSocketFactory</li>
 * <li>IMAP: -Dmail.user=name.lastname@gmail.com  -Dmail.password=XXXX -Dmail.store.host=imap.gmail.com -Dmail.store.protocol=imap -Dmail.store.folder=INBOX -Dmail.imap.port=993 -Dmail.imap.socketFactory.port=993 -Dmail.imap.socketFactory.class=javax.net.ssl.SSLSocketFactory</li>
 * </ul>
 * License: GPL
 * http://kodegeek.com
 * @author Jose Vicente Nunez Zuleta
 * @version 12/28/2008
 */
public final class MailBulkEraser {
 
	/**
	 * Command line processing
	 * @param args [0] Location of the properties configuration file, If not provided then will use system defaults (defined with -D)
	 * @throws Exception
	 * @since 0.1
	 */
	public static void main(String [] args) throws Exception {
 
		Logger logger = Logger.getLogger(MailBulkEraser.class.getName());
 
		Properties props = System.getProperties();
		if (args.length == 1) {
			props.load(new FileInputStream(args[0]));
		}
		Session session = Session.getInstance(props, null);
		session.setDebug(Boolean.parseBoolean(props.getProperty("debug")));
		Store store = session.getStore(props.getProperty("mail.store.protocol"));
		logger.info(String.format("Connecting to: %s@%s", props.getProperty("mail.user"), props.getProperty("mail.store.host")));
		store.connect(props.getProperty("mail.store.host"), props.getProperty("mail.user"), props.getProperty("mail.password"));
		Folder folder = store.getDefaultFolder();
		logger.info("Got default folder. Erasing emails from ALL the folders");
		Folder [] folders = folder.list();
		long messgCnt = 0;
		for(Folder currFolder: folders) {
 
			try {
 
				if ((currFolder.getType() & Folder.HOLDS_MESSAGES) == 0) {
					continue; // Skip this folder type
				}
				logger.info(String.format("Opening folder: %s, num messages; %d", currFolder.getFullName(), currFolder.getMessageCount()));
				currFolder.open(Folder.READ_WRITE);
				Message [] messages = currFolder.getMessages();
 
				// Mark all the messages for delete
				for (Message message: messages) {
					try {
						if (! currFolder.isOpen()) {
							logger.warning(String.format("Folder %s is closed. Moving to next folder", currFolder.getFullName()));
							break;
						}
						message.setFlag(Flag.DELETED, true);
						MimeMessage currMessage = (MimeMessage) message;
						logger.info(String.format("Deleting mail subject: '%s', folder: '%s', date: '%s'", currMessage.getSubject(), currMessage.getFolder().getFullName(), currMessage.getSentDate()));
						if (currFolder instanceof IMAPFolder) {
							messages = currFolder.expunge(); // Confirm delete for all the messages on the current folder
						}
						messgCnt += 1;
					}  catch (Throwable thrbl) {
						logger.log(Level.WARNING, "There was a problem erasing the message, ignoring", thrbl);
						continue;
					}
				}
 
				logger.info(String.format("Messages erased on folder %s: %d", currFolder.getFullName(), messages.length));
				currFolder.close(true);
 
			} catch (MessagingException messgExp) {
				logger.log(Level.WARNING, "There was a problem, ignoring", messgExp);
			}
 
		}
		logger.info(String.format("Total number of erased messsages: %d", messgCnt));
		store.close();
		System.exit(0);
	}
 
}

Nota de los cambios:

Que lo disfruten :) .

java, kodegeek, opensource , , , , , ,

¿Como borrar 40000 correos en Gmail? Fácil, usando Javamail e IMAP

Domingo, 28 de diciembre de 2008

Este fin de semana me decidí a poner un poco de orden en mis cuentas de correo; Una de las cosas que me obligó a ello es que mi cuenta paga de Yahoo expiró y aún ando debatiendo si debo pagar $20 por una cuenta de correo que no ofrece nada por encima de Gmail. Al momento de revizar mi cuenta de Gmail me encuentro con que estoy usando por encima de 1 GB en correo con más de 40000 correos.

Si, es increíble la cantidad de basura que se acumula en dos años :)

Definitivamente no estaba dispuesto a perder mi tiempo borrando tal cantidad de correos a mano, en vez de eso me decicí a automatizar la tarea usando Java y el hecho de que Gmail soporta POP / IMAP (Javamail cuenta con accesso a IMAP comp arte de su API). Una vez leido un poco abrí mi Eclipse y el resultado es el código que viene a continuación:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package com.kodegeek.blog.mail;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
 
import javax.mail.Session;
import javax.mail.Flags.Flag;
import javax.mail.internet.MimeMessage;
import javax.mail.Message;
 
import javax.mail.Folder;
import javax.mail.MessagingException;
import javax.mail.Store;
 
import java.io.FileInputStream;
 
/**
 * I wrote this program to erase ALL the email on my GMAIL account. I have over 40,000 email so manually doing so was not an option :)
 * Please check the following resources:
 * <ul>
 * <li> http://java.sun.com/products/javamail/javadocs/index.html</li>
 * <li> http://java.sun.com/developer/onlineTraining/JavaMail/contents.html</li>
 * <li> http://java.sun.com/products/javamail/javadocs/com/sun/mail/imap/package-summary.html</li>
 * <li> http://java.sun.com/products/javamail/downloads/index.html</li>
 * </ul>
 * Also define a properties file with the following (adjust it to your configuration):
 * # As defined by the Javadoc
 * <ul>
 * <li> mail.user=name.lastname@gmail.com</li>
 * <li> mail.password=zzz</li>
 * <li> mail.store.host=pop.imap.gmail.com</li>
 * <li> mail.store.protocol=imap</li>
 * <li> mail.imap.port=993</li>
 * <li> mail.imap.socketFactory.port=993</li>
 * <li> mail.imap.socketFactory.class=javax.net.ssl.SSLSocketFactory</li>
 * </ul>
 * License: GPL
 * http://kodegeek.com
 * @author Jose Vicente Nunez Zuleta
 * @version 12/28/2008
 */
public final class ImapBulkEraser {
 
	/**
	 * Command line processing
	 * @param args [0] Location of the properties configuration file, If not provided then will use system defaults (defined with -D)
	 * @throws Exception
	 * @since 0.1
	 */
	public static void main(String [] args) throws Exception {
 
		Logger logger = Logger.getLogger(ImapBulkEraser.class.getName());
 
		Properties props = System.getProperties();
		if (args.length == 1) {
			props.load(new FileInputStream(args[0]));
		}
		Session session = Session.getInstance(props, null);
		session.setDebug(Boolean.parseBoolean(props.getProperty("debug")));
		Store store = session.getStore(props.getProperty("mail.store.protocol"));
		logger.info(String.format("Connecting to: %s@%s:%s", props.getProperty("mail.user"), props.getProperty("mail.store.host"), props.getProperty("mail.imap.port")));
		store.connect(props.getProperty("mail.store.host"), props.getProperty("mail.user"), props.getProperty("mail.password"));
		Folder folder = store.getDefaultFolder();
		logger.info("Got default folder. Erasing emails from ALL the folders");
		Folder [] folders = folder.list();
		long messgCnt = 0;
		for(Folder currFolder: folders) {
 
			try {
 
				if ((currFolder.getType() & Folder.HOLDS_MESSAGES) == 0) {
					continue; // Skip this folder type
				}
				logger.info(String.format("Opening folder: %s, num messages; %d", currFolder.getFullName(), currFolder.getMessageCount()));
				currFolder.open(Folder.READ_WRITE);
				Message [] messages = currFolder.getMessages();
 
				// Mark all the messages for delete
				for (Message message: messages) {
					try {
						message.setFlag(Flag.DELETED, true);
						MimeMessage currMessage = (MimeMessage) message;
						logger.info(String.format("Set delete flag for mail subject: '%s', folder: '%s'", currMessage.getSubject(), currMessage.getFolder().getFullName()));
						messages = currFolder.expunge(); // Confirm delete for all the messages on the current folder
						messgCnt += messages.length;
					}  catch (MessagingException messgExp) {
						logger.log(Level.WARNING, "There was a problem erasing the message, ignoring", messgExp);
					}
				}
 
				logger.info(String.format("Messages erased on folder %s: %d", currFolder.getFullName(), messages.length));
				currFolder.close(true);
 
			} catch (MessagingException messgExp) {
				logger.log(Level.WARNING, "There was a problem, ignoring", messgExp);
			}
 
		}
		logger.info(String.format("Total number of erased messsages: %d", messgCnt));
		store.close();
	}
 
}

Correr el código es trivial, asegurese de tener el JAR de Javamail en el $CLASSPATH y haga algo como esto:


java com.kodegeek.blog.mail.ImapBulkEraser -Dmail.user=name.lastname@gmail.com -Dmail.password=XXXX -Dmail.store.host=imap.gmail.com -Dmail.store.protocol=imap -Dmail.store.folder=INBOX -Dmail.imap.port=993 -Dmail.imap.socketFactory.port=993 -Dmail.imap.socketFactory.class=javax.net.ssl.SSLSocketFactory

El programa no es perfecto, ya que de vez en cuando me conseguí con la siguiente error:


NFO: Set delete flag for mail subject: 'Deploying webapps in embedded environment', folder: 'tomcat-user'
Dec 28, 2008 5:40:18 PM com.kodegeek.blog.mail.ImapBulkEraser main
WARNING: There was a problem erasing the message, ignoring
javax.mail.MessagingException: Failed to load IMAP envelope
at com.sun.mail.imap.IMAPMessage.loadEnvelope(IMAPMessage.java:1069)
at com.sun.mail.imap.IMAPMessage.getSubject(IMAPMessage.java:256)
at com.kodegeek.blog.mail.ImapBulkEraser.main(ImapBulkEraser.java:83)
Dec 28, 2008 5:40:18 PM com.kodegeek.blog.mail.ImapBulkEraser main

Sin embargo esos no son todos los correos :)

Como siempre el código fuente de este programa es GPL y se puede bajar desde CVS.

java , , , ,

JAVAFX es lanzado hoy

Jueves, 4 de diciembre de 2008

Después de mucha espera hoy lanzan JAVAFX. Yo ya les había hablado sobre JAVA FX en mis visita al JavaOne de este año y hoy finalmente sacan su versión 1.0 para varios sistemas operativos, entre ellos Linux y OS X.

¿Son buenas noticias para SUN? Yo en particular creo que sí, aunque vamos a ver como se ve la adopción de le herramienta. En las últimas horas de trading antes de escribir este articulo el precio de las acciones de SUN subio casi un dolar, quizas un indicador de que el mercado cree que esta es una buena noticia (el precio hoy antes de que abra el mercado a las 9:30 AM son $3.81)

Por los momentos no queda otra sino esperar para bajarse el kit de desarollo y ponerse a echar código. Aunque si quiere especular sobre el futuro de Java, lo invito a ver el indice de TIOBE (Java tiene %20, C# %10 y Ruby está por debajo de Python con % 2.87 y % 5.1 respectivamente.

Buscar en otros sitios:

Blogalaxia:, , , ,
Technorati:, , , ,
To2blogs:, , , ,
Del.icio.us:, , , ,

java, kodegeek, opensource , , , ,

StupidZombie: Metiendo código en java.net

Lunes, 20 de octubre de 2008

Después de un letargo inmenso, y de varios intentos inútiles para convencer a un pana de trabajar en el proyecto conmigo me decidí a arrancar yo sólo. Lo primero fué configurar a mi Eclipse para utilizar Subversion; Hay algunos cambios de paradigmas con la herramienta, pero por lo poco que he jugado es muy similar a CVS.

Tambien estoy acomodando el código que tenia en SourceForge; La idea es comenzar con una versión con la misma funcionalidad que tenia PingBlog y de allí desarrollar las nuevas ideas.

Si tiene curiosidad, puede ver el código fuente desde acá. Dentro de poco ya verán la primera versión de StupidZombie.

Buscar en otros sitios:

Blogalaxia:, , ,
Technorati:, , ,
To2blogs:, , ,
Del.icio.us:, , ,

opensource , ,

Buglabs: Hardware y software de código abierto

Miércoles, 15 de octubre de 2008

Gracias al Geek extraordinario Sebastian Delmont tuve la oportunidad hoy de ir a visitar a la gente de Buglabs, quienes estaban haciendo un OpenHouse en sus oficinas en Soho. Realmente después de todas las noticias negativas en el sector financiero (incluyendo el día de hoy en el cual las acciones de todas las compañías volvieron a caer) fué increíblemente refrescante hablar de tecnología y no de negocios.

Corcho es corcho ;)

¿Pero y que es Buglabs? Buglabs es una compañia la cual fabrica componentes modulares basados en el modelo Open Source. Si, el concepto es innovador ya que tanto el software como el hardware son abiertos. El módulo principal corré Linux y encima de eso tienes Java o si quiere código nativo compilado con GCC.

Si no entendió nada no se preocupe. Lo explico de nuevo, un poco diferente esta vez: Es como tener un lego en el cual cada ladrillo agrega funcionalidad nueva al juguete. La diferencia es que el lego corre Linux y se puede programar en Java.

Buglab demo, improvised camera
Esta demostración era una camara improvisada usando módulos buglabs, la cual mandaba fotos a un servidor web usando web services en una red Wifi

La plataforma es muy interesante. No sólo se tiene acceso directo a Linux y Java en el aparato, sino que además es modular (por ejemplo ya venden acelerómetro con sensores de movimiento combinados, GPS, camara digital, Wifi, entre otros). También cuenta con un IDE basado en Eclipse lo cual lo hace idóneo si usted es un desarrollador de Java.

Linux console on Buglab
¡Si, corre Linux y Java + AWT!

Al verlo usted podría pensar que es muy similar a Android. Sin embargo esta plataforma va más allá, ya que la compañía está en capacidad de incluir varias máquinas virtuales en su producto. El sólo hecho de combinar módulos sin necesidad de soldadura y contar con Java como lenguaje de desarrollo lo hace muy interesante como herramienta de enseñanza y aprendizaje, o para el desarollo de aplicaciones a la medida (el sitio web oficial cuenta con una colleción de demostraciones hechas con el producto).

Sin embargo Buglabs no sólo corre Java sino que usted puede utilizar GCC para compilar su código nativo. No pregunté pero no veo imposible tener Python, Ruby o Perl dentro del dispositivo (ciertamente Shell scripting viene grátis con la aplicación de terminal que viene instalada).

Buglab demo, improvised camera
¿No es un poco caro por $300.? Pienselo bien antes de responder, más bien pregunte cuanto cuesta un telefono desbloqueado

La base cuesta un poco más de $340 dolares, y cada modulo cuesta por encima de $20. La camara improvisada con Wifi mostrada arriba en la foto cuesta un poco más de $500 (ya que es una combinación de varios modulos), así que debe estarse preguntando, ¿no es más barato comprarse un Sentilla Perk o Arduino?

Yo creo que el precio de este producto va a bajar una vez que la demanda suba (debe haber producción en masa). Es muy temprano para criticar el precio (habrá que esperar unos 8 meses más o menos), sobre todo si te tiene en cuenta el alto valor que tiene una plataforma tan versátil. Lo otro es que una comparación con Sentilla o Arduino es injusta ya que este no es sólo un dispositivo empotrado que puede ser programado en Java, sino una plataforma completa que corre Linux en la cual hasta se puede compilar código.

Lo reto a que haga esto en su IPhone o teléfono con Android :)

Buglab CEO and team
De izquierda a derecha: Buglab CEO y equipo de desarolladores

Entonces la pregunta obligada es ¿cuales son las posibilidades de supervivencia de una compañía la cual sólo hace herramientas para “aficionados”?. El CEO de Buglab me comentó que ellos no están cerrados a ninguna posibilidad, y que el “Bug” es una prueba de lo que ellos pueden hacer como compañía (hospitales, seguridad, etc. Cualquiera que necesite una plataforma modular a la medida con suficiente poder).

Yo de verdad creo que estamos al frente de una compañía que ofrece un servicio único, basado en el modelo Open Source. El hecho de poder ofrecer servicios basados en una plataforma abierta implica que sus clientes se sentiran más comodos ya que no estarán casados con un sólo proveedor de hardware / software (como es el caso de Apple con sus excelentes productos los cuales son todos cerrados).

Si usted es paciente, ya verá otras compañias haciendo modulos compatibles con buglabs. No veo como no se pueda desarrollar un ecosistema alrededor de este producto, tal cual y como ha pasado con Arduino.

buglab modules
El verdadero poder de los “Bug” es su modularidad, incluyendo estandares abiertos

La visita fué super agradable, los “chamos” de buglabs nos hicieron sentir como en casa mientras nos mostraban sus juguetes. Es raro que alguien te invite a jugar a su casa en estos días, y más si tienen juguetes sofisticados, por lo cual no queda otra más que darles las gracias y esperar que hagan más eventos invitando gente a sus cuarteles generales (revicen el website, ellos tienen un blog muy activo con información útil).

Ya para finalizar, los dejo con las fotos de mi visita a los cuarteles de Buglab en SOHO. Espero que las disfruten y se hagan una idea de lo que vimos allí.

Buscar en otros sitios:

Blogalaxia:, , , , , , , , ,
Technorati:, , , , , , , , ,
To2blogs:, , , , , , , , ,
Del.icio.us:, , , , , , , , ,

java, kodegeek, opensource , , , , , , , , ,

Más Java y Hardware: Arduino

Viernes, 23 de mayo de 2008

Desde que empecé a jugar con Sentilla no he hecho otra cosa más que buscar que otras herramientas existen para programar con Java en hardware de pocos recursos. Lo último que me encontré es esta tarjeta llamada Arduino, la cual viene con su software Open Source.

Por cierto, si tienen tiempo les recomiendo que se compren el libro Make Things Talk. Bien interesante, el nivel técnico requerido no es tan complejo y las aplicaciones son super entretenidas.

Buscar en otros sitios:
Blogalaxia:, , ,
Technorati:, , ,
To2blogs:, , ,
Del.icio.us:, , ,

java, opensource , , ,

PingBlog ya tiene un webmaster

Viernes, 25 de enero de 2008

Si, Alex Camargo se ha unido a este esfuerzo y ahora el sitio web de PingBlog tiene un Webmaster. Alex tiene mucha experiencia con MySQL y PHP, lo cual significa que cosas interesantes vienen para el proyecto.

¡Bienvenido y gracias por la ayuda!

¿Estás interesado en colaborar con PingBlog? El grupo en FaceBook de PingBlog está abierto. Los invito a participar.

Blogalaxia:, ,
Technorati:, ,
To2blogs:, ,
Del.icio.us:, ,

opensource , ,