miércoles, 24 de octubre de 2012

Programar en OnX. Un ejemplo sencillito y completo.

¿Sabes lo que es ON-X ?

Una aplicación para Android que permite controlar tu teléfono, enviar SMSs, realizar llamadas automáticas, encender y apagar la WiFi, etc. según las condiciones que estable.

¿Y cómo se hace?

Es en lenguaje (casi) javascript, con acceso a una API que controla el teléfono, con funciones y variables del estilo device.audio.ringerVolume = 60;

Aquí os dejo un ejemplo de cómo hacer operaciones en función de la ubicación y la hora:

Empiezo con las funciones que me ayudan a determinar dónde estoy, según la hora:


function esfestivo(fecha)
{
    fecha=new Date(fecha);
var esnavidad=false;
var todossantos=false;
if((fecha.getMonth()===12)&&(now.getDate()>=23))esnavidad=true;
if((fecha.getMonth()===1)&&(now.getDate()<=6))esnavidad=true;
if((fecha.getMonth()===11)&&(now.getDate()===1))todossantos=true;
return esnavidad||todossantos;
}

function dialaborable(fecha)
{
    fecha=new Date(fecha);
    var diasemana=fecha.getDay();
    return (diasemana===1)||(diasemana===2)||(diasemana===3)||(diasemana===4)||(diasemana===5);
}

function entrabajo(horafrac)
{
return ((horafrac>=8.5)&&(horafrac<15));
}

function fueraportrabajo(horafrac)
{
return ((horafrac>=7.5)&&(horafrac<15.5));
}


function diadetrabajo(hoy)
{
    hoy=new Date(hoy);
    return dialaborable(hoy)&&!esfestivo(hoy);
}


function conduciendo(ahora)
{
var fecha=new Date(ahora);
var horafrac=fecha.getHours()+fecha.getMinutes()/60;
if(!diadetrabajo(fecha))return false;
return fueraportrabajo(horafrac)&&!entrabajo(horafrac);
}

function currando(ahora)
{
    //console.log("deb 3:"+ahora);
    var fecha=new Date(ahora);
    //console.log("deb 4:"+fecha);
var horafrac=fecha.getHours()+fecha.getMinutes()/60;
    //console.log("deb 2:"+horafrac);
if(!diadetrabajo(ahora))return false;
    //console.log("deb 3:"+horafrac);
return entrabajo(horafrac);
}


Estas son las funciones que establecen el estado del dispositivo según el estado:


function onoff(estado)
{
    if(estado=="trabajando")
    {
    device.bluetooth.enabled = false;
    setNetwork("wifi",true);
    //setNetwork("3g",false);
    device.audio.ringerMode = 'normal';
    device.audio.ringerVolume = 60;
    }
    if(estado=="conduciendo")
    {
    device.bluetooth.enabled = true;
    setNetwork("wifi",false);
    setNetwork("3g",true);
    device.audio.ringerMode = 'normal';
    device.audio.ringerVolume = 100;
    }
    if(estado=="descansando")
    {
    device.bluetooth.enabled = false;
    //setNetwork("wifi",true);
    //setNetwork("3g",false);
    device.audio.ringerVolume = 100;
    }
    if(estado=="clase")
    {
    device.audio.ringerMode = 'silent';
    }
}


function setNetwork(networkType, isOn) {
      if (networkType === '3g') {
        device.network.mobileDataEnabled = isOn;
      }
      else {
        device.network.wifiEnabled = isOn;
      }
    }




Definimos la función que se invocará periódicamente:

var storage = device.localStorage;
var handler=function evaluar()
{
    var anterior = storage.getItem('estado');
    var now = new Date();
    var h=now.getHours();
    var d=now.getDay();
    var m=now.getMinutes();
    var horafrac=h+m/60;

    var estado="descansando";
    if(currando(now))estado="trabajando";
    if(conduciendo(now))estado="conduciendo";
    onoff(estado);
    storage.setItem('estado', estado);
    if(anterior!=estado){
    device.audio.vibrate(50);
    }
    else{
    //device.audio.vibrate(100);
    }
};

Y por fin, este es el código que lanza


var hora = new Date();
var mess1 = device.notifications.createNotification("Arrancando");
var mess2 = device.notifications.createNotification("Arrancado");
var timerStart =new Date();

//mess1.show();


//Programamos hora de primera llamada timerStart e intervalo de chequeo: cada 15 minutos

var x=hora.getMinutes();
var evry=15;
x=x/evry;
x=parseInt(x,10); //redondeamos
x=((x+1)*evry); //Preparamos la primera
timerStart.setMinutes(0);
timerStart.setSeconds(0);
var unix=timerStart.getTime()+x*60000;
var intervalo=evry*60*1000;

var params=    {name: 'timerIPE1',time: unix,interval: intervalo,repeat: true,exact: false};

device.scheduler.setTimer(params,handler);

Espero que sea de utilidad para alguien.

De todas formas, es mejor usar "llama" si no os queréis complicar la vida.

jueves, 21 de junio de 2012

Etiquetas con fotos en Word (parte 2 de 2)

Se presupone en este punto que:


  • Has concluido con éxito la parte 1
  • Uno de los campos de la base de datos contiene la ruta absoluta al nombre de la foto de cada persona (o imagen personalizada de cada producto)
  • Existe realmente una carpeta en la que están las imágenes (preferentemente del mismo tamaño):
¡Cuidado con el tamaño de las imágenes! Deben mantener la misma proporción.
Si no se retocan, cada 300 píxeles se convertirán exactamente en 1 pulgada (2,54cm) en papel


Ahora viene lo más importante:

1) Selecciona Insertar / Imagen y eliges cualquier imagen de la carpeta, pero en lugar de insertar, selecciona la opción vincular al archivo.

2) Presiona alt-F9 para ver el código introducido, que debe ser algo como esto:

{ INCLUDEPICTURE “d:\\gente\\fotos\\34567890B.jpg” \* MERGEFORMAT \d }

Si en este punto actualizaras etiquetas y previsualizaras resultados, todos tendrían la misma imagen. Vamos a personalizarla por etiqueta.


3) Selecciona la parte del nombre del archivo que vayas a sustituir por una columna de la hoja de cálculo, la eliminas y dejas el cursor ahí, para, a continuación, insertar el campo combinado que contiene el nombre del archivo:


{ INCLUDEPICTURE “d:\\gente\\fotos\\{ MERGEFIELD “dni” }.jpg” \* MERGEFORMAT \d }


4) En el menú correspondencia:

  • Actualiza etiquetas
  • Finalizar y combinar
  • Editar documentos individuales
  • Aceptar (genera un nuevo documento)
5) En el nuevo documento, si seleccionas todo (ctrl-E) y pulsas F9 (actualizar campos) ¡Voilá!

Fuente: http://onmerge.com/articleIncludePicture.html

Etiquetas con fotos en Word (parte 1 de 2)

Tenemos que imprimir 200 etiquetas de usuarios. Los datos están en una hoja Excel en la que uno de los campos es el nombre de archivo. El resultado debe ser algo parecido a esto:


Por supuesto, queremos automatizarlo, y parece complicado, pero no lo es.

Complejidad (de 1 a 10):  0  :)
Tiempo: 5 minutos


Estos son los pasos:

1) Abrir Word. Ir a solapa Correspondencia, Iniciar combinación de correspondencia,  Etiquetas. Elige el tipo de etiquetas y crea un nuevo documento. Si has comprado etiquetas de tamaño predeterminado, selecciona la marca y modelo, aunque yo prefiero usar una hoja adhesiva completa de tamaño A4, diseñar las etiquetas a mi gusto, y al final, cortarlas con tijeras.

2) En la primera etiqueta, pon una imagen de fondo, y los cuadros de texto que te de la gana. Cualquier cosa que se vaya a imprimir igual en todas las etiquetas. En mi caso, he creado una minitabla de dos celdas. Una para la foto y otra para el texto, como en la imagen.

3) Importante: Almacena el documento como Word 97-2003 (.doc) ya que el nuevo formato (.docx) no admite la inclusión de imágenes personalizadas.

4) Ahora vamos a vincular la base de datos. Solapa correspondencia, Elegir destinatarios, de una base de datos existente. Seleccionamos el archivo Excel. Es muy recomendable que en la base de datos, la primera fila asigne nombre a las columnas.

5) Para poner, por ejemplo, el nombre en cada etiqueta, seleccionas Correspondencia, Insertar Campo combinado, y eliges el campo (la columna de la hoja excel con los nombres) "Nombre" o similar, de tu base de datos.

Es el momento de ver que todo va bien. Pulsa alternativamente alt-f9 (ver código) para ver que en realidad has metido un código especial. Actualiza etiquetas y previsualiza resultados (en el menú correspondencia) para comprobar que todo va bien.

lunes, 18 de junio de 2012

Hoja de Cálculo para contrato por horas de empleadas de hogar 2012

Nuevo blog para subir cosillas de interés. Ya tenía uno, pero no recuerdo la dirección.

En este caso, una hoja de cálculo para regularizar empleadas de hogar por horas semanales.

http://www.feliperomero.es/empleadashogar.rar