Matemáticas, física y animación con Canvas html5 – parte 1

canvas
Canvas es una de las cosas que encuentro más interesantes y entretenidas de HTML5, con ella podemos realizar desde gráficos, juegos y un sin fín de cosas sin necesidad de utitilizar ningún plugin en nuestro navegador. Para este ejemplo haremos una pelota (un punto grande) que rebote en contra una pared (caja).
Adjuntaré la librería de Modernizr para garantizar la compatividad en todos los navegadores. Agregando entre las etiquetas head el siguiente código.
<script src="http://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.1/modernizr.min.js"></script>

Comenzaré este post escribiendo todo el código para este ejemplo y luego iremos explicando paso a paso lo que tenemos que hacer. Al final del post está el canvas funcionando.
Pegamos el siguiente código en nuestro head entre las etiquetas script del documento html.
[javascript]
window.addEventListener(‘load’, eventWindowLoaded, false);
function eventWindowLoaded(){
canvasAppPartOne();
}
function canvasSupport(){
return Modernizr.canvas;
}
function canvasAppPartOne(){
if(!canvasSupport()){
return;
}

function drawScreen(){
context.fillStyle = ‘#EEEEEE’;
context.fillRect(0, 0, theCanvas.width, theCanvas.height);
context.strokeStyle = ‘#000000’;
context.strokeRect(1, 1, theCanvas.width-2, theCanvas.height-2);
ball.x += xunits;
ball.y += yunits;
if(ball.x+15 > theCanvas.width || ball.x < 15){
angle = 180 – angle;
updateBall();
}else if(ball.y+15 > theCanvas.height || ball.y < 15){
angle = 360 – angle;
updateBall();
}
context.fillStyle = ‘#000000’;
context.beginPath();
context.arc(ball.x, ball.y, 15, 0, Math.PI*2, true);
context.closePath();
context.fill();
}
function updateBall(){
radians = angle * Math.PI/ 180;
xunits = Math.cos(radians) * speed;
yunits = Math.sin(radians) * speed;
}

var speed = 10;
var angle = 35;
var radians = 0;
var p1 = {x:20,y:20};
var xunits = 0;
var yunits = 0;
var ball = {x:p1.x, y:p1.y};
updateBall();

theCanvas = document.getElementById(‘canvasOne’);
context = theCanvas.getContext(‘2d’);
setInterval(drawScreen, 33);
}
[/javascript]

Luego entre las etiquetas body de nuestro html colocamos el contenedor de nuestro canvas.

<canvas id="canvasOne" width="600" height="300">
  Please update you browser!
</canvas>

Ahora a explicar el código.
Lo primero que hacemos es cargar todo nuestro script en la función load de javascript, para que cuando se cargue la página también lo haga nuestro script.
[javascript]
window.addEventListener(‘load’, eventWindowLoaded, false);
function eventWindowLoaded(){
canvasAppPartOne();
}
[/javascript]

Definimos las variables iniciales de nuestro script. Usaremos la variable speed para determinar la velocidad inicial de la pelota, angle para el ángulo inicial con el cuál se moverá la pelota, radians porque nuestra pelota se moverá en forma de vector con dirección y sentido, y utilizaremos radiales para transformar desde el ángulo, ya que será más legible para nosotros, p1 es la posición inicial de la pelota en la caja, xunits y yunits contendrán la suma que debe aplicarse a la posición de nuestra pelota mientras rebote por la caja, y finalmente ball que será nuestra pelota.
[javascript]
var speed = 10;
var angle = 35;
var radians = 0;
var p1 = {x:20,y:20};
var xunits = 0;
var yunits = 0;
var ball = {x:p1.x, y:p1.y};
[/javascript]

Luego referenciamos el elemento DOM en nuestro html, determinamos que trabajaremos bajo un contexto 2d y definimos el intervalo de refresco de nuestro canvas en milisegundos.
[javascript]
theCanvas = document.getElementById(‘canvasOne’);
context = theCanvas.getContext(‘2d’);
setInterval(drawScreen, 33);
[/javascript]

La función drawScreen será la encargada de pintar el canvas por cada intervalo que hayamos definido. Lo primero que pintamos es la caja con un borde para poder ver los límites. Las primeras dos lineas pintan el fondo y las dos siguiente pintan el borde.
[javascript]
context.fillStyle = ‘#EEEEEE’;
context.fillRect(0, 0, theCanvas.width, theCanvas.height);
context.strokeStyle = ‘#000000’;
context.strokeRect(1, 1, theCanvas.width-2, theCanvas.height-2);
[/javascript]

Ahora con una condición if, vamos podemos saber cuando la pelota choca con los el eje x y el eje y, así podemos cambiar la dirección del vector. En la primera linea si choca con el eje x y en la cuarta linea si choca con el vector y. El número 15 que le sumo a la variable “ball” corresponde radio de la pelota, ya que de no ser así, el borde de la caja chocaría con el centro de la pelota. Fíjese que estoy utilizando la función updateBall(), esta la explicaré un poco más adelante.
[javascript]
if(ball.x+15 > theCanvas.width || ball.x < 15){
angle = 180 – angle;
updateBall();
}else if(ball.y+15 > theCanvas.height || ball.y < 15){
angle = 360 – angle;
updateBall();
}
[/javascript]

Seguidamente dibujamos nuestra pelota que se moverá (o eso parece) por nuestra caja.
[javascript]
context.fillStyle = ‘#000000’;
context.beginPath();
context.arc(ball.x, ball.y, 15, 0, Math.PI*2, true);
context.closePath();
context.fill();
[/javascript]

Y ahora fuera de nuestra función drawScreen, definimos la función updateBall. Que se encargará de transformar nuestro cambio en el angulo que hicimos en el if anterior a radiales, con lo que finalmente cambiará la dirección de la pelota.
[javascript]
function updateBall(){
radians = angle * Math.PI/ 180;
xunits = Math.cos(radians) * speed;
yunits = Math.sin(radians) * speed;
}
[/javascript]
Y aquí está el resultado.
Espero que les haya servido y si tienen suguerencias para mejorar el código puedes escribirlas!
Saludos!

Actualiza tu browser por la chucha!


 

Cluster en NodeJS con ExpressJS

expressnodejs

Trabajar con Cluster es una excelente forma de mejorar el rendimiento de nuestras aplicaciones. Nodejs es mono-proceso, por lo que no podemos por ejemplo aprovechar de forma eficiente una máquina con varios nucleos. Ahora veremos como hacerlo.
Primero creamos una simple aplicación nodejs con expressjs.

[javascript]
var express = require(‘express’);
var app = express();

app.get(‘/’, function (req, res) {
res.send(‘Hello World!’);
});

app.listen(3000);
console.log(‘Application running!’);
[/javascript]

Instalamos la librería “cluster”.

sudo npm install cluster

Luego lo que hacemos es levantar un folk (proceso) por cada cpu que tenga nuestra máquina.

[javascript]
var cluster = require(‘cluster’);

if(cluster.isMaster){
var cpuCount = require(‘os’).cpus().length;
for(var i = 0; i < cpuCount; i += 1){
cluster.fork();
}
}else{
var express = require(‘express’);
var app = express();

app.get(‘/’, function (req, res) {
res.send(‘Hello World!’);
});

app.listen(3000);
console.log(‘Application running!’);
}
[/javascript]

Y listo! Y probar como anda ahora 😉
Ahora bien, si uno de nuestros “trabajadores” muere, podemos reemplazarlo fácilmente.

[javascript]
if(cluster.isMaster){

cluster.on(‘exit’, function(worker){
console.log(‘Worker ‘ + worker.id + ‘ died!’);
cluster.fork();
});
}else{
[/javascript]

Puedes encontrar la documentación completa en la página oficial de Nodejs.
Código github
Saludos!

Google Cloud Messaging con NodeJS

google-cloud-messaging

Google Cloud Messaging una de las funcionalidades más lindas que he utilizando en Android, sin tener la necesidad de tener que conectarnos cada vez al servidor, podemos mandar información a través de push a los dispositivos que tengan instalada nuestra aplicación para luego ser tratada, perfecto para notificaciones, ya que ocurre al instante. Ese post no está dedicado a explicar como funciona gcm, si lo desean pueden consultar la documentación oficial de Google para más detalles Google Developer
Entonces lo primero es crear nuestra librería con la cuál nos comunicamos en los servidores de Google, la llamaremos gcm.js

[javascript]
var request = require(‘request’);
var GCM = function(api_key) {
this._api_key = api_key;
}
GCM.prototype.send = function(msg, callback) {
request.post({
uri: ‘https://android.googleapis.com/gcm/send’,
json: msg,
headers: {
Authorization: ‘key=’ + this._api_key
}
}, function(err, response, body) {
callback(err, body);
})
}
module.exports = GCM;
[/javascript]

Recuerden que para como estamos importando ‘request’ debemos instalarla en nuestro proyecto con:

sudo npm install request

Paso seguido, creamos la función que determinará a que usuario notificaremos. Importamos el gcm.js que acabamos de crear y reemplazamos las XxxXXXxXxxXxXxXxXXxXxXxXxXxXxXxXxXx por nuestro api key (recuerden que deben dar los respectivos permisos en Google Console), para este ejemplo estoy creando un modulo llamado ‘notify’ que, apoyandome con ExpressJS, recibe a través de una consulta POST el parámetro user_id, luego en un schema llamado ‘User’ busco en mi base de datos un usuario con ese id y obtengo su gcm_id, que había guardado previamente desde el dispositivo del usuario, para poder rutear el mensaje que deseo enviar.

[javascript]
var GCM = require(‘./gcm.js’);
var gcm = new GCM(‘XxxXXXxXxxXxXxXxXXxXxXxXxXxXxXxXxXx’);

exports.notify = function(req, res){
var user_id = req.body.user_id;
User.findOne({_id: user_id}, function(err, user){
if(!err && user){
var msg = {
registration_ids: [user.gcm_id],
collapse_key: "your_collapse_key",
time_to_live: 180,
data: {
message: ‘Este es mi mensaje!’
}
};
gcm.send(msg, function(err, response){
console.log(response);
res.send(response.success);
});
}else{
res.send(‘false’);
}
});
}
[/javascript]

Y listo! Una implementación bastante sencilla de Google Cloud Message en NodeJS.
Saludos!

Genymotion con Google Apps

genymotion

Hace un tiempo que estoy utilizando la versión community (free) de Genymotion y una de las limitantes con las que me encontré es que no pude usar los servicios de Google, como los mapas, mensajería gcm, etc. He aquí la solución!

Primero bajamos este archivo:
ARM Translation Installer v1.1 (Mirror)
y sin descomprimirlo lo arrastramos sobre nuestra ventana de VM de Genymotion iniciada (si arrastrar sobre la ventana!).

Luego bajando la Google Apps según la versión de Android que estemos utilizando
Google Apps for Android 4.4 (Mirror)(Download from CM11 Links)
Google Apps for Android 4.3 (Mirrors)
Google Apps for Android 4.2
Google Apps for Android 4.1
y también arrastramos sobre la ventana de VM Genymotion iniciada.
Ahora reinicias y ya podrás acceder a Google Play y a sus servicios!
Saludos!

Calcular distancia entre dos coordenadas en javascript #nodejs

javascript_logo_unofficial-300x300

Esta función siempre está en mis proyectos donde utilizo coordenadas georeferencias (latitud y longitud), casi todos ellos son proyectos para dispositivos móviles.

function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) {
  var R = 6371;
  var dLat = (lat2-lat1) * (Math.PI/180);
  var dLon = (lon2-lon1) * (Math.PI/180);
  var a =
    Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(lat1 * (Math.PI/180)) * Math.cos(lat2 * (Math.PI/180)) *
    Math.sin(dLon/2) * Math.sin(dLon/2)
    ;
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  var d = R * c;
  return d;
}

Retorna la distancia en kilómetros.
Saludos!

Carga de archivos en Amazon S3 desde NodeJS

nodejs   amazon

Hace muchísimo tiempo que no escribo nada aquí!, me consumió el mundo Enterprise 🙁 pero ya estoy libre!. Ahora a lo que nos compete. Esta guía no trata del funcionamiento de Amazon S3 ni de NodeJS, ojo con eso. Comenzamos!
Primero a través de nuestra terminal instalamos la librería para conectarnos a Amazon S3

npm install aws-sdk

Luego en nuestro archivo .js importamos la librería y la configuramos con nuestras credenciales de acceso. Para finalmente crear la instancia s3 que utilizaremos para accesar al S3 de Amazon.

var aws = require('aws-sdk');
aws.config.update({
    accessKeyId: 'XXXXXXXXXXXXXXXXXXXX',
    secretAccessKey: 'XXxxXxXXXxxxXxXXXxXXxxXXxxXXXxxxx'
});
var s3 = new aws.S3();

Ahora ya podemos listar nuestros buckets.

s3.listBuckets(function(err, data){
    for(var index in data.Buckets){
        var bucket = data.Buckets[index];
        console.log("Bucket: ", bucket.Name, ' : ', bucket.CreationDate);
    }
});

Y insertar una nueva imagen. Para estos casos yo siempre mando la imagen en base64, entonces antes de guardarla en el S3 tengo que meterla a un Buffer

var image = req.body.image;
var buff = new Buffer(image.replace(/^data:image\/\w+;base64,/, ""),'base64');

Creo una variable con los parámetros para el putObject

var params = {
    Bucket: 'nombre_bucket',
    Key: 'nombre_imagen.png',
    Body: buff,
    ACL: 'public-read'
};

Un parámetro importante en la linea anterior es ACL, ‘public-read’ permite que la imagen pueda ser (como su nombre lo dice) pública.

s3.putObject(params, function(err, data){
    if(!err){
        console.log('load ok');
    }else{
        console.log('load fail');
    }
});

Y si es un archivo que tienen en su disco

var params = {Bucket: 'myBucket', Key: 'nombre_archivo.png'};
var file = require('fs').createWriteStream('/path/to/file.jpg');
s3.getObject(params).createReadStream().pipe(file);

Y eso es todo!
Comentarios y sugerencias son totalmente bienvenidos, saludos!

Pyramid framework en OpenShift

Pyramid es un framework de python para desarrollar aplicaciones web. Sus fuertes son la velocidad, flexibilidad y escalabilidad que ofreces a los desarrolladores. No es un full-stack framework (Full-Stack: el objetivo principal de los full-stack es proveer un conjunto de componentes que abarque todo lo que necesitas para construir una aplicación web, asegurandose que todos esos componentes funcionen bien entre si.) como Django y no es un microframework como Flask o Bottle. Y a su vez OpenShift es una plataforma deployar aplicaciones en la “nube” (algo así como heroku, cloudcontrol, phpfog, Amazon, etc.) bajo la infraestructura de Red Hat. Openshift permite integrar (sin necesidad de otro servicio) base de datos en MySQL, MongoBD, PostgreSQL, etc.

Requisitos para esta guía:

– Linux Fedora (es un requisito por los repositorios, pero si utilizan otra distribución no hay problema).
– Cuenta en Open Shift.
– Habilitar base de datos MySQL en consola de aplicaciones en Open Shift

Lo primero es registrarnos en Open Shift http://openshift.redhat.com.
Luego creamos nuestra aplicación en la administración de aplicaciones y en el momento de seleccionar el lenguaje a utilizar, seleccionamos Python (obvio o no? xD ).

La configuración de la aplicación en OpenShift no es parte de esta guía, asi que lo saltaremos. Si no saben como utilizar Open Shift les recomiendo utilizar la documentación disponible en el mismo sitio, y las guías de instalación en diferentes sistema operativos.

Ahora los pasos que realmente nos interensan.

Instalamos git como controlador de versiones (Requisito para modificar el código de nuestra aplicación).

[sourcecode language=”bash”]yum install git[/sourcecode]

Recuerden agregar su llave pública en la consola de administración de aplicaciones en el sitio de Open Shift.

Instalamos las herramientas de clientes de Open Shift. Con esta herramienta se pueden administrar el estado de las base de datos de nuestras aplicaciones, crear nuevas aplicaciones, etc.
Según la distribución de linux que tengamos, el nombre del paquete puede cambiar.

[sourcecode language=”bash”]yum install rubygem-rhc[/sourcecode]

Descargamos nuestro código fuente (reemplazar por su repositorio).

[sourcecode language=”bash”]git ssh://xxXXxxXXxXXxXXXxxx@xxxxx-xxxx.rhcloud.com/~/git/xxxxxx.git/[/sourcecode]

Si no hemos instalado la base de datos mysql, lo hacemos ahora. (Esta tarea también se puede realizar a través del administrador de aplicaciones de Open Shift). Es importante reemplazar el nombre del proyecto y el email por el mismo que utilizaron al crear su cuenta de Open Shift.

[sourcecode language=”bash”]rhc-ctl-app -a nombreproyecto -e add-mysql-5.1 -l your@email.com[/sourcecode]

Tenemos diversas opciones para administrar nuestra base de datos:

[sourcecode language=”bash”]rhc app cartridge start -a nombreproyecto -c mysql-5.1
rhc app cartridge stop -a nombreproyecto -c mysql-5.1
rhc app cartridge restart -a nombreproyecto -c mysql-5.1
rhc app cartridge reload -a nombreproyecto -c mysql-5.1
rhc app cartridge status -a nombreproyecto -c mysql-5.1
rhc app cartridge remove -a violeta -c mysql-5.1[/sourcecode]

Entramos al directorio del proyecto.

[sourcecode language=”bash”]cd nombreproyecto[/sourcecode]

Hacemos la referencia a pyramid.

[sourcecode language=”bash”]git remote add upstream -m master git://github.com/lmacken/pyramid-openshift-quickstart.git[/sourcecode]

 

[sourcecode language=”bash”]git pull -s recursive -X theirs upstream master[/sourcecode]

Y finalmente guardamos.

[sourcecode language=”bash”]git push[/sourcecode]

Eso es todo, espero haya servido esta guía y si quieren aportar algo bienvenido sea.
Recuerden visitar nuestra comunindad de Python Chile y participar en nuestros MeetUp

Carga de archivos en Amazon S3 con PHP

Amazon S3 es almacenamiento para Internet. Está diseñado para facilitar a los desarrolladores la informática a escala web.

Amazon S3 proporciona una sencilla interfaz de servicios web que puede utilizarse para almacenar y recuperar la cantidad de datos que desee, cuando desee, y desde cualquier parte de la web. Concede acceso a todos los desarrolladores a la misma infraestructura económica, altamente escalable, fiable, segura y rápida que utiliza Amazon para tener en funcionamiento su propia red internacional de sitios web. Este servicio tiene como fin maximizar las ventajas del escalado y trasladar estas ventajas a los desarrolladores (descripción por Amazon).

¿Qué necesitamos?
– Una cuenta en amazon S3
– Librería de S3 de Amazon que pueden descargar aquí: S3.php
– PHP

Para este ejemplo armaremos sólo 1 archivo, con el fin de simplificar la guía. Entonces comencemos!

[sourcecode language=”php”]vim index.php[/sourcecode]

Comenzamos importando la librería S3 q se especifica más arriba

[sourcecode language=”php”]
// Incluimos la clase de Amazon S3
if(!class_exists(‘S3’))require_once(‘S3.php’);
[/sourcecode]

Definimos las keys de acceso, estás están especificados en la información de nuestra cuenta en AWS

[sourcecode language=”php”]
// Informacion de acceso al AWT
if(!defined(‘awsAccessKey’)) define(‘awsAccessKey’, ‘XXXXXXXXXXXXXXXXX’);
if(!defined(‘awsSecretKey’)) define(‘awsSecretKey’, ‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’);
[/sourcecode]

Instanciamos la clase S3 para hacer la conección con Amazon

[sourcecode language=”php”]
// Instanciamos la clase de S3
$s3 = new S3(awsAccessKey, awsSecretKey);
[/sourcecode]

Definimos nuestro bucket o almacen de archivos (previamente creado en AWS)

[sourcecode language=”php”]
// Nombre del Bucket en Amazon S3
$bucket = “XXXXXXX”;
[/sourcecode]

Luego con un formulario enviamos el archivo que deseamos cargar

[sourcecode language=”php”]// Cuendo presiono el boton Upload
if(isset($_POST[‘Submit’])){
// Recibo las variables por POST
$fileName = $_FILES[‘theFile’][‘name’];
$fileTempName = $_FILES[‘theFile’][‘tmp_name’];
// Creo un nuevo bucket de Amazon S3
$s3->putBucket($bucket, S3::ACL_PUBLIC_READ);
// Muevo el archivo de su ruta temporal a su ruta definitiva
if($s3->putObjectFile($fileTempName, $bucket, $fileName, S3::ACL_PUBLIC_READ)) {
echo “Archivo subido correctamente.”;
}else{
echo “”No se pudo subir el archivo.”;
}
}[/sourcecode]

Creamos nuestro formulario

[sourcecode language=”php”]



[/sourcecode]

Listamos los archivos en nuestro Bucket en Amazon S3

[sourcecode language=”php”]

Lista de archivos en el S3

getBucket($bucket);
foreach ($contents as $file){

$fname = $file[‘name’];
$furl = “http://”.$bucket.”.s3.amazonaws.com/”.$fname;

// Imprimo el archivo que voy encontrando
echo “$fname
“;

}
?>
[/sourcecode]

Puedes descargar el archivo completo ejemplo_php_amazons3

Saludos y gracias por su visita!

Geocodificación en Ruby con Geocoder

  

La geolocalización y la geocodificación hoy cumplen un papel fundamental en la composición de nuestras aplicaciones. Determinar el pais, la ciudad, el lenguaje, etc sin duda que agregar un gran valor a la hora de personalizar aplicaciones para nuestros visitantes.

Comencemos!

Para esta entrada utilizaré:
– Fedora 16
– Ruby 1.8.7
– Rubygems 1.8.11
– Geocoder 1.1.0
– json_pure 1.6.4

La versión de Ruby 1.8.7 y Rubygems 1.8.11 es la trae por defecto el repositorio de Fedora 16.

sudo yum install ruby rubygems

Ahora instalamos Geocoder y su dependencia json_pure

sudo gem install geocoder json_pure

Podemos forzar las versiones que desamos instalar de la siguiente forma

sudo gem install -v=1.1.0 geocoder

Ya está listo nuestro Ruby con sus gemas necesarias, Geocoder nos instala un script para realizar peticiones por terminal, este lo podemos utilizar de la siguiente forma

$ geocode "Quilicura, Santiago"

# Resultado:
# Latitude:         -33.3613271
# Longitude:        -70.7287415
# Full address:     Quilicura, Santiago Metropolitan Region, Chile
# City:             Quilicura
# State/province:   Santiago Metropolitan Region
# Postal code:      
# Country:          Chile
# Google map:       http://maps.google.com/maps?q=-33.3613271,-70.7287415

Ya funcionando podemos crear nuestros primero ejemplos, entonces creamos un archivo .rb

vim ej_geocoder1.rb

Con el siguiente contenido

# Importamos nuestras gemas, recuerden que en versiones de ruby 1.8 se debe importar siempre la gema 'rubygems'.
require 'rubygems'
require 'geocoder'

# Realizamos una busqueda, esto nos devolvera un lista de coincidencias y con [0] decimos que queremos la primera.
local = Geocoder.search("Quilicura, Santiago, Chile")[0]

# Imprimimos las coordenadas de la direccion buscada
puts local.coordinates

Ejecutamos

ruby ej_geocoder1.rb

Geocoder.search devuelve un objeto con lo siguientes atributos:
address
address_components
address_components_of_type(type)
city
coordinates
country
country_code
formatted_address
geometry
postal_code
state
state_code
types

Entonces siguiendo el ejemplo anterior podemos obtener el pais de nuestra busqueda de la siguiente forma

local.country

También con Geocoder podemos obtener la dirección de una ip o de unas coordenadas de la siguiente forma

vim ej_geocoder2.rb
# Importamos nuestras gemas necesarias
require 'rubygems'
require 'geocoder'

# Ingresamos la ip que queremos buscar y la primera coincidencia con el valor [0]
ip = Geocoder.search("200.113.190.187")[0]
puts ip.address
puts ip.coordinates

# Obtenemos la direccion a traves de unas coordenadas
ip = Geocoder.search("-33,-70")[0]
puts ip.address

Ejecutamos

ruby ej_geocoder2.rb

Geocoder se provee de buscadores como Google, Yahoo, Bing, GeocoderCa, etc para realizar sus busquedas. Esto podemo configurarlo en:

/usr/lib/ruby/gems/1.8/gems/geocoder-1.1.0/lib/geocoder/configuration.rb

en la propiedad [:lookup, :google] , recuerden que la url puede variar según las versiones instaladas.

Más información en la página oficial en RubyGeocoder

Gracias por su visita!

Astrometría en Python con PyEphem


  

Uno de mis hobbies es la Astronomía y eso me ha llevado a investigar las herramientas que existen actualmente para realizar cálculos de Astrometría. Leyendo en internet y también por recomendación de amigos decidí utilizar Python para este entrada, por sus avances en materias científicas en relación a otros lenguajes de desarrollo.

Sin ningún fin es particular decidí utilizar PyEphem para ejemplificar la utilización de Astromería en Python. PyEphem es un módulo para realizar cálculos astronómicos tales como posiciones de astros, planetas, horas de orto y ocaso de los astros, etc. También se puede calcular la posición de cometas, asteroides y satélites una vez proporcionados los elementos orbitales de los mismos.

Comencemos! Para este ejemplo utilizo una distribución basada en Red Hat, pero pueden utilizar la que deseen, aunque los nombres de los paquetes pueden variar sutilmente.

Porsupuesto lo primero que debemos verificar, son los paquetes necesarios: python, python-devel para las herramientas de desarrollo y gcc para la compilación de pyephem.

sudo yum install python python-devel gcc

Luego a través del gestor de paquetes de python easy_install instalamos otro gestor llamado pip.

sudo easy_install pip

Y finalmente instalamos PyEphem.

sudo pip install pyephem

Y ahora un ejemplo de utilización.

vim ejemplo_pyephem1.py
# Importamos la libreria de PyEphem
import ephem as ep

# Creamos un objeto Martes, ep.now() hace referencia a este momento
martes = ep.Mars(ep.now())

# Imprimimos la constelacion en la cual se encuentra Martes en pantalla
print ep.constellation(martes)

Ejecutamos.

python ejemplo_pyephem1.py

Otro ejemplo para soltar más la muñeca

vim ejemplo_pyephem2.py
#Importamos nuestra libreria
import ephem as ep

# Creamos un observatorio ubicado en Santiago.
# Podemos agregar y modificar las coordenadas de nuestras ciudades en:
# /usr/lib64/python2.7/site-packages/ephem/cities.py
santiago = ep.city("Santiago")

# Obtenemos la fecha actual de Santiago
santiago.date = ep.now()
print "Fecha hoy: ", santiago.date

# Anulamos la Refraccion atmosferica
santiago.pressure = 0 

# Creamos un objeto Martes y uno Saturno en el observatorio de Santiago.
martes = ep.Mars(santiago)
saturno = ep.Saturn(santiago)

# Imprimimos la altura y azimut desde el Observatorio de Santiago.
print "Martes: ", martes.alt
print "Saturno: ", saturno.alt

# Imprimimos la separacion entre ambos planetas 
print "Separacion entre Martes y Saturno", ep.separation(martes,saturno)

# Proxima luna llena en el observatorio de Santiago
print "Luna llena: ", ep.next_full_moon('2012')

Ejecutamos.

python ejemplo_pyephem2.py

Más información en la página oficial de PyEphem.

Recuerden visitar nuestra comunidad de Python Chile!