<body>

Sitios web relacionados: PingBlog | Fotos

domingo, octubre 05, 2008

Sentilla: Agua y fuego



Estoy escribiendo una pequeña aplicación para Sentilla Labs. Comencé primero escribiendo una pequeña aplicación para calibrar el sensor (algo que no habia resuelto muy bien hace tiempo atrás). Lo cierto es que primero usted debe averiguar la temperatura del sitio del cual piensa sacar las medidas, usando quizas el termostato de su casa y luego corre esto desde Sentilla Works (el ide de Eclipse):

 1 package com.kodegeek.app.aguayfuego;
2
3 import static javax.measure.unit.SI.CELSIUS;
4
5 import javax.measure.quantity.Temperature;
6
7 import com.sentilla.system.Leds;
8 import com.sentilla.system.LedsDriver;
9 import com.sentilla.system.PropertyDriver;
10 import com.sentilla.system.Sensor;
11 import com.sentilla.system.SensorDriver;
12
13 /**
14 * Calibrate the sensor using a known value
15 * @author josevnz@kodegeek.com - http://kodegeek.com
16 */

17 public final class SensorCalibration {
18
19 /**
20 * Persist the calibration temperature to
be used by all the applications
21 * @throws InterruptedException
22 */

23 public static void motemain() throws InterruptedException {
24 Sensor <Temperature>tempSensor =
SensorDriver.create("temp", Temperature.class);
25 Leds leds = LedsDriver.create();
26 float calibratedTemp = 25.0f; //
Put here your known temperature

27 leds.toggle(1);
28 double delta = calibratedTemp -
tempSensor.read().doubleValue(CELSIUS);
29 PropertyDriver.create("aguayfuego_temp_init", 8)
.writeDouble(delta);
30 leds.toggle(0);
31 }
32 }


Guardamos el valor en la lína 49. Una vez que usted corra este programa (solamente hace falta si sospecha que la temperatura de su cuarto ha cambiado mucho) entonces puede comenzar a capturar las temperaturas de nuevo. Fijense en el detalle de como se envia la temperatura, más el "delta" el cual contiene el ajuste:
 1 package com.kodegeek.app.aguayfuego;
2
3 import static javax.measure.unit.SI.CELSIUS;
4 import javax.measure.quantity.Temperature;
5 import com.sentilla.net.Mac64Address;
6 import com.sentilla.net.Sender;
7 import com.sentilla.net.SenderDriver;
8 import com.sentilla.system.Leds;
9 import com.sentilla.system.LedsDriver;
10 import com.sentilla.system.PropertyDriver;
11 import com.sentilla.system.Sensor;
12 import com.sentilla.system.SensorDriver;
13
14 /**
15 * Simple class to capture temperature using
Sentilla JMote
16 * @author josevnz@kodegeek.com - http://kodegeek.com
17 */

18
19 public final class TemperatureCapture {
20 public static final int WAIT_TIME = 1000;
21
22 /**
23 * Get the temperature reading
24 * @throws InterruptedException
25 */

26 public static void motemain()
throws
InterruptedException {
27 Sensor <Temperature>tempSensor =
28 SensorDriver.create("temp", Temperature.class);
29 Leds leds = LedsDriver.create();
30 long id = Mac64Address.getLocalAddress().longValue();
31 Sender sender = SenderDriver.create("local");
32 short count = 0;
33 TempMessage datamsg = new TempMessage();
34 datamsg.moteId = id;
35 leds.toggle(0);
36 double delta =
PropertyDriver
.open("aguayfuego_temp_init").readDouble();
37 while(true) {
38 count++;
39 datamsg.count = count;
40 datamsg.tempCelcius =
tempSensor
.read().doubleValue(CELSIUS) + delta;
41 leds.toggle(1); // Show the user the sensor is alive
42 sender.send(datamsg);
43 Thread.sleep(WAIT_TIME);
44 }
45 }
46 }

La línea 36 lee el delta y la 40 lee la temperatura con la corrección. Después la transmitimos en la linea 42.

Finalmente el cliente que lee los valores de los sensores (Esta es una aplicación común y silvestre de Java):
 1 package com.kodegeek.app.aguayfuego;
2
3 import java.io.IOException;
4 import java.util.Map;
5 import java.util.concurrent.ConcurrentHashMap;
6 import java.util.logging.Level;
7 import java.util.logging.Logger;
8 import com.sentilla.host.client.HostClient;
9 import com.sentilla.net.Receiver;
10 import com.sentilla.net.ReceiverDriver;
11
12 /**
13 * Simple command line client that collects
the temperature readings of
14 * all the motes in the wireless network.
15 * @author josevnz@kodegeek.com - http://kodegeek.com
16 */

17 public final class TemperatureClient {
18
19 private TemperatureClient() {};
20
21 private static final Logger log =
Logger.getLogger(TemperatureClient.class.getName());
22
23 static {
24 log.setLevel(Level.INFO);
25 }
26
27 private static final int MOTE_WAIT = 3000;
28
29 /**
30 * Helper class that captures the temperature
comming from the sensor
31 * @author josevnz
32 */

33 class TemperatureCaptureHelper {
34 public final Map <Long, TempMessage>sensorMap;
35
36 /**
37 * Parametric constructor
38 * @param sensorMap Map to store all the captured temperatures
39 */

40 public TemperatureCaptureHelper(Map <Long, TempMessage>sensorMap) {
41 this.sensorMap = sensorMap;
42 }
43
44 public void capture() {
45
46 // Connect to the Sentilla server
47 HostClient client = new HostClient();
48 try {
49 client.connect();
50 log.log(Level.INFO,
String.format("Connected to sensor gateway at %s,
capturing temperatures"
,
client.getHost()));
51 Receiver receiver =
ReceiverDriver.create(TempMessage.class);
52 while(true) {
53 receiver.setReceive()
.submit().block(MOTE_WAIT);
54 if (receiver.isDone()) {
55 TempMessage tmsg
= receiver.getData();
56 sensorMap
.put(tmsg.moteId, tmsg);
57 log.log(Level.INFO,
String
.format("Update from sensor id: %s, %.3f",
tmsg.moteId, tmsg.tempCelcius));
58 } else {
59 log.log(Level.INFO, "No update");
60 }
61 }
62 } catch (IOException ioExp) {
63 log.log(Level.SEVERE,
"Severe error, response will be dropped"
, ioExp);
64 } finally {
65 try {
66 if (client != null)
67 client.disconnect();
68 } catch (IOException ioExp) {
69 log.log(Level.SEVERE,
"Error while closing sensor connection", ioExp);
70 }
71 }
72 }
73 }
74
75 /**
76 * Collect the statistics from all the motes
77 * @param args Unused
78 */

79 public static void main(String[] args) throws Throwable {
80 log.log(Level.INFO, "Starting TemperatureService");
81 final TemperatureClient instance = new TemperatureClient();
82 try {
83 final Map <Long, TempMessage>temperatures
= new ConcurrentHashMap<Long, TempMessage>();
84 TemperatureCaptureHelper helper =
instance
.new TemperatureCaptureHelper(temperatures);
85 helper.capture();
86 } catch (Throwable throwbl) {
87 log.log(Level.SEVERE,
"Fatal error, no recover possible"
, throwbl);
88 throw throwbl;
89 }
90 }
91 }

Una vez resuelto esto puedo comenzar con la nueva aplicación. El código no está disponible en CVS, en algún momento colocaré todo para que se lo bajen. Mientras tanto les dejo esto para que se entretengan :)

Buscar en otros sitios:

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

Etiquetas: , , , ,

martes, septiembre 30, 2008

4 de la mañana, picazón de teclado: ¿Que hacer?

Mi cerebro se encuentra en fast forward, depurando y limpiando basura grabada en el subconciente durante el dia. El mejor optimizador que conozco. No me queda otra que dejar de leer Bloomberg.com y finance.google.com. Pero, y para no perder el tiempo, me decidí acomodar la creación de firmas digitales del programa del articulo anterior:

 <target name="keystore">
<genkey
alias="kodegeek-pricevolume"
storepass="kodegeek"
description="Generate a
digital certificate for this app"

keystore="${dist}/kodegeek.PriceVolumeCurve">

<dname>
<param name="CN"
value="kodegeek"/>

<param name="OU"
value="Jose Vicente Nunez Zuleta"/>

<param name="O"
value="kodegeek.com"/>

<param name="C"
value="US"/>

</dname>
</genkey>
</target>

<target
name=
"jar"
depends=
"build"
description=
"Pack the
project sources for distribution"
>


<manifest file="${jar.file.manifest}">
<section name="${ant.project.name}/">
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Sealed" value="true"/>
</section>
<attribute name="Main-Class"
value="com.kodegeek.blog.finance.wallstreet.PriceVolumeCurve"/>

</manifest>

<jar
jarfile=
"${jar.file}"
basedir=
"${build}"
description=
"build the jar file"
manifest=
"${jar.file.manifest}">

</jar>

<delete file="${jar.file.manifest}" quiet="true"/>

<copy todir="${dist}">
<fileset dir="${lib}">
<include name="**/*jfree*.jar"/>
<include name="**/*jcommon*.jar"/>
</fileset>
</copy>

<signjar
destDir=
"${dist}/signed"
alias="kodegeek-pricevolume"
keystore=
"${dist}/kodegeek.PriceVolumeCurve"
storepass="kodegeek"
preservelastmodified="true">

<path>
<fileset dir="${dist}" includes="**/*.jar" />
</path>
<flattenmapper />
</signjar>


</target>

Nada como escuchar Metallica con su "Death Magnetic", mientras se golpean las teclas freneticamente. Ah, y vuelvo a leer noticias de finanzas (que c****da).

Si quiere ver el resultado entonces aquí está el enlace para que corra el programa usando Webstart.

O como dirian Metallica: It's my Apocalypse!

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


Buscar en otros sitios:

Etiquetas: , , , ,

miércoles, septiembre 17, 2008

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:, , , , ,

Etiquetas: , , , , ,

viernes, septiembre 05, 2008

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:, , ,

Etiquetas: , , ,

jueves, septiembre 04, 2008

Comics: The Armageddon Chronicles

The Armageddon Chronicles es el trabajo del Venezolano Carlos Weiser . El trabajo es de muy buena calidad y en este momento está de tercero en la competencia de "The Comic Book Challenge"

Si te gustan las ilustraciones al estilo de Word Of Warcraft entonces te invito a que votes por él; Es interesante ver como el talento Venezolano compite en el exterior y seguro eso lo animará a producir mas trabajos de este tipo.

ACTUALIZACIÓN: Ganó Carlos, vean los detalles:

Congratulations to all our participants, from the voters to all the entrants to the Top 50 to the Finals, it has been an amazing ride this year full of wonderful and talented people. An extra congratulations to this year's winner, Carlos Weiser with THE ARMAGEDDON CHRONICLES. Look for his book in your local comic book store this Spring! And sign up for our newsletter to hear all about the Comic Book Challenge 2009!!!
Booyaaaa!

Buscar en otros sitios:

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

Etiquetas: , , , ,