Convirtiendo Bolivares a Bolivares Fuertes desde Java

El primer post del año y aún recuperandome de los abusos de Diciembre 31. Para ponermela fácil, voy a volver sobre mis pasos del año anrterior y voy a hablarles un poco más sobre la reconversión de Bolivares a Bolivares Fuertes. En este caso no voy a seguir rumiando sobre si es útil o no, sino más bien sobre como podemos hacer la conversión en este caso desde Java (Los detalles concretos sobre como implementar la solución en cualquier lenguaje estan en la página que habla sobre la reconversión).

Note lo siguiente:

  • Este algoritmo sólo sirve para hacer pagos ya que redondea a dos decimales. Cuando se convierte datos historicos se deben usar 3 para poder convertir de vuelta cantidades
  • No me hago responsable de ninguna manera sobre lo que este código puede hacer, viene con licencia GPL (aunque si tiene errores lo limpiaré con mucho gusto).

El código en Java, sn más preambulos:


1 package com.kodegeek.blog.finance.venezuela;
2
3 import java.math.BigDecimal;
4 import java.math.RoundingMode;
5 import java.text.DecimalFormat;
6 import java.text.NumberFormat;
7 import java.util.Locale;
8
9 /**
10 * Class that performs the conversion between "Bolivares"
and "Bolivares Fuertes" using proper rounding
11 * as defined on the following official document: <a
href="http://www.reconversionbcv.org.ve/files/pdf/aspectosnov07.pdf"
>Reconversion BCV</a>
12 * License: GPL
13 * @author josevnz@kodegeek.com
14 */

15 public final class BsF {
16 private static NumberFormat nForm;
17 static {
18 // Set the locale to Venezuela
19 Locale.setDefault(new Locale("es", "VE"));
20 nForm = new DecimalFormat("BsF #.00");
21 }
22
23 private static final BigDecimal FACTOR =
new
BigDecimal(Math.pow(10, 3));
24 private static final double PLACES =
(
double) Math.pow(10, 2);
25
26 public static double bsTobsF(double value) {
27 BigDecimal valScale = new BigDecimal(value);
28 return valScale.divide(FACTOR, 2,
RoundingMode
.HALF_UP).doubleValue();
29 }
30
31 public static double bsFtoBs(double value) {
32 BigDecimal valScale = new BigDecimal(value);
33 return valScale.multiply(FACTOR).doubleValue();
34 }
35
36 public static void main(String [] args) {
37 double value = Double.parseDouble(args[0]);
38 value = bsTobsF(value);
39 System.out.println(nForm.format(value));
40 }
41 }

Menos de 50 lineas de código, incluyendo comentarios y cosas inútiles, todo en menos de 10 minutos (creo que no tiene bugs pero tengo el derecho de equivocarme).

Por cierto, ¿ha jugado con el programa oficial de reconversión en línea? Es horroroso, ya que:

  • No te deja meter la cantidad directamente, en vez de eso tienes que pulsar TODOS los números en la calculadora
  • Te deja especificar Bolivares Fuertes (O bolivares) tanto en la fuente como el destino de la conversión (estupido). Un botón e selección simple soluciona el problema.
  • Está escrita en Flash (OK, no es un bug sino mal gusto 🙂 )

Si me animan quizas ponga una aplicación aqui en el blog, haganmelo saber si están interesados.

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

Blizzard adquiere a Activision, el nacimiento de un gigante: Activision Blizzard

Mientras espero a los resultados de la votación del SI / NO le comento sobre esto:

Blizzard y Activision se juntan (o mejor dicho, Blizzard se come a Activision y forma Activision Blizzarrd (Nasdaq ATVI); Si bien Activision fue investigada por SEC y salió bien, es una buena compañía y es buena noticia que una fuerzas con Blizzard ya que ambos son fabricantes de juegos de gran calidad (Blizzard es más estratégico que Activision pero ambos son interesantes).

A la hora de escribir este articulo, el precio del stock de ATVI era de $22.15 (ya Activision habia tenido varios Stock Split). Debido a esta noticia estoy seguro que el precio de ATVI va a subir (todos los split beneficiaron a la compañia ya que no fueron “reverse splits“), aunque OCC aún no tenga los términos en los cuales esta acción corporativa va a ocurrir.

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

Depurando el protocolo XML-RPC

Usando un libro (del cual les hablaré en otra ocasión) me encontré con este depurador del protocolo XML-RPC basado en PHP. Para probarlo, me puse a ver que tan amigables eran las siguientes implementaciones del protocolo Ping para Blogs:

  • To2Blogs: http://todosblogs.com:80/ping/xmlrpc/
  • VeneBlogs: http://www.veneblogs.com:80/ping/
  • Technorati: http://rpc.technorati.com/rpc/ping/
  • Blogger: http://rpc.weblogs.com/RPC2

Cada uno me dio una respuesta muy distinta cuando le pedí que me listara los métodos disponibles. Interesante herramienta, lastima que no la utilicé cuando estaba desarrollando PingBlog 🙂

Blogalaxia.com:xml-rpc, ping, debugger
Technorati.com:xml-rpc, ping, debugger

Break of Reality: Rock y Chello en Central Park

Break Of Reality
Break Of Realitty en acción

Ya hace mucho tiempo atrás les había hablado del sonido brutal y original del grupo Apocalyptica. Sin embargo y con el paso de los años este grupo se ha ido conviertiendo en algo más “mainframe”, tal cual y le pasó a Metallica.

Justamente este Sabado 6 de Julio Vero, Sebastian y Yo nos fuimos a Central Park a pasar el rato y allí nos encontramos con un grupo de Jovenes músicos tocando Chello, acompañados de timbales.

Pero su sonido no era clásico ni improvisado; Ritmos freneticos y dramaticos, como los de la Apocaliptica de antaño salian de sus instrumentos. Fué tan interesante la experiencia que me decidí a comprar un CD (yo nunca hago eso) y allí fué que nos enteramos del nombre de la banda: Break of Reality.

Ahora son un fanatico 🙂

De verdad muy bueno. Los dejo con un video en vivo y unas fotos.

Blogalaxia.com:“break of reality”, chello, cellist, percusion, rock
Technorati.com:“break of reality”, chello, cellist, percusion, rock

Apple Iphone is released: Photos from 5th avenue

Cult
The Cube never looked so beautiful for some

Today I took a break from my trading floor duties to take some pictures at the Apple store; I was expecting a big crowd and I was not disappointed.

T-0
T-0

It was really funny seeing several TV channels like Fox News and bloggers treating the fans) or customers I must say) as rock stars. There was a heavy police presence but unlike the Nintendo Wii launch here nobody fought to get an Iphone.

Line around FAO toy store in 5th avenue
Waiting in line to get one

What about me? I just took my pictures, smiled seeing all this frenzy around the “Jesus Phone” and got back to work for a couple of hours on several corporate actions that needed to be modeled and executed in our trading system 😀

Capturing the moment
15 minutes of fame

The rest of my photos on my flickr account.

My 15 minutes of fame: Meet Schmap New York Third Edition

NYC times square
Times Square

So it looks like one my of my Flickr Photos has been selected to show up on the website “Schmap New York“. The website looks pretty cool and it seem than other flickr users have been selected as well, with pictures of several famous spots in NYC.

————————————————————

:: Schmap New York Third Edition: Photo Inclusion

Hi Jose,

I am delighted to let you know that your submitted photo
has been selected for inclusion in the newly released third
edition of our Schmap New York Guide:

Times Square
http://www.schmap.com/newyork/home/p=5412/i=5412_7.jpg

If you like the guide and have a website, blog or personal
page, then please also check out our schmapplets –
customizable widgetized versions of our Schmap New York
Guide, complete with your published photo:

http://www.schmap.com/schmapplets/p=51035550755N01/c=SE2002737

Please enjoy the guide!

Best regards,

Luke Ritchie,
Managing Editor, Schmap Guides

Hurray 🙂

Trucos UNIX: Cuando un alias no es suficiente

A mi me encanta UNIX por su linea de comandos. Sin embargo también me da una pereza increible escribir algo tan largo como esto cada vez que quiero notificar a los directorios de blogs que mi página está actualizada:

/Users/josevnz/bin/ping_controller.sh veneblogs,weblogs,technorati,bitacoras.com,pingomatic kodegeek http://kodegeek.com

Asi que un alias cae como anillo al dedo:

alias pingall=’/Users/josevnz/bin/ping_controller.sh veneblogs,weblogs,technorati,bitacoras.com,pingomatic kodegeek http://kodegeek.com’

Para después escribir solamante “pingall“.

Sin embargo, que ocurre si por ejemplo quisiera pasarle el titulo del blog a ciertos directorios como todosblogs.com cada vez que hago el ping:

pingall “Este es otro post del fabuloso Kodegeek”

Nada, no se puede. Con un alias estoy jodido porque no soportan argumentos.

Pero no todo está perdido. Para eso simplemente ponemos una pequeña función (les muestro la sintaxis en Bash) que nos haga el favor (primero haga unlias ping para eliminar el viejo alias):

function pingall { /Users/josevnz/bin/ping_controller.sh veneblogs,weblogs,technorati,bitacoras.com,pingomatic kodegeek http://kodegeek.com $1 }

Y si quiere guardar sus cambios entonces pongalos en su ~/.profile, ~/.bashrc o equivalente.

Blogalaxia.com:alias, bash, function, unix
Technorati.com:alias, bash, function, unix

¿Como contar el espacio usado en un directorio usando Perl?

Una de esas tantas ociosidades que a la final resultan útiles si lo que se quiere es un programa que funcione igual bajo Windows, Linux o Solaris:


#!/usr/bin/perl
use File::Find;
use Getopt::Long;
use strict;

my $func;
my $unit;
my @dirs;
my %units = (
kb => [ 1024.0, "KB"],
mb => [ 1024.0* 1024.0, "MB"],
gb => [ 1024.0 * 1024.0 * 1024.0, "GB" ]
);

GetOptions("dirs=s" => \@dirs, "unit=s" => \$unit);
die "Define the directories to measure" if (scalar(@dirs) == 0);
$unit = "gb" if not defined $unit;
$unit = "gb" if not defined $units{$unit};

{
my $tsize = 0;
$func = sub {
my (
$dev,
$ino,
$mode,
$nlink,
$uid,
$gid,
$rdev,
$size,
$atime,
$mtime,
$ctime,
$blksize,
$blocks) = stat($File::Find::name);
if ( -f ($File::Find::name)) {
$tsize += $size;
}
return $tsize;
}
}

printf "Scanning directories: %s\n", join(',', @dirs);
foreach my $dir (@dirs) {
find({ wanted => $func, follow => 0 }, $dir);
}

printf "Total size of all combined directories: %.2f %s\n",
(&$func) / $units{$unit}[0], $units{$unit}[1];

La salida de ejemplo seria la siguiente:


auyan:~/src/perl/blog josevnz$ ./du.pl -dir /Users/josevnz -dir /tmp -unit pp
Scanning directories: /Users/josevnz,/tmp
Total size of all combined directories: 31.05 GB

Una belleza por lo simple 😀

Blogalaxia.com:du, perl
Technorati.com:du, perl

Instalación de Sybase ASE Express en Fedora Core 6: ¿Es posible?

Existen muchas razones por las cuales usted quizas deba instalar Sybase ASE Express (una versión escalada de Sybase 15), como son requerimientos de un cliente (en Wall Street todo el mundo la utiliza aunque han perdido terreno contra DB2 de IBM) o porque usted piensa que es un buen servidor. Yo tengo las mias, así que decidí montarla bajo Fedora Core 6.

Sybase provee instrucciones precisas sobre como instalar su servidor bajo Linux. Lo que yo quiero mostrar aqui es como usted puede hacer una instalación que consuma poca memoria en una máquina en la cual solamente se hará desarrollo. Asi que aqui vamos:

A estas alturas me imagino que usted ya se bajó el código del instalador, sino detengase aquí y hagalo. También tenga a la mano el DVD de Fedora Core 6 para instalar ciertos componentes adicionales.

Instale las librerías de compatiblidad: Necesitamos montar las librerias de compatibilidad de glibc para Sybase y Java:

compat-libstdc++-33
compat-libstdc++-296

Y lo hacemos así (los RPM los puede conseguir en el DVD de Fedora Core 6):

[root@localhost ~]# rpm -ihv compat-lib*.rpm
warning: compat-libgcc-296-2.96-138.i386.rpm: Header V3 DSA signature: NOKEY, key ID 4f2a6fd2
Preparing… ########################################### [100%]
1:compat-libstdc++-33 ########################################### [ 33%]
2:compat-libgcc-296 ########################################### [ 67%]
3:compat-libstdc++-296 ########################################### [100%]
[root@localhost ~]#

Cree un usuario dedicado para Sybase: Lo primero que hacemos es crear una cuenta nueva para la base de datos:

[root@localhost ~]# useradd -c “Sybase user” -b /opt/sybase -m -s “/bin/bash” sybase

Incremente los límites de memoria compartida: Fedora Core 6 tiene un limite bajo para la memoria compartida, así que lo cambiamos en el archivo /etc/sysctl.conf (kernel.shmmax = 67108864). Puede escribir: sysctl -w kernel.shmmax = 67108864

Desempaquete las fuentes:

root@localhost sybase]# cp /root/ase1500_xe_linux.tgz /home/sybase/
[root@localhost sybase]# su – sybase
[sybase@localhost ~]$ tar -xzvf ase1500_xe_linux.tgz

Modifique el ~/.bashrc del usuario “sybase”: Agregando lo siguiente:

export LD_POINTER_GUARD=0

Por cierto, este tip lo tomé del excelente sitio web de Michael Peppler, autor del módulo de Perl DBD::Sybase y Sybperl.

Asegurese que X-Window funciona o use el modo del consola en el instalador
: Este paso requiere que usted puede abrir correctamente aplicaciones X en el servidor remoto; En el caso de una conexión desde una máquina con Linux eso ocurre automaticamente si se conecta con ssh (ssh -X. Sin embargo desde Mac OS X le recomiendo que instale el paquete X11 al menos que quiera usar la instalación de modo texto y arranque el terminal X desde allí). Y si eso no funciona entonces corralo con la opción ‘-c’ como se muestra aqui:

[sybase@localhost ~]$ ./setup -console
InstallShield Wizard

Initializing InstallShield Wizard…

Searching for Java(tm) Virtual Machine…
……..
Running InstallShield Wizard…

——————————————————————————-
Welcome to the InstallShield Wizard for Sybase Adaptive Server Enterprise
version 15.0 Update #1 with Encrypted Columns Option

The InstallShield Wizard will install Sybase Adaptive Server Enterprise on your
computer. Shut down all Sybase products, then click Next to begin installation.

The installer will now configure new servers with the following values. Please
click Next to proceed with the server configurations.

Adaptive Server

Adaptive Server Name LOCALHOST
Port Number 5000
Page Size 2k
Error Log /opt/sybase/ASE-15_0/install/LOCALHOST.log
Master Device /opt/sybase/data/master.dat
Master Device Size (MB) 30
Master Database Size (MB) 13
System Procedure Device /opt/sybase/data/sysprocs.dat
System Procedure Device Size (MB) 120
System Procedure Database Size (MB) 120
System Device /opt/sybase/data/sybsysdb.dat
System Device Size (MB) 3
System Database Size (MB) 3

Backup Server

Backup Server Name LOCALHOST_BS
Port Number 5001
Error Log /opt/sybase/ASE-15_0/install/LOCALHOST_BS.log

Monitor Server

Monitor Server Name LOCALHOST_MS
Port Number 5002
Error Log /opt/sybase/ASE-15_0/install/LOCALHOST_MS.log

XP Server

XP Server Name LOCALHOST_XP
Port Number 5003
Error Log /opt/sybase/ASE-15_0/install/LOCALHOST_XP.log

Unified Agent – Self Discovery Service Adaptor

Adaptor UDP

Unified Agent – Security Login Modules

CSI.loginModule.1.provider com.sybase.ua.services.security.simple.SimpleLoginModule
CSI.loginModule.1.controlFlag sufficient
CSI.loginModule.1.options.moduleName Simple Login Module
CSI.loginModule.1.options.username uafadmin
CSI.loginModule.1.options.password ******
CSI.loginModule.1.options.roles uaAgentAdmin,uaPluginAdmin
CSI.loginModule.1.options.encrypted false

CSI.loginModule.2.provider com.sybase.ua.services.security.ase.ASELoginModule
CSI.loginModule.2.controlFlag sufficient
CSI.loginModule.2.options.moduleName ASE Login Module

Siga adelante con las instrucciones que le muestra el instalador. Sin embargo si lo que usted quiere es solamente jugar un poco con SQL y no esta muy interesado en el desempeño, entonces no cree servidores XP (extended stored procedures), Historical (guardar historia de desempeño) ni el Monitor Server (para analisis de desempeño). El servidor de backup también es opcional sin embargo estoy seguro que el algún momento usted querra respaldar sus datos :).

Verifique que se puede conectar al servidor de base de datos (y cambiele el password lo antes posible, no lo muestro aquí):

isql –Usa –P -Slocalhost

Automatize el arranque y caida de Sybase ASE: El último paso es asegurarnos que podemos arrancar Sybase cada vez que el servidor es iniciado. Para ello les dejo un script en Bash que escribí con ese proposito, basandome en el original que venia con Sybase 11.9 (una versión para Linux ampliamente utilizada hace unos años atrás):

# sybase: Starts / stops the available Servers.
#
# chkconfig: 345 85 15
#
# description: This script will browse through the /opt/sybase/install
# directory and launch all servers configured from this location.
#
# Author: Jose V Nunez (josevnz@kodegeek.com)
# Source function library.
. /etc/rc.d/init.d/functions
# Load the correct Sybase env variables
. /opt/sybase/SYBASE.sh
if [ “$?” -ne “0” ]; then
exit $?
fi
if [ -n “${SYBASE}” -a -d “${SYBASE}” ]; then
PATH=”${SYBASE}/bin:${SYBASE}/install:${PATH}”
export SYBASE PATH
# See how we were called.
case “$1” in
start)
echo -n “Starting Sybase ASE … “
( cd ${SYBASE}/${SYBASE_ASE}/install ; \
unset LANG ; unset LC_ALL ; \
for run_server in RUN_* ; do \
su -c “startserver -f ${run_server}” sybase > /dev/null 2>&1 ; \
echo -n “${run_server} ” ; \
done )
echo
touch /var/lock/subsys/sybase
;;
stop)
echo -n “Shuting down Sybase ASE configured servers: “
killproc dataserver
killproc backupserver
killproc monserver
echo
;;
status)
showserver
;;
restart)
$0 stop
$0 start
;;
*)
echo “Usage: sybase {start|stop|status|restart}”
exit 1
esac
fi
exit 0

Grabe el archivo como ‘/etc/init.d/sybase’ y después escriba lo siguiente:

[root@localhost ~]# chkconfig sybase
[root@localhost ~]# chkconfig –level 3 sybase on

Esta instalación utiliza los valores por omisión los cuales son más que suficientes para comenzar, además de que son conservadores en el uso de recursos. Ya estaré jugando con Sybase bajo Linux en los días que vienen, así que esten pendientes por este blog.

Si aún no se ha dado cuenta este no es un tutorial de como instalar Sybase bajo Linux o como optimizarlo, así que le recomiendo que utilice los enlaces mencionados anteriormente para aprender más.

Blogalaxia.com:sybase ase express, sybase, linux, fedora core, fedora core 6
Technorati.com:sybase ase express, sybase, linux, fedora core, fedora core 6

Opinión de comic: The 9/11 Report, A graphic Adaptation

9/11 Report
5 años del 11 de Septiembre, ahora en comics

Este viernes 8 de Septiembre me compré un comic muy particular: “The 9/11 Report: A graphic Adaptation“, de Sid Jackson y Ernie Colón. Es particular poque muestra los mismos contenidos del reporte de Septiembre 11 que se puede comprar o bajar por Internet, el cual entre otras cosas trató de explicar (además de proponer medidas para evitar que algo similar ocurriera otra vez) lo sucedido ese fatidico día hace ya 5 años, pero de manera gráfica.

Según sus autores, la idea es ampliar el espectro de personas que puedan leer y entender el reporte, sin importar su edad o nivel academico. Según sus autores este podría ser el comienzo de una nueva era en como cierta información de valor historico es difundida de ahora en adelante a las futuras generaciones.

El comic no es sensacionalista, de hecho ofrece una forma sencilla de explicar lo ocurrido y las fallas de logistica del gobierno de Bush y Clinton en la prevención de este hecho. Tampoco es el unico escrito de este tipo y estando tan cerca de la mencionada fecha ya hemos visto al menos dos peliculas, varios libros e inumerables documentales.

Aún recuerdo claramente ese día; Yo estaba aún en el apartamento en Caracas y la compañia con la que trabajaría eventualmente en los Estados Unidos aún estaba procesando mi visa (el día anterior yo ya había tenido una segunda entrevista telefónica), cuando Veronica me llamó por telefono:

– Pon Venevisión o CNN, rápido!
– ¿Porqué? ¿que pasó?
– Un avión se estrelló en el World Trade Center y el edificio está en llamas

Y justo en ese momento, cuando estaban enfocando las dos torres se ve que un avión se estrella contra la segunda. Yo le pregunte a Veronica que si lo habia visto, si la escena era en vivo y ella asombrada me dijo que si. En ese momento me pasaron varias cosas por la cabeza, ¿como era posible que dos aviones se estrellaran contra los edificios?, ¿como estaban mis amigos que vivian en relativamente cerca de allí?, y varias otras cosas más…

No todo el mundo piensa que este lamentable incidente fué el resultado de la mente retorcida de un grupo de fundamentalistas Islamicos. Por ejemplo el humorista Carlos Sicilia se dedicó a traducir una serie de videos en los cuales se sostiene que fué el mismisimo gobierno Americano quien derribó los edificios por medio de explosiones controladas, mientras que el ataque al pentagono fué llevado a cabo usando un misil guiado. Si bien los argumentos del señor David Griffin son provocadores (no Carlos Sicilia quien solamente se limitó a ponerle subtitulos a los videos y un enlace a su sitio web), estos no invitan a pensar que son solamente especulaciones por diversas razones, entre ellas lo increiblemente dificil que debe ser enmascarar una operación tan grande de detonación controlada la cual seguro requeriria montones de cables y aparatos, personal entrenado (que alguien seguro habría visto alrededor del sitio) y sobre todo las complicaciones de instalación de los famosos explosivos dentro de los edificios.

Después de ver los innumerables videos y los aún más numersos reportes de quienes estuvieron dentro de las torres llevan a pesar que la opción de las explosiones controladas es demasiado complicada como para ser factible. Sin embargo siempre habrán conspiradores dispuestos a llamar la atención o a demostrar lo contrario (como aquellos que aún sostienen que la caminata espacial en la luna fué un fraude).

Creo que todas las personas sensatas esperan que algo así no se repita en Los Estados Unidos ni en ningún lugar del mundo (¿alguien recuerda los atentados terroristas en Madrid, India y Londres?. El terrorismo es el arma de los cobardes y de quienes no les importa lograr un objetivo sin importar los medios.

Yo mientras tanto continuare leyendo el comic, pensando que triste es vivir en un mundo en donde hay gente capaz de dar la vida para quitarsela a otros.

Buscar en Technorati: ,
Buscar en Blogalaxia: ,