Facebook puzzles: (II, Hoppity)

Un nuevo rompecabezas, un poco más complicado:

package com.kodegeek.blog.jobsearch.facebook.hoppity;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

/**
 * To help test whether your puzzle submissions fit the guidelines, try this simple test puzzle.
 * Your solution must follow the guidelines like any other puzzle.
 * Write a program that takes as input a single argument on the command line.
 * This argument must be a file name, which contains a single positive integer.
 * The program should read this file and obtain the integer within, and then output a sequence of strings
 * based upon the number (details below).
 * @author josevnz@kodegeek.com
 *
 */
public final class Hoppity {

	/**
	 * The input file will contain a single positive integer (in base 10) expressed as a string using standard ASCII text
	 * (e.g. for example, the number "15" but without the double quotes).
	 * This number may or may not be padded on either side with white space.
	 * There will be no commas, periods, or any other non-numeric characters present within the number.
	 * The file may or may not terminate in a single new line character ("\n")
	 * @param file file with the number
	 * @return integer
	 * @throws IOException
	 */
	private static int readNumber(File file) throws IOException {
		int aNumber = -1;
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(new FileReader(file));
			// Trim any spaces and then try to parse the number
			aNumber = Integer.parseInt(reader.readLine().replaceAll("\\s*", ""));
		} catch (IOException ioExp) {
			throw ioExp;
		} finally {
			if (reader != null) {
				reader.close();
			}
		}
		return aNumber;
	}

	/**
	 * @param args args[0] = Full path to input file
	 */
	public static void main(String[] args) throws Exception {
		if (args != null && args.length == 1 && args[0] != null) {
			File numFile = new File(args[0]);
			if (numFile.exists() && numFile.canRead()) {
				int number = readNumber(numFile);
				for (int i = 1; i < = number; i++) {
					boolean mod3 = i % 3 == 0;
					boolean mod5 = i % 5 == 0;
					if (mod5 && mod3) {
						System.out.println("Hop");
					} else if (mod3) {
						System.out.println("Hoppity");
					} else if (mod5) {
						System.out.println("Hophop");
					} else {
						continue;
					}
				}
			}
		}
		return;
	}
}

Lo más complicado aquí es asegurarnos que el número pueda ser leido si tiene espacios. No hay otras restricciones aparentes.

No muestro el wrapper ni el archivo de compilación Ant ya que son muy parecidos al del problema anterior.

Veneblogs: , , ,
Blogalaxia: , , ,

To2blogs: , , ,

Technorati: , , ,

Del.icio.us: , , ,

Facebook Puzzles (I, MeepMeep)

La gente de Facebook tiene un enlace permanente con rompecabezas para quienes quieren aplicar a una posición allí; La conseguí por un aviso clasificado que ellos mostraban en su sitio web y después de leerlos les puedo decir que me quedé pegado tratando de resolverlos.

Ya les iré contando como me fué con cada uno de los problemas, el primero de ellos es sólo para probar que el código enviado compila, para lo cual prepare mi archivo Ant:

< ?xml version="1.0" encoding="ISO-8859-1"?>

Solution for puzzles from 'Puzzle Master Facebook Page',
Solution sent to address: perl -e 'printf "%d\@facebook.com\n", 0xFACEB00C>>2'
Author: josevnz@kodegeek.com. http://kodegeek.com/blog/

El código de ‘MeepMeep’

package com.kodegeek.blog.jobsearch.facebook.meepmeep;

/**
 * Write a program that takes as input a single argument on the command line.
 * This argument must be a file name, which contains text.
 * The program should completely ignore this argument and instead print
 * to standard out the string "Meep meep!" (without the double quotes) followed by a newline.
 * @author josevnz@kodegeek.com
 *
 */
public final class MeepMeep {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("Meep meep!");

	}
}

Y el wrapper:

exec java -classpath . com.kodegeek.blog.jobsearch.facebook.meepmeep.MeepMeep $*

Ellos piden que lo envies a la siguiente dirección: {0xFACEB00C>>2 in decimal}@facebook.com

Decodificarla es trivial en Perl y en cualquier otro lenguaje:

 lang="Perl">
perl -e 'printf "%d\@facebook.com\n", 0xFACEB00C>>2'

Si todo sale bien, el robot de Facebook les dirá lo siguiente:

Dear submitter,

Thank you for your test submission of a puzzle solution to Facebook! After running your solution to meepmeep, I have determined it to be correct. Since your test has been successful, you are all set to try one of the other puzzles. Best of luck!

Sincerely,
-The puzzle robot

Veneblogs: , , ,
Blogalaxia: , , ,

To2blogs: , , ,

Technorati: , , ,

Del.icio.us: , , ,

¿Como encontrar el último día hábil del mes en Java?

Quizas a usted alguna vez le toco programar como encontrar el último día hábil del mes. La definición:

Es el último día del mes, que no cae un fin de semana y que no es un día feriado.

Para trabajar este ejemplo utilizaremos fechas de los Estados Unidos, mercado de finanzas. En el caso de los días feriados, vamos a utilizar el calendario de OCC (Options Clearing Corporation). Dependiendo del área y país en donde usted trabaje el calendario de las fechas será distinto (por ejemplo Estados Unidos y Venezuela).

La solución en Java es sencilla, usando la clase Calendar. Después de jugar un poco al final terminé escribiendo esta clase que muestra el último día hábil del mes y le dice a usted si la fecha entrada por el teclado es un día hábil o no:

package com.kodegeek.blog.finance;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Scanner;
import java.util.Set;
import java.util.logging.Logger;

/**
 * Helper date methods tailored for the financial industry.
 * License: LGPL
 * BLOG: http://kodegeek.com
 * @author josevnz@kodegeek.com
 *
 */
public final class DateHelper {

	private final static ResourceBundle BUNDLE;
	private final static Logger log;
	private static final Set holidays;

	static {

		BUNDLE = ResourceBundle.getBundle(DateHelper.class.getName());

		log = Logger.getLogger(DateHelper.class.getName());

		// Populate the holidays set
		holidays = new HashSet();
		for (String dateStr: BUNDLE.getString("com.kodegeek.blog.finance.DateHelper.holidays").split(";\\s*", -1)) {
			try {
				holidays.add(DateFormat.getDateInstance(DateFormat.DEFAULT).parse(dateStr));
			} catch (ParseException e) {
				log.warning(String.format(BUNDLE.getString("com.kodegeek.blog.finance.DateHelper.error.badDate"), dateStr));
				continue;
			}
		}

	}

	/**
	 * Default constructor
	 */
	private DateHelper() {
		// Only static methods go on this class
	}

	/**
	 * Check if a given date is the last business day of the month
	 * @param aDate The date to test
	 * @return True if is the last day of the month, false otherwise
	 */
	public final static boolean isLastBusinessDayOfMonth(final Date aDate) {
		boolean isLastBusinessDay = false;

		// Can do a comparison?
		if (aDate == null) {
			return isLastBusinessDay;
		}

		Calendar calendar = Calendar.getInstance();

		// Current date on a weekend
		calendar.setTime(aDate);
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		int month = calendar.get(Calendar.MONTH);
		int year =  calendar.get(Calendar.YEAR);

		int lastbusinessDayOfMonth = getLastBusinessDayOfMonth(month, year);
		if (lastbusinessDayOfMonth == day) {
			isLastBusinessDay = true;
		}

		return isLastBusinessDay;
	}

	/**
	 * Get the last business day of the month for a given month / year combination
	 * @param month The month
	 * @param year The year
	 * @return The last business day
	 */
	public static int getLastBusinessDayOfMonth(final int month, final int year) {
		int day = -1;
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.MONTH, month);
		calendar.set(Calendar.YEAR, year);
		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));

		// Keep looking backwards until the day is not a weekend or a holiday
		while(true) {
			if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
				calendar.add(Calendar.DAY_OF_MONTH, -1);
				continue;
			} else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
				calendar.add(Calendar.DAY_OF_MONTH, -2);
				continue;
			} else if (holidays.contains(calendar.getTime())) {
				calendar.add(Calendar.DAY_OF_MONTH, -1);
				continue;
			}
			break;
		} // End while
		day = calendar.get(Calendar.DAY_OF_MONTH);
		return day;
	}

	/**
	 * Unit test, load today date and check if is a end of the month
	 * @param args The date to test from the command line
	 * @throws Exception If the date is invalid for the given local
	 */
	public static void main(String [] args) throws Exception {
		Scanner scan = new Scanner(System.in);
		do {
			String currDateStr = null;
			SimpleDateFormat format = new SimpleDateFormat("yy-M-d");
			try {
				System.out.println("Please enter a date to check (YYYY-MM-DD, Ctrl-C to exit):");
				currDateStr = scan.nextLine();
				Date date = format.parse(currDateStr);

				if (date != null) {
					Calendar calendar = Calendar.getInstance();
					calendar.setTime(date);
					int month = calendar.get(Calendar.MONTH);
					int year =  calendar.get(Calendar.YEAR);
					System.out.println(String.format("Last business day of the month: %d", getLastBusinessDayOfMonth(month, year)));
					System.out.println(String.format("%s %s", currDateStr,isLastBusinessDayOfMonth(date) == true? "Is the last business day": "Is not the last business day"));
				}
			} catch (ParseException pExp) {
				System.err.println(String.format("Ignoring bad date: '%s'", currDateStr));
			}
		} while (true);
	}

}

El resource bundle lo único que contiene son los días feriados:

# Bank holidays per OCC calendar 2009 - http://www.optionsclearing.com/market/infomemos/2008/oct/24961.pdf
com.kodegeek.blog.finance.DateHelper.holidays=Jan 01, 2009;January 19, 2009; Feb 26, 2009;Apr 10, 2009;May 25, 2009;July 3, 2009; Sep 7, 2009; Nov 26, 2009; Dec 25, 2009; Oct 12, 2009; Nov 11, 2009
com.kodegeek.blog.finance.DateHelper.error.badDate=Got bad date '%s' from property

La idea es buscar el último día del mes y de allí contar hacia atrás, esquivando fines de semana y días feriados.

Please enter a date to check (YYYY-MM-DD, Ctrl-C to exit):
2009-02-27
Last business day of the month: 27
2009-02-27 Is the last business day

En una siguiente entrega les mostraré como hacer lo mismo en Ruby.

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

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

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:

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:
 * 
    *
  • http://java.sun.com/products/javamail/javadocs/index.html
  • *
  • http://java.sun.com/developer/onlineTraining/JavaMail/contents.html
  • *
  • http://java.sun.com/products/javamail/javadocs/com/sun/mail/imap/package-summary.html
  • *
  • http://java.sun.com/products/javamail/downloads/index.html
  • *
* Also define a properties file with the following (adjust it to your configuration): * # As defined by the Javadoc *
    *
  • mail.user=name.lastname@gmail.com
  • *
  • mail.password=zzz
  • *
  • mail.store.host=pop.imap.gmail.com
  • *
  • mail.store.protocol=imap
  • *
  • mail.imap.port=993
  • *
  • mail.imap.socketFactory.port=993
  • *
  • mail.imap.socketFactory.class=javax.net.ssl.SSLSocketFactory
  • *
* 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.

Distribución de archivos en una granja de servidores: ¿Hay algo mejor que NFS por allí?

Mi problema es el siguiente: Tengo que distribuir archivos de manera rutinaria a más de 500 servidores los cuales corren Linux / Solaris. Ninguno de ellos es mayor de 10 MB por si sólo, pero tengo muchisimos de ellos y la distribución de los archivos debe ser lo más rapida posible además de tener cierta tolerancia a fallos.

Por ahora estas son mis opciones:

NFS: Más vale diablo por viejo que por diablo
NFS es muy conveniente; Es fácil de compartir información, y sin embargo tiene problemas de desempeño y seguridad. Si usted tiene una aplicación que requiere compartir datos com más de 500 servidores entonces ya seguramente sabe de lo que estoy hablando.

¿Entonces como se puede reemplazar a NFS? Una de las opciones más atractivas es AFS. El problema es que es más complejo de administrar, y esa es una barrera dificil de superar en el mundo corporativo (ojo, muchas compañias grandes lo utilizan).

Rsync: Preparence a escribir scripts

Rsync utiliza un novedoso algoritmo el cual envia por la red solamente diferencias entre el destino y la fuente, lo cual lo hace muy eficiente. Sin embargo si usted quiere utilizarlo para duplicar información entonces seguro se verá escribiendo un shell script para adaptarlo a sus necesidades. Otros inconvenientes: Si usted tiene muchos archivos entre la fuente y el destino entonces deberá esperar un buen tiempo mientras rsync decide que copiar. Otro problema es que es considerado inseguro por muchos administradores de sistemas (los cuales prefieren no lidiar con su configuración adecuada).

Secure Copy / Secure FTP: Scripts y la historia de la tortuga

¿Y que tal scp or sftp? Trabaja bien, es muy seguro pero no es más rápido que rsync. Preparese a echar código si quiere una solución a la medida. Por otro lado rsync y ssh pueden trabajar juntos (opción -rsh=ssh de rsync).

P2P: Suena bien, pero ¿sólo en papel?
Yo en particular no he visto casos de como distribuir archivos en una red corporativa usando P2P. Java en particular tiene su estandar llamado JXTA pero no he visto mucha acción allí. Algunos ejemplos interesantes incluyen el uso de clientes como Azureus los cuales utilizan el protocolo Bittorrent para lograr su cometido.

¿Y entonces, qué hago?

Por ahora estoy utilizando una combinación de NFS, Rsync y scp para copias pequeñas. Sin embargo estoy seguro de que existe una mejor manera de hacer esto.

¿Y ustedes conocen una mejor solución a este problema?

Buscar en otros sitios:

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

Sun y Java: ¿Que es lo que está pasando?

James Gosling, father of Java
James Gosling en JavaOne del 2008

Este año ha sido malo para Java. Java FX no ha terminado de despegar, el stock de SUN cayó de $20 a $4, y ahora los desarrolladores de juegos están huyendo del lenguaje por problemas de adopción de la plataforma (nada que ver con el lenguaje).

Yo en particular no entiendo la posición de SUN de congelar a Swing en favor de Java FX. Como diriamos en Venezuela, ¡tremendo pelón de bolas!

¿Esto significa el final de Java?

No lo creo así. A diferencia de Perl (uno de mis lenguajes favoritos también), Java es una tecnología demasiado importante para dejarla morir. Una compañia como IBM e incluso Microsoft podrían recoger el lenguaje para darle soporte. Lo otro es que Java ya tiene vida propia ya que al ser Open Source significa que el lenguaje continuaria viviendo (compañias como RedHat lo apoyan fuertemente).

Todos los lenguajes y tecnologías tienen sus punto altos y bajos. Basic, Pascal, C++ y Perl tuvieron su momento años atrás. Python, Ruby tienen el centro de antención y Microsoft tiene la fuerza suficiente como para seguir empujando a C#. Java está en una encrucijada y ahora SUN enfrenta quizas su peor crisis en una de las peores rececesiones en los Estados Unidos (prefiero hablar de esto en otro articulo en este blog).

Sólo queda esperar que SUN juegue bien sus cartas con Java. Quizas es el momento de ver a Java evolucionar y de adoptar el siguiente lenguaje (¿Scala?).

Buscar en otros sitios:

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

Yo adoro Perl, pero…

Perl nos tiene esperando por una versión nueva desde hace tiempo. Pero de allí a que un blogger en O’Reilly salga diciendo que Perl + CGI es todavía una alternativa viable para hacer aplicaciones web hay mucho trecho.

¿Donde estás Perl, que no te vemos? Mientras tanto, Java Servlets 3.0 promete cosas interesantes.

Buscar en otros sitios:

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

AguaYFuego; Se me trancó el Serrucho

No hay nada más fustrante (por no poder escribir la palabra que realmente describe mi estado de animo) que sentarse a trabajar en una idea y encontrarse conque las herramientas no funcionan.

En este caso estoy tratando de liberar código (ya probado un millón de veces) desde Sentilla Eclipse hacia el mote. Pero Eclipse se tira 3 peos:


5:31:03: serial@ftd/M4ASU2W5:115200: resynchronising

Use replacement opcodes
5:31:20: PacketHandler started.
5:31:20: MimeoConnectionListener starting
5:31:20: HostConnectionListener starting
5:31:20: HostCollectionThread started.
5:31:20: Creating CollectionProtocol Ack listener...
5:31:20: Server started.
5:31:20: Listening on: 127.0.0.1:9002
5:31:20: Listening on: 127.0.0.1:10004
5:39:23: Error linking: class file missing:
5:39:23: Failed to install app

En vez de escribir código ahora estoy soportando el entorno de desarollo 🙁

Curiosamente me conseguí con un error en la bitacora del servidor, un error de arranque:

Parece un problema de arranque del servidor de Sentilla en OSX:


auyan:SentillaWork-1.1.01 josevnz$ tail -f log/hostserver.log
6:34:42: serial@ftd/M4ASU2W5:115200: resynchronising

serial@ftd/M4ASU2W5:115200: resynchronising
Use replacement opcodes
6:34:59: PacketHandler started.
6:34:59: MimeoConnectionListener starting
6:34:59: HostConnectionListener starting
6:34:59: HostCollectionThread started.
6:34:59: Creating CollectionProtocol Ack listener...
6:34:59: Server started.
6:34:59: Listening on: 127.0.0.1:9002
6:34:59: Listening on: 127.0.0.1:10004
java.io.FileNotFoundException: com.sentilla.mote.clientservices.ClientServices.oos (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(FileInputStream.java:106)
at java.io.FileInputStream.(FileInputStream.java:66)
at com.sentilla.virtual.ImageEnvironment$Image.init(ImageEnvironment.java:179)
at com.sentilla.virtual.ImageEnvironment$Image.(ImageEnvironment.java:206)
at com.sentilla.virtual.ImageEnvironment.addImage(ImageEnvironment.java:317)
at com.sentilla.virtual.HostService$MimeoSync.completed(HostService.java:204)
at com.sentilla.net.mimeo.ProxyImage.completed(ProxyImage.java:164)
at com.sentilla.net.mimeo.ProxyImage$Slingshot.completed(ProxyImage.java:114)
at com.sentilla.net.mimeo.MimeoImage.writePage(MimeoImage.java:55)
at com.sentilla.net.mimeo.ProxyImage$Slingshot.writePage(ProxyImage.java:107)
at com.sentilla.net.mimeo.Mimeo.process_outputs(Mimeo.java:501)
at com.sentilla.net.mimeo.Mimeo.run(Mimeo.java:790)
at java.lang.Thread.run(Thread.java:613)
6:35:22: mimeoImageComplet: 600949431; {binHashId=600949431, user=josevnz, mimeoSlot=1, imageData=com.sentilla.net.mimeo.ProxyImage$Slingshot@7d51a6, host=auyan.local, binary=com.sentilla.net.mimeo.ProxyImage$Slingshot@7d51a6, size=2450, date=Sat Oct 18 06:15:51 EDT 2008, name=com.sentilla.mote.clientservices.ClientServices}

Curiosamante esto comenzó a ocurrir después de un parche de seguridad liberado por Apple hace poco. Sin emnargo no puedo probar que esten relacionados. Voy a probar desde Windows.

Buscar en otros sitios:

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

La caida de Lehman Brothers, Bearn Stearns y Merril Lynch: Sacudidas en Wall Street

Wall Street Survivor, Fantasy portfolio
En el mundo virtual todo luce bien. Ojala y todo fuera virtual

Antes de empezar permitame decir lo siguiente: Usted no debe tomar ninguna de mis recomendaciones como aviso financiero. Cualquier decision que usted tome después de leer este articulo es su completa responsabilidad.

Este no es un blog de economia y finanzas y ponerme a escribir sobre lo que pienso de todo el tumulto actual en Wall Street me pone cabezón. Por otro lado me parece criminal no comentar sobre este momento historico de los mercados Americanos . Ya alguien se me adelantó así que los invito a que lean un articulo muy sencillo escrito por alguien que trabaja en tecnología; El autor explica que como esto lo puede afectar a usted, desarrollador o administrador de sistemas (sobre todo si vive en los Estados Unidos).

¿Ya terminó de leer y no entendió nada? 🙂 No se preocupe, usted no está sólo. Dejeme en cambio distraerlo por un momento con una gráfica de mi portafolio en Wall Street Survivor. Al momento de escribir esto yo estoy de 356 entre 29599 jugadores (1.2%) en el juego virtual sobre la bolsa de valores.

Todo el mundo comienza con $100,000 dolares, y de allí en adelante puede construir un portafolio con ayuda de unos magos o desde cero. Yo decidí comenzar desde cero, con inversiones en compañias que conozco (tecnología y finanzas). Casi inmediatamente perdí dinero (ya que traté de especular en vez de invertir con dinero de mentiras), pero logré recuperarlo todo e inclusive hice crecer el portafolio haciendo lo que se conoce como “naked short selling“.

La idea naked short selling es obtener prestadas acciones de una compañía sin comprarlas realmente, apostando que el precio de la acción va a bajar. Llegado el momento, una compra las acciones de vuelta pero al precio más bajo (pagando el préstamo) y la diferencia es lo que uno gana. Haciendo short selling (virtualmente) con AIG, WM logré inflar el portafolio.

¿Y que tiene que ver mi portafolio virtual con el problema en Wall Street? No mucho, excepto mostrar un poco como la economia está increiblemente agitada y que uno de los mecanismos de inversión de los cuales nadie hablaba antes ahora se ha convertido en el blanco de las noticias.

Y es que estos días los rumores son suficientes para hacer que las compañias se caigan en pedazos. En menos de 6 meses, Bearn Stearns, Lehman Brothers y Merril Lynch han dejado de existir (al menos como eran antes), y el precio de las acciones en el mercado no sigue leyes fundamentales sino el pánico.

La realidad trabaja de manera muy diferente a la fantasía. Déjeme mostrarles lo que le paso a una de esas compañias. Hace dos años el precio de sus acciones estaba en $40+ dolares, llegó a un máximo de $85, y en un fin de semana llegó a cero cuando se declaró en bancarrota (los datos historicos vienen de Google Finance ):

Closing Prices
Precios de la compañia en caida libre

Pero lo más interesante es el volumen de transacciones en las acciones de compañia:

Trade Volume
Volumen de operaciones en las acciones de la compañia

¿Vieron la segunda gráfica? Esos son los volumenes de transacciones de las acciones de la compañía en esos días. Es increíble la cantidad de especulación que hubo esos días, simplemente los datos no mienten.

¿Es este el fin de Wall Street? Yo no soy el único que cree que no es asi, más bien pienso que se está escribiendo un capitulo importante en su historia. Este es el momento de aprender y de buscar oportunidades.

Cambiando de tema, el código que hizo los gráficos no es otro que JFreeChart, en una sencilla aplicación de Java Swing. Les dejo el código de la aplicación en el repositorio de código de Kodegeek.com en SourceForge para que se lo bajen y jueguen con este.

ACTUALIZACION: Corregí un par de cucarachas. También pueden correr la aplicación con Java Webstart.

Buscar en otros sitios:

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

Sentilla Perk: La experiencia Mac OSX

Perk from Sentilla
Al fin, puedo programar mi Perk desde OSX

Esta semana me decidí a instalar OSX Leopard en la Laptop de mi esposa Veronica y en mi computadora de escritorio; La experiencia fué simplemente indolora (no recuerdo que ninguna actualización de Windows o Linux halla ido tan bien). La razón de la actualización tuvo más que ver con el hecho de que necesito utilizar Java 6 es OSX y no tengo tiempo para jugar con OpenJDK.

Con este cambio ahora puedo bajarme también el Kit Perk de Sentilla para OSX, el cual fué liberado recientemente (Agosto 22).

¿Las instrucciones de instalación? Sencillas:

Mac OS X Distribution of Sentilla Work
———————————–

Version: 1.1.1 for Mac OS X

Tested on Mac OS X 10.4.11 and 10.5.4. Please see the release notes in SentillaWork/docs for more complete installation instructions and limitations.

Prerequisites:
– Mac OS X Tiger or Leopard
– Java 1.5 or higher

To install:
1. Install prerequisites.
2. Untar the archive
3. cd into the resulting directory.
4. Run “sudo ./install.sh”.

To run the Sentilla Host Server:
1. Run the hostserver with “./sentilla-hostserver”.
2. The server can be shut down using it’s PID: kill -9 `cat log/hostserver.pid`

To run the SentillaWork IDE:
1. Run the IDE with “./sentilla-work”.

To uninstall:
1. Run “sudo ./uninstall.sh”.
2. Delete the Sentilla directory and tar file.

This is NOT free software. Please see the included LICENSE.txt file for
licensing information.

Aunque por otro lado, hubiera sido mucho mejor hacer un paquete (.app), ¿no es así?. Dejando esa queja de un lado, me decidí a revisar el instalador (install.sh), buscando la parte en la cual instalan un manejador de dispositivos USB compatible con el Gateway:

if [ -e /System/Library/Extensions/FTDIUSBSerialDriver.kext ]; then
echo “FTDI VCP driver found; moving to /System/Library/Extensions.disabled”
if [ ! -e /System/Library/Extensions.disabled ]; then mkdir /System/Library/Extensions.disabled; fi
mv /System/Library/Extensions/FTDIUSBSerialDriver.kext /System/Library/Extensions.disabled/
echo “Please restart your system and run install.sh again.”
exit 1
fi

Ajá, aquí esta la vaina. Se ve sencillo, así que puedo dejar que el script haga el daño. Sin embargo (y en un acto de precaución raro en mi) me decidí también leerme la documentación en PDF especifica para OSX.

Ahh, bueno, resulta que la versión de Mac tiene cosas que no funcionan como en la versión de Windows, sin embargo no son tan importantes. Pero me molesto que cuando traté de instalar una aplicación desde Sentilla Eclipse, me dió el siguiente error:

5:31:25: Exception at node 00:12:75:00:11:e4:2d:75: BIN num: abd13878CLASS num: 54
at : BIN num: abd13878; methodNum: 292; pc: 665
at : BIN num: abd13878; methodNum: 172; pc: 34
at : BIN num: 722bd3fd; methodNum: 671; pc: 18
at : BIN num: 722bd3fd; methodNum: 839; pc: 48
at : BIN num: 722bd3fd; methodNum: 664; pc: 41

La versión de OS X pareciera hecha a los trancazos; El programa que se usa para correr el servidor de sentilla es super sencillo, sin embargo no tiene manera de matar al demonio (lo tiene que hacer usted con ‘kill’).

No estoy muy impresionado, vamos a ver que tan lejos llego el el foro de soporte de Sentilla.

Buscar en otros sitios:

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