Sobre la frecuencia cardiaca

Frecuencia cardiaca máxima (F.C.M.)

  • Fórmula de churrutera (aunque la clava con el test de estrés)

220  -Edad   ->   220 – 33 =  190 ppm

  • Test de estrés

Calentar durante 10 minutos al trote y después subir una subida durante 3 minutos a full.

Fórmula de Karvonen

Frecuencia cardíaca en reposo (FCR) (se toman por la mañana, antes de levantarse). 60 ppm

Frecuencia cardíaca máxima (FCM) = 190 ppm

Frecuencia cardíaca de Reserva (RFC)

RFC = FCM - FCR -> 190-60 =130

Para calcular las zonas elegimos un porcentaje por ejemplo el 50%

130 x 50% = 65 y le sumamos la FCR :   65 + 60 = 125

Osea que se tiene que correen a 125ppm para ir ha medio gas.

Zonas de entrenamiento

  1. Zona de Recuperación\Regeneración 50-60%  -> 125-138 ppm
  2. Zona de trabajo aeróbico 1 60-70% -> 138-151 ppm
  3. Zona de trabajo aeróbico 2 70-80% -> 151-164 ppm
  4. Zona umbral anaeróbico 80-90%  -> 164-177 ppm
  5. Zona de intensidad alta >90% -> 177 ppm

Zonas según el Runtastic

  1. Easy 129-139 ppm
  2. Fat Burning 140-150 ppm
  3. Aerobic 151-161 ppm
  4. Anaerobic 162-171 ppm
  5. Red Line 172-183 ppm
Posted in Uncategorized

Última consulta mSqlSever

Última sentencia ejecutada en msqlserver

SELECT deqs.last_execution_time AS [Time], dest.text AS [Query]
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
ORDER BY deqs.last_execution_time DESC

Path donde guarda los archivos .mdf

select * from sys.database_files
Posted in Uncategorized

Publicación de un cubo Rolap mediante Saiku Analytics en Openshift

1)Crearse una cuenta en openshift

2)Iniciad una aplicación con Tomcat 6 (JBoss EWS 1.0)

3)Añadir una instancia de postgres

Para descubrir la ip del servidor Postgres

env

4)Descargar SAIKU

Los paquetes son Saiku Backend WAR 2.5 y Saiku UI WAR 2.5 desde :

http://meteorite.bi/saiku/download

5) Descomprimir los war en el directorio jbossews/webapps/ para desplegar la aplicación

6) Instalar el JDBC de postgres

Ir a:

cd /jbossews/webapps/saiku/WEB-INF/lib
wget http://jdbc.postgresql.org/download/postgresql-9.2-1004.jdbc3.jar

7) Configurar los archivos de configuración de Saiku

vim webapps/saiku/WEB-INF/classes/saiku-datasources/dummy_test
type=OLAP
name=NOMBRE_DESCRIPTIVO
driver=mondrian.olap4j.MondrianOlap4jDriver
location=jdbc:mondrian:Jdbc=jdbc:postgresql://localhost:5432/NOMBRE_BBDD; \
Catalog=/home/Applications/Saiku/saiku-server/tomcat/webapps/saiku/WEB-INF/classes/foodmart/dummy_cube.xml;JdbcDrivers=org.postgresql.Driver;
username=USERNAME
password=PASSWORD

8)Añadir un esquema OLAP a saiku

vim /Saiku/saiku-server/tomcat/webapps/saiku/WEB-INF/classes/foodmart/dummy_cube.xml
<Schema name="New Schema1">
  <Cube name="Sample Cube" visible="true" cache="true" enabled="true">
    <Table name="olap_data" schema="public">
    </Table>
    <Dimension type="StandardDimension" visible="true" foreignKey="id" name="Sample Dimension">
      <Hierarchy name="Sample Hiearchy" visible="true" hasAll="true">
        <Table name="olap_data" schema="public">
        </Table>
        <Level name="Sample Level" visible="true" column="dim" uniqueMembers="false">
        </Level>
      </Hierarchy>
    </Dimension>
    <Measure name="Measure" column="measure" aggregator="sum" visible="true">
    </Measure>
  </Cube>
</Schema>

Fuentes:

http://joel-latino.blogspot.com.es/2013/09/how-publish-saiku-analytics-on-openshift_26.html

http://stackoverflow.com/questions/21851726/how-can-use-another-database-instead-of-foodmart

Tagged with: , ,
Posted in BI

Trukis para expresiones regulares

Negación de un comienzo de linea para jedit

^[^hola].*

La última instancia de un carácter:

substring(salario from '€[^€]*$')

Permitir varios parámetros opcionales en la URL con Django

(?:/(?P<title>[a-zA-Z]+))?/

Fuente:

http://stackoverflow.com/questions/2325433/making-a-regex-django-url-token-optional

Tagged with:
Posted in Programación

Serializar en JSON diversos tipos de datos para django

Desde la vista (controlador):

from django.utils import simplejson
jobs_locates = Empleos.objects.filter(
		~Q(coordinates = None),
		data_publication__gte=date_desde,
		data_publication__lte=date_hasta
	 )
n_jobs_locates = Empleos.objects.filter(
		~Q(coordinates = None),
		data_publication__gte=date_desde,
		data_publication__lte=date_hasta
	 ).count()

jobs_locates_json = serializers.serialize('json', jobs_locates )
jobs_locates_list = simplejson.loads( jobs_locates_json )

json_data = simplejson.dumps( {'jobs_locates':jobs_locates_list, 'n_jobs_locates':n_jobs_locates} )
return HttpResponse(json_data, mimetype='application/json')

Recuperar desde el frontend:

$('#buscar').on('click', function (e) {
	 $.ajax({
		type: "GET",
		url: "http://localhost:8000/mapa/getJobs",
		data: {
			date_desde: $('#date_desde').val(),
			date_hasta: $('#date_hasta').val(),
		},
		success: function(data){
			data['n_jobs_locates'];
			data['jobs_locates'];
			}
	});
});

Fuente:

http://kiaran.net/post/54943617485/serialize-multiple-lists-of-django-models-to-json

Tagged with:
Posted in Programación

Contador de pulsos mediante Raspberrypi

El foto-interruptor utilizado es el siguiente:

https://www.sparkfun.com/products/9299


Es un dispositivo formado por un diodo emisor y otro receptor separados por una pequeña distancia que es la que cortaremos. Es ampliamente utilizado como sensor de posición o final de carrera en por ejemplo impresoras.
El datasheet se encuentra en:

https://www.sparkfun.com/datasheets/Components/GP1A57HRJ00F.pdf


El cirduito es el sigiente:

https://www.sparkfun.com/datasheets/Sensors/Infrared/PhotoInterrupter-Breakout-v20.pdf


Montaje del circuito

Programa que realiza un polling para testear el circuito

#!/usr/bin/python
# -*- coding: utf-8 -*- 
import time
import RPi.GPIO as GPIO

def main():
	contador = 0
	GPIO.setmode(GPIO.BCM)
	GPIO.setup(23,GPIO.IN)
	while True:
		if GPIO.input(23):
			contador =contador
		else:
			contador = contador +1
		print contador
		#time.sleep(0.1)
	GPIO.cleanup()

if __name__=="__main__":
	main()

La librería RPi.GPIO soporta también la gestión de las entradas del la Raspberry mediante el uso de interrupciones. El siguiente script es un ejemplo de un simple contador.

#!/usr/bin/env python2.7  
# script by Alex Eames http://RasPi.tv  
  
import RPi.GPIO as GPIO  
import sys
GPIO.setmode(GPIO.BCM)  
  
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

contador = 0

def my_callback(channel):
	global contador
	contador = contador +1
	import time
	import sys
	#Se imprime el nº de pulsos y después se retorna a la posición para que salga todo en la misma linea sin retorno de carro.\b-> tira pá tras un caracter
	sys.stdout.write('%d' % contador)
	sys.stdout.flush()
	i=1
	while i<=len(str(contador)):
		sys.stdout.write('\b')
		i = i+1;
	
GPIO.add_event_detect(23, GPIO.RISING, callback=my_callback)  
  
raw_input("Press Enter Para salir del programa \n") 
GPIO.cleanup()         


Fuentes:
Gestión de las interrupciones de la Raspberry mediante python

http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio

Tagged with: ,
Posted in Programación, Sistemas

Puesta en marcha Ubuntu server 12 con Postgres

Permitir conexiones desde cualquier dirección

sudo vim /etc/postgresql/9.1/main/pg_hba.conf
host    all             all             0.0.0.0/0            md5

Permitir escuchas desde cualquier IP

sudo vim /etc/postgresql/9.1/main/postgresql.conf     
listen_addresses = '*'

Establecer contraseña usuario postgres

sudo -u postgres pgsql postgres
\password postgres

Finalmente se crea la base de datos

sudo -u postgres createdb miBBDD
Posted in Uncategorized

Tamaño de una base de datos Postgres en disco

Truki para conocer el tamaño que ocupa una base de datos en disco.

SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS SIZE 
FROM pg_database;

Y aquí para conocer el tamaño de una tabla en particular.

SELECT pg_size_pretty(pg_total_relation_size('empleos'));
Tagged with: ,
Posted in Programación

Insert if not exists, y si existe retorna la clave primaria

Es un poco lió pero el truki consiste realizar dos conjuntos disjuntos: un select y un insert if not exist; luego realizar la unión de ellos dos

WITH s AS ( --Se realiza el select 
    SELECT idminimun_studies
    FROM minimun_studies
    WHERE name = 'Licenciado - Veterinaria'
), i AS ( --Se realiza el insert if not exist
    INSERT into minimun_studies(name)
    SELECT 'Licenciado - Veterinaria'
    WHERE NOT EXISTS (
	SELECT name 
	FROM minimun_studies 
	WHERE name = 'Licenciado - Veterinaria'
	)
    RETURNING idminimun_studies
)
SELECT idminimun_studies
FROM i
UNION ALL   -- se realiza la union de los conjuntos disjuntos
SELECT idminimun_studies
FROM s

Es un poco lió y la solución no es óptima por no ser SQL estándar ja que la sentencia WITH (que asigna nombres a las subconsultas) no existe en Mysql aunque si en Postgres, Msql y Oracle.
Por otro lado siendo tan largo quizás es mejor crear un procedimiento en PLsql (opción que se carga la compatibilidad Ipso facto) o por el contrario realizar la lógica desde el lenguaje de cliente (opción que traslada la ilegibilidad al código de la aplicación cliente).
Implemetación de un caso general para una relación de “one to one”, notese lo intrincado del asunto

-- DROP FUNCTION insert_if_not_exist_els_return_primary_key(character varying, character varying, character varying, character varying);

CREATE OR REPLACE FUNCTION insert_if_not_exist_els_return_primary_key(name_table character varying, column_id_name character varying, column_mach_name character varying, value_mach_name character varying)
  RETURNS integer AS
$BODY$
DECLARE
    aaaa integer;
BEGIN
	IF (value_mach_name IS NULL)  THEN
		RETURN NULL;
	END IF;
	EXECUTE '
	WITH s AS (
	    SELECT ' || quote_ident(column_id_name) || '
	    FROM  ' || quote_ident(name_table) || '
	    WHERE name = ' || quote_literal(value_mach_name) || '
	), i AS (
	    INSERT INTO ' || quote_ident(name_table) || '(' || quote_ident(column_mach_name) || ')
	    SELECT ' || quote_literal(value_mach_name) || '
	    WHERE NOT EXISTS (
		SELECT ' || quote_ident(column_mach_name) || ' 
		FROM  ' || quote_ident(name_table) || ' 
		WHERE ' || quote_ident(column_mach_name) || ' = ' || quote_literal(value_mach_name) || '
		)
	    RETURNING ' || quote_ident(column_id_name) || ' 
	)
	SELECT ' || quote_ident(column_id_name) || ' 
	FROM i
	UNION ALL
	SELECT ' || quote_ident(column_id_name) || ' 
	FROM s;'
	INTO aaaa  ;
	RETURN aaaa;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION insert_if_not_exist_els_return_primary_key(character varying, character varying, character varying, character varying)
  OWNER TO postgres;

select insert_if_not_exist_els_return_primary_key('levels','idlevel','name','Registro que existe')
select insert_if_not_exist_els_return_primary_key('levels','idlevel','name','Registro que NO existe')
select insert_if_not_exist_els_return_primary_key('levels','idlevel','name',NULL)

Aquí otra versión de la misma función utilizando if en PL/SQL por que en alguna versiones de postgres me he encontrado que un Insert no puede ir dentro de una definición WITH

-- Function: insert_if_not_exist_els_return_primary_key(character varying, character varying, character varying, character varying)

-- DROP FUNCTION insert_if_not_exist_els_return_primary_key(character varying, character varying, character varying, character varying);
CREATE OR REPLACE FUNCTION insert_if_not_exist_els_return_primary_key(name_table character varying, column_id_name character varying, column_mach_name character varying, value_mach_name character varying)  RETURNS integer AS
$BODY$
DECLARE
    aaaa integer;
BEGIN
	IF (value_mach_name IS NULL)  THEN
		RETURN NULL;
	END IF;
	EXECUTE '
	
	    INSERT INTO ' || quote_ident(name_table) || '(' || quote_ident(column_mach_name) || ')
	    SELECT ' || quote_literal(value_mach_name) || '
	    WHERE NOT EXISTS (
		SELECT ' || quote_ident(column_mach_name) || ' 
		FROM  ' || quote_ident(name_table) || ' 
		WHERE ' || quote_ident(column_mach_name) || ' = ' || quote_literal(value_mach_name) || '
		)
	    RETURNING ' || quote_ident(column_id_name) || ' 
	'
	INTO aaaa  ;

	IF (aaaa IS NOT NULL)  THEN
		RETURN aaaa;
	ELSE	
		EXECUTE '
			    SELECT ' || quote_ident(column_id_name) || '
			    FROM  ' || quote_ident(name_table) || '
			    WHERE ' || quote_ident(column_mach_name) || ' = ' || quote_literal(value_mach_name) || '
			'
		INTO aaaa  ;
	END IF;
	
	RETURN aaaa;

END;
$BODY$ LANGUAGE plpgsql VOLATILE  COST 100;

select * from  insert_if_not_exist_els_return_primary_key('countries','idcountry','name','España');
Tagged with: ,
Posted in Uncategorized

Acceso al result de una llamada a Postgres con Python mediante psycopg2 por el nombre de columna

El método cursor devuelve los datos en tupas que no se pueden acceder por nombre de columna. Para evitarlo se llama al método con el parámetro para que devuelva diccionarios.

conn.cursor(cursor_factory=psycopg2.extras.DictCursor)

#!/usr/bin/python
# -*- coding: utf-8 -*-
import psycopg2, sys
from psycopg2.extras import *

try:
	conn = psycopg2.connect("dbname='empleomap_empleomap' host='localhost' user='xxxxxxxxxx'  password='xxxxxxxxxx'")
except:
	print "I am unable to connect to the database"
	exit(0)
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
try:
	cur.execute("SELECT * FROM empleos WHERE actualizado = 'FALSE' LIMIT 6")
	item = cur.fetchone()		
except:
	print "Error accediento a la tabla empleos ", sys.exc_info()
	exit(0)

for row in cur.fetchall():
	row['link']
Tagged with:
Posted in Programación