ZeruGiran


31
ene 12

Tipado estático VS Tipado dinámico (2 de 2)

No Gravatar

NOTA: Este post es la continuacion de este otro.

Entonces estábamos con las diferencias entre Tipado estatico y Tipado dinámico.

  • Rapidez de compilación. Los interpretes y compiladores de lenguajes con tipado dinamico, pueden obviar la pasada de chequeo de tipos, por lo que son mas rápidos cuando se les pide que generen el ejecutable o que comiencen a correr si son interpretados. En contra parte los lenguajes con Tipado estatico, tardan mucho mas en compilar. Esta rapidez es especialmente útil cuando debemos hacer cambios y correr toda la aplicación de nuevo para poder ver si los cambios son correctos. Debemos admitir  (aun que personalmente intento no hacerlo nunca) que a veces hay que hacer ciertas cosas por prueba y error.
  • Optimización de código. Los compiladores de lenguajes de Tipado estático, al compilar pueden hacer mejor las optimizaciones creando código maquina o bytecode mas adecuado a la plataforma o maquina virtual en la que van a correr, ya que conocen desde el principio el tipo y tamaño de los datos. Esto es muy importante para ciertas aplicaciones que requieren velocidad en ejecución.
  • Velocidad de implementación. Quise dejar este punto al final porque es en realidad una combinación de algunos de los puntos anteriores. El hecho de que en los lenguajes de Tipado dinámico no sea necesario especificar los tipos ahorra bastante código, aunque si no eres cuidadoso puedes cometer errores de tipado que no saldrán hasta que corras la aplicación. Es por eso que algunas personas se facilitan la vida utilizando la Notación húngara que no es mas que agregar un prefijo a las variables que declaremos, para indicar el tipo, por ejemplo iEdad o sNombre para un entero y una cadena respectivamente. Lo cual es una tontería, ya que al final si estamos declarando tipos, que era lo que no queríamos desde el principio. En los lenguajes Tipados estaticamente la Notaciónhúngara tiene aun menos sentido, ya que en los entornos actuales basta con poner el cursor sobre una variable, para que aparezca un ToolTip que nos dice el tipo de la variable. Luego hay que tener en cuenta el completado de código del que ya se hablo, que ayuda muchísimo a acelerar la programación. La rapidez de compilación te ayudara en proyectos grandes acelerando el ciclo editar-compilar-probar, en los pequeños da igual. Aunque si haces pruebas unitarias para los distintos módulos de tu aplicación, no sera necesario compilar toda la aplicación para depurar la aplicación.

Conclusiones: Mi opinión es que:

  • Si te interesa la velocidad de ejecución, debes escocer un Lenguaje de Tipado estatico sin pensarlo.
  • Si conoces un lenguaje de Tipado dinámico y las librerías o frameworks de este, a la perfección y por ello no necesitas el completado de código, sigue usándolo.
  • Si es un proyecto grande, en donde participan mas de dos o tres programadores, escoge un lenguaje de Tipado estatico. Por el contrario si es un proyecto pequeño escoje el Tipado dinamico.

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

10
ene 12

¿Como formatear un numero con comas en C++?

No Gravatar

Tenia pensado escribir sobre lo que estoy haciendo, pero hoy no tengo cabeza para eso, así que me he puesto en modo automático y les traigo un poco de código.

Problema: Convertir un numero a cadena, insertando comas en cada millar y truncando hasta las decimales.

C++ es un lenguaje muy poderoso, pero a veces cuando se trata de hacer cosas que son muy sencillas en otros lenguajes C++ no hace mas que resistirse. Claro que podríamos ocupar una librería que nos resuelva las cosas, siempre cuidando que sea multiplataforma y que sea opensource y de preferencia que ya este compilada, por ejemplo Boost, la cual recomiendo ampliamente. Pero no parece ser buena idea ocupar una librería para algo que inicialmente parece sencillo.

Entonces te pones a escribir código …

#include
#include 
using namespace std;
 
string ponleComas(double Numero)
{
	stringstream flujo;
	flujo << fixed << Numero;
	string s = flujo.str();
 
	string ns;
		if (s.find(".") != string::npos) {
		ns = s.substr(s.find("."), 3);
		s = s.substr(0, s.find("."));
	}
 
	int c = 0;
	for (int i=s.length()-1; i>=0; i--) {
		if (c % 3 == 0 && c != 0) {
			ns = "," + ns;
		}
		c++;
		ns = s[i] + ns;
	}
	return ns;
}

Listo, se usa así:

	double x = 950123.8384;
	double y = 83838347.123;
	double z = 45027456475345.56345;
 
	cout << ponleComas (x) << endl;
	cout << ponleComas (y) << endl;
	cout << ponleComas (z) << endl;

ESPERA!!! , tranquilo, no copies código aun. ¿Por que hacernos la vida fácil? Aquí va la segunda versión de este código:

#include 
#include 
#include 
class coma_numpunct : public std::numpunct
{
	protected:
	virtual char do_thousands_sep() const { return ','; }
	virtual std::string do_grouping() const { return "\03"; }
};
 
string ponleComas2 (double Numero)
{
	locale coma_locale(locale(), new coma_numpunct());
	stringstream flujo;
	flujo.imbue(coma_locale);
	flujo << setprecision(2) << Numero;
	string s = flujo.str();
	return s;
}

Mira que bonito código !! se ve bien PRO … y ademas funciona :D

¿Y como funciona? Pues lo primero que vemos es la clase coma_numpunct la cual sobre escribe algunos metodos de la clase numpunct, si juegas un poco puedes cambiar el caracter de separacion y el numero de caracteres que van entre una coma y la siguiente.

Luego, en la función ponleComas2, instanciamos un objeto de tipo locale y usamos en el constructor una instancia de la clase coma_numpunct que habiamos creado anteriormente.

Los objetos locale definen varias características de la forma en que se presentan los datos, con respecto a la cultura. Por ejemplo en algunos países se usa el punto en lugar de la coma para separar las decimales, o en las fechas se pone el mes/dia/año en lugar de dia/mes/año.

Creamos un objeto de tipo stringstream, que nos sirve como una especie de buffer, en el cual podemos imprimir cosas como si fuera cout, pero no se imprimiran en pantalla.

Ahora viene la impresion del numero, y vemos que aparece un setprecision(2) que es muy obvio y ademas un fixed que evita que se use la notacion cientifica, ya sabes 9.5e+05 en lugar de 950,123.83.

Finalmente usamos el método str() para convertir el stringstream a string y retornamos el valor.

Seria muy interesante medir tiempos, para ver cual de las dos implementaciones funciona mejor, pero eso ya es de verdad no tener nada que hacer :P . Espero que el código les sirva. Si conocen otra forma de hacerlo póngalo en los comentarios, sera interesante darle un vistazo.

 

 

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

4
jul 10

VirtualBox en Ubuntu Server

No Gravatar

A veces nos hace falta un servidor extra, y ya no hay hardware para levantarlo, una solución es usar una máquina virtual, una de las mas usadas y que además es gratuita, es VirtualBox, en realidad es muy fácil de utilizar, tiene una intuitiva interface gráfica. El problema consiste en que no tenemos instaladas las X en el servidor ni intenciones de hacerlo, seria un desperdicio.  Aquí lo vamos a hacer a puro comando limpio desde la consola de comandos.

Comencemos.

  • Tenemos un servidor con Ubuntu Server 8.04 LTS (“Hardy Heron”)
  • Y necesitamos una imagen, un archivo .vdi con el sistema operativo que queremos virtualizar. ¿De donde lo sacamos? pues eso ya queda fuera del alcance de este post.

Entramos a nuestro servidor con ssh o con putty, todo mundo sabe como.

ssh miservidor.com

1.- Lo primero es instalar la versión 3.x de VirtualBox. Por default Ubuntu 8.04 tiene una mas vieja en los repositorios, por lo que no la usaremos. Hay que descargarla de:

http://www.virtualbox.org/wiki/Linux_Downloads

Mientras se descarga podemos instalar los linux-headers que no son mas que parte del código fuente del núcleo o kernel de Linux. Los necesitamos porque Virtualbox usa un drive para compartir el Hardware que debe corresponder con la versión del Kernel. Así que la mejor forma de que corresponda es compilarlo directamente en tu máquina, no te preocupes lo hará Virtualbox el solo y si no lo hace lo obligaremos con una linea de comandos, pero eso lo veremos después, ale a instalar los linux-headers por que si no nos aparecerá el error Compilation of the kernel module FAILED!

Primero hay que saber que versión del kernel tenemos con

uname -r

En nuestro caso tenemos 2.6.24-27-server y entonces instalamos

sudo apt-get install linux-headers-2.6.24-27*
hay que esperar un rato porque son muchos archivos, notese el * al final de la linea.

ahh lo olvidaba para compilar necesitamos también instalar make y gcc

sudo apt-get install gcc
sudo apt-get install make

Listo, no olvidemos que estábamos descargando VirtualBox también, una vez que tenemos el archivo vamos a instalarlo con:

sudo dpkg -i virtualbox-3.2_3.2.6-63112~Ubuntu~hardy_amd64.deb

dpkg no verifica si existen o no las dependencias necesarias, asi que probablemente algunas este rotas. Para arreglarlo usamos el comando:

sudo apt-get install -f

este comando busca todas las dependencias rotas e intenta arreglarlas.

OK ya tenemos todo lo necesario.

2.- Ahora hay que crear un nuevo usuario en nuestro servidor, ni se te ocurra crear una máquina virtual y luego ejecutarla como root.

sudo adduser vbox

Además lo agregamos al grupo de Virtualbox.

sudo usermod -a -G vboxusers vbox

Tenemos que salir del servidor y entrar de nuevo pero esta vez con nuestros nuevo usuario.

ssh vbox@miservidor.com

Copiamos nuestro archivo .vdi en algún lugar, por ejemplo en /home/vbox puedes usar scp o ftp para hacerlo o si tienes acceso físico mejor, porque los .vdi son archivos muy muy grandes.

3.- Ahora vamos a usar los comandos VBoxManage y VBoxHeadless. Es recomendable leer un poco de documentación al respecto, porque tarde o temprano lo vamos a necesitar.

Primero creamos una nueva Máquina virtual

VBoxManage createvm -name MiVentanucos2003 -register

Luego ponemos un poco mas de memoria ram porque la que pone por default es muy poca.

VBoxManage modifyvm MiVentanucos2003 --memory 512

Tenemos que crear un disco duro, pero hay que crear un dispositivo IDE aunque también puede ser SATA.

VBoxManage storagectl MiVentanucos2003 --name "IDE Controller"
--add ide

Y luego montamos nuestro archivo .vdi para que la máquina virtual lo pueda ver.

VBoxManage storageattach w2003 --storagectl "IDE Controller"
--port 0 --device 0 --type hdd
--medium /home/vbox/Windows_2003_Server.vdi

Y listo.

4.- Solo queda arrancar la máquina. Para ello usamos el comando.

VBoxHeadless -startvm MiVentanucos2003 -p 3389

Este comando no solo arranca la máquina, sino que también abre un servicio de Escritorio remoto, con el que podemos ver que esta pasando.

para ello desde nuestra máquina, podemos entrar con la “Conexión a escritorio remoto” de Windows o con

rdesktop miservidor.com:3389

desde Linux.

Si todo salio bien tenemos un nuevo servidor corriendo :) ten mucho cuidado aunque es un servidor virtual debemos cuidarlo como cualquier otro servidor, instalar parches, cerrar servicios, cambiar contraseñas etc.

Nuestro servidor aun no tiene red, para ello hay que seguir usando el comando VBoxManage para seguir agregando hardware a nuestra máquina virtual. Lo mas fácil es hacer

VBoxManage modifyvm MiVentanucos2003 -nic1 nat

Pero una red NAT no es lo mas recomendable, como este post ya se alargo demasiado, hasta aquí lo vamos a dejar.

Twitter: @ZeruGiran

Compartir y Disfrutar

  • Facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon

Qbit Mexhico Blog is using WP-Gravatar