jueves, 22 de octubre de 2009

Cuál es la instalación de paneles solares más sustentable?

Desde hace un tiempo vengo trabajando en esta idea. Conseguí una lista de los proveedores en Argentina (http://www.energiaslimpias.org/categoria/informes-energia-solar/) y me contacté con todos para consultar por una instalación para hacer andar una notebook (80w) durante 8hs x día.

La típica instalación está formada por los paneles solares, regulador (para no sobre cargar la batería), batería (para acumular la energía y usarla cuando no hay sol), inversor (para convertir los 12v de continua de la bateria a 220v de alterna). Encuentro algunas desventajas a este tipos de instalación:
  • Son costosas => difícil que otros quieran implementarlas también.
  • Podrían ser mas eficientes, ya que se pierde energía en el regulador, inversor y cargador de notebook.
  • Requiere varios paneles solares (los paneles se colocan orientados al norte, a 50 grados aproximadamente).
  • Plantean el problema de qué hacer con la batería cuando finaliza la vida útil de esta.
Por lo que se me ocurren algunas variaciones sobre este esquema básico:
  • Usar un único panel solar y orientarlo al sol según la hora. Tendría que buscar la manera de automatizar esto... O podría combinarlo con la técnica pomodoro y aprovechar los breaks para subir a la terraza (me levanto de la silla) y acomodarlo a mano.
  • No usar un inversor y trabajar siempre en corriente continua. Necesitaría un cargador para la notebook que a partir de 12v genere los 19.5 que necesita (encontré uno).
  • Si en lugar de usar batería para acumular la energía, utilizara directamente la batería de la notebook? Como podría hacer para no afectar la vida útil de esta? Luego tendría que ver que hacer con la energía que no uso. Podría volcarla a la red, como hacen en otros paises, o regalarla a mis vecinos.
  • Sirve el regulador para que los paneles generen 12 v constante?
Algo interesante de no usar baterías, es que además de disminuir el costo y contaminar menos, abre nuevas posibilidades que requieren pensar de manera colaborativa respecto a la comunidad en donde vivimos.

saludos!

domingo, 18 de octubre de 2009

Parser para un simple DSL

Dado que estoy empezando a usar un DSL, me gustaría compartir mi experiencia, por si otros deciden incursionar en el mundo de los DSL. Voy a aprovechar para contar que me lleva a usar un DSL.

Uno de los problemas de mi dominio es resolver el binding de los filtros, pertenecientes a mi domain model, en una consulta MDX. Para eso adopté la siguiente sintaxis:

SELECT {[Measures].[SaleAmount], [Measures].[Profit]} ON COLUMNS,
NON EMPTY {[Brand].[All].Children} on rows
FROM [Sales]
WHERE (${category}, ${product}, ${year})

donde si category=A, product=B, y year no tiene valor, la query debería valer:

SELECT {[Measures].[SaleAmount], [Measures].[Profit]} ON COLUMNS,
NON EMPTY {[Brand].[All].Children} on rows
FROM [Sales]
WHERE (A, B)

MDX es un DSL usado para resolver consultas multidimensionales. Lo que estoy haciendo es embebiendo mi DSL adentro de otro DSL (por ahora es tan simple, que no merece llamarse DSL).

El primer paso para usar mi DSL es parsear los ${...} para extraer la expresión del mismo. Seguramente hay muchas formas de parsear los ${...}. Yo decidí usar un tokenizer basado en palabras, que devuelve el texto hasta encontrar el token buscado. Esta es la interface de WordTokenizer:

la implementación basada en la clase String:

y las pruebas unitarias (aguante TDD):

Es simple extraer es las expresiones de mi DSL usando el word tokenizer:

Con esto extraigo mi DSL de la consulta MDX. Este por ahora es simple, pero hay casos que tienen un poco más de complejidad.

Por ejemplo, si un filtro no tiene valor, tengo que aplicar el valor default:

SELECT {[Measures].[SaleAmount], [Measures].[Profit]} ON COLUMNS,
NON EMPTY {[Brand].[All].Children} on rows
FROM [Sales]
WHERE ${year.default([Time].[Year].[2009])}

O distintos filtros que forman una jerarquia (mes, trimestre, año) y solo debe reemplazarse un valor en la consulta:

SELECT {[Measures].[SaleAmount], [Measures].[Profit]} ON COLUMNS,
NON EMPTY {[Brand].[All].Children} on rows
FROM [Sales]
WHERE ${month.parent(quater).parent(year)}

O una combinación de jerarquías y valores default. Para resolver estos y otros casos, usé lo que se llama fluent interface, que permite fácilmente armar DSL para un problema de dominio (es fácil de leer y simple de programar).

Para parsearlo uso un simple StringTokenizer:

La implementación es bastante simple. Seguramente hay casos que no se cubren, pero sobre esta base es fácil agregar nuevos métodos al DSL.

Hay otros conceptos interesantes asociados a un DSL, como:

saludos!

martes, 6 de octubre de 2009

Problema paneles solares y mapa mental

Gracias a http://www.softwarebyrob.com/2009/10/06/micropreneur-spotlight-online-mind-mapping-software-thoughtmuse/ encontré una herramienta en la web para armar mapas mentales. Me pareció muy buena para organizar las distintas aristas de un problema. Asi que aproveché para hacer el ejercicio de alimentar una notebook con paneles solares

Aportes son bienvenidos!

domingo, 4 de octubre de 2009

Expandir disco guest ubuntu, host vista (vmware player)

Hoy me pasó que la virtual con ubuntu se quedó sin espacio en disco (la imagen original tiene 8 GB). Mi sistema operativo host es windows vista y la tengo una virtual machine con Ubuntu Desktop 9.04 (con vmware player).

Estos son los pasos para agrandar el tamaño del disco a 100 GB.

1. Convertir el disco a 2GB split not pre-allocated usando vmware converter. Se puede bajar de la página de vmware.

2. Crear con easyvmx una imagen ubuntu de 100GB. De paso aproveché para configurar 2 procesadores:
http://www.easyvmx.com/cgi-bin/create-easyvmx.cgi?filetime=2009-10-04-23:08:06&vmname=Ubuntu+9.04+Desktop&guestOS=ubuntu&memory=2048&numvcpus=2&vmdesc=UbuntuDesktop&vmlname=UbuntuDesktop&vmurl=http://www.kudewe.com/&hwaddr0=00:0c:29:46:9c:10&conntype0=nat&devtype0=vlance&hwaddr1=00:0c:29:51:cf:6c&conntype1=nat&devtype1=vlance&floppyfile=autodetect&isodev=autodetect&ide1_1file=.iso&disk0_0file=100Gb&disk0_1file=4800Mb&sound=yes&soundcard=es1371&usb=yes&usbconnect=FALSE&com1=yes&com1_flow=TRUE&com2_flow=TRUE&lpt1=yes&lpt1_bidir=TRUE

3. Copiar de la maquina virtual original los archivos de disco Ubuntu_9_04_Desktop-s001.vmdk, Ubuntu_9_04_Desktop-s002.vmdk, Ubuntu_9_04_Desktop-s003.vmdk, Ubuntu_9_04_Desktop-s004.vmdk. No copiar el Ubuntu_9_04_Desktop-s005.vmdk (último archivo)

4. Bajar gparted.iso. Configurar la vm para que vea la iso como cd rom

5. Bootear desde cd, para eso presionar esc cuando bootea vmware. También se puede modificar grub de ubuntu para bootear de cd: http://www.ubuntu-es.org/?q=node/65741

6 Una vez que arranca gparted, es una buena oportunidad para redimensionar el tamaño de la partición swap (originalmente tiene 400 Mb).
https://help.ubuntu.com/community/SwapFaq

Después de estos pasos quedó todo andando sin problemas (milagro!)