Keep in touch

RSS Feed Twitter Facebook Delicious

Subscribe via Email

Reflexión en Java I, Instancia una clase descono...

April 27th, 2010 by pako received 9 Comments »

La Reflexión es el mecanismo mediante el cual java puede conocer clases ya compiladas y nos permite conocer cualquier clase con tan solo conocer su nombre así como crear instancia de los objetos e interactuar con los métodos de la misma, este puede tener diversas aplicaciones, en un siguiente post les mostrare como aprovecho esta ventaja en la programación en Web de Java por ahora me limito a mostrar algo de la API, en este post solo mostrare como crear la instancia de un objeto en post posteriores mostrare como obtener información de la clase y interactuar con sus métodos.
Para poder instanciar una clase con solo conocer su nombre y o ubicación en el classpath, ojo la clase tiene que estar en el claspath algo lógico por que si no lo esta java no la encontrará.

Para Ejemplificar creare dos clase A y B:

Class A

public class A {
    @Override
    public String toString() {
        return "Esto es una clase A";
    }
}

Class B

public class B {
    @Override
    public String toString() {
        return "esto es una B";
    }

}

Como observara solo he definido el método toString() que sobrescribe el método heredado desde java.lang.Object, este método se invoca al tratar de convertir un objeto a String por ejemplo al querer imprimirlo con un System.out.println()
Para Obtener la clase desde un string haremos uso del método estático forName() de la clase Class, esta clase nos provee distintos métodos para obtener información de una clase, si han manejado drivers jdbc recordaran haber utilizado este método.
Ejemplo :

Class _class = Class.forName(“A”);

Con esto se almacena la clase (el molde, no la instancia) de la clase A, observe que se envía una cadena esto hace que esto pueda ser dinámico en tiempo de ejecución ya que podemos tener una variable y esta enviarla al Class.forName, si la clase no se encuentra se genera una excepción tipo ClassNotFoundException .
Una ves que tenemos la clase podremos llamar a su constructor por defecto (el que no recibe ningún parámetro, constructores con parámetros los mostrare en otro post)

Para crear la instancia haremos uso del método .newInstance(); del objeto Class que almacene nuestra clase en nuestro ejemplo _class, este métodos pueden generar excepciones tipo InstantiationException, IllegalAccessException

Object obj=_class.newInstance();

Las excepciones las podemos manejar con campos try/catch o bien agregando throws al inicio de nuestro método.
Para ver que realmente estamos instanciando un objeto del tipo marcado en Class.forName, mandare imprimir el objeto.

System.out.println(obj);

Con esto mando implícitamente el método .toString(), podrán observar la salida en la consola y debería de mostrar el mensaje:

“Esto es una clase A”

Aquí el código de la clase que usa la reflexión
reflexion1.java

public class refexion1 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class _class = Class.forName("A");
        Object obj = _class.newInstance();
        System.out.println(obj);

    }
}

Ahora cambie el parámetro de Class.forName a “B”, y pruebe observara que el mensaje ha cambiando por

“esto es una B”

Por último modifico la clase para que atreves del teclado el usuario me indique que clase instanciar.

import java.util.Scanner;
public class refexion1 {
    public static void main(String[] args) {
        System.out.println("Escribe A o B");
        String strClase = new Scanner(System.in).nextLine();
        try {
            Class _class = Class.forName(strClase.toUpperCase());
            Object obj;
            try {
                obj = _class.newInstance();
                System.out.println(obj);
            } catch (InstantiationException ex) {
                System.out.println("Error al Instaciar laClase");
            } catch (IllegalAccessException ex) {
                System.out.println("Error al Instaciar laClase");
            }
        } catch (ClassNotFoundException ex) {
            System.out.println("La Clase No existe");
        }
    }
}

Espero este post allá despertado su interés.. próximamente les digo como obtener información, instanciar con constructores con parámetros, obtener información de los métodos y sus parámetros y como interactuar con ellos.

Código fuente en proyecto de netBeans 6.8 http://www.megaupload.com/?d=NU41A5D0

>> Reflexión en Java II, Obtener propiedades de una clase desconocidas en tiempo de ejecución

Ya hay Street view de Google Maps para León, Gto ...

April 20th, 2010 by pako received No Comments »

Pues solo para compartir via @kLandin, me he enterado que ya podemos disfrutar del street view de León Gto(la ciudad en la que radico :)), al igual que otras ciudades del país ya podemos hacer nuestro recorridos virtuales hasta los lugares lejanos que que conocemos o no conocemos o queremos recordar (yo fui a zamora Mich. :$ donde también son de los afortunados en tener disponible este servicio), anteriormente solo teníamos street view en el D.F, Guadalajara y creo Cancún, con esto se cubre gran parte del centro del país con este servicio de google, muy eficiente para ya dar con lugares o destinos que no conocemos ideal para cuando hay una peda y no sabemos donde es la casa, hacemos el map y ya podemos ver exactamente donde será la fiesta… o cuando no citemos con alguien,
bueno en lo que disfrutaba del servicio y hacia un recorrido virtual a los lugares que quería visitar. intente visitar mi universidad (UTL) pero el google no paso :( solo llego a la esquina y y no paso frente de.. misma suerte tubo mi CONALEP en Silao donde también ya esta disponible el street view, creo que en esos entonces las calles estaban con obras y por eso el google car no pudo pasar y pues no les toco salir en google, para Romita solo hay una calle en street view (de donde soy originario) así que allá todavía nos toca seguir esperando

bueno me encontre con la primera curiosidad o para mi lo es… por la carreta que pasa por UTL existen infinidad de espectaculares, buscando la forma de ver como de que tiempo son las imagenes vi un espectacular el cual tiene publicitaba un evento, me quise acercar para ver la fecha.. y doy un clic(a la izquieda) y me cambiaron el espectacular :S.. jeje una muestra que el google car pasa en diferentes ocasiones por el mismo lugar que tan distante estuvo eso pues no se por que el segundo anuncio del espectacular no tiene fecha… bueno el street view para que se den su viaje virtual a donde plazcan :) y pues a buscar curiosidades también…

Función date para formatear salida de fechas en J...

March 18th, 2010 by pako received No Comments »

en PHP existe la función date() la cual nos permite formatear la salida de una fecha, esta función no existe en JavaScript mas si el objeto Date que nos permite trabajar con fechas, ya anteriormente postié una función que creo que si se me hubiera ocurrido antes migrar date de PHP a JavaScript me hubiera ahorrado esa función :P, me faltaron algunas opciones de migrar, ya que por lo pronto no las necesito :P y todavía no entiendo muy bien como para que se usan y como obtenerlas manejando el objeto Date.

date(String Format, Date date, JSON dayLabels)

Descripción:

Retorna un String con una fecha formateada según el parámetro Format

Esta basada en la función date de PHP

Parámetros:

  • Format: es un string que contiene el patrón que con el cual se deberá formatear
    el objeto date, ejemplo: ‘d-m-Y’ o ‘D-M-Y h:m:s”

    Se soportan los siguientes parámetros son exactamente los mismo que en PHP:

    • Día
      • d: Día del mes 2 dígitos 01 a 31
      • D: String del día de la semana en tres letras
      • j: Día del mes sin ceros iniciales
      • l: Día en del día de la semana
      • N: numero del día en la semana en formato ISO-8601 (1 para el lunes y 7 para el domingo
      • * S: terminación en ingles st,nd,rd o th //falta de implementar
      • w: día de la semana 0 para domingo 6 para sábado
      • z: el día del año iniciando de 0
    • Semana
      • * W: semana en el año // Falta de implementar se encontré algunos bugs en el calculo
    • Mes
      • F: Mes en texto completo
      • m: mes del año representado en 2 caracteres 01 – 12
      • M: nombre corto del mes (3 caracteres)
      • n: mes del año representado en 1 o 12 caracteres (sin cerro iniciales)
      • t: numero de días en el mes 28-31
    • Year

      • L: cuando un año es bisiesto 1 para bisiesto 0 cuando no lo es
      • Y: el año representado en 4 dígitos 1999 o2003
      • y: el año representado en 2 dígitos 99 o 03
    • Time

      • a: am o pm
      • A: AM o PM
      • g: hora en 12 si cero inicial 1-12
      • G: hora en 24 sin cero inicial 0-23
      • h: hora en 12 con cero inicial 01-12
      • H: hora en 24 con cero inicial 00 – 23
      • i: minutos con cero inicial 00-59
      • s: segundos, con cero inicial 00-59
      • u: micro-segundos
  • date: (opcional)es un objeto Date que indique la fecha a formatear
    si se omite se operara con la fecha actual en el reloj del cliente
  • JSON dayLabels: (Opcional), es un JSON que nos permite pasar los arreglos con
    las etiquetas de los nombres de los meses y días, por defecto se
    trabaja con los nombres en Ingles

    Los arreglos que puede contener dayLables son:

    • arrMoths: Array con el nombre de los meses por defecto
      ["January", "February", "March", "April",
      "May", "June", "July", "August", "September",
      "October", "November", "December"];
    • arrDays:Array con los nombres de los dias, por defecto:
      ["Sunday", "Monday", "Tuesday", "Wednesday",
      "Thursday","Friday", "Saturday"]
    • arrDaysShort:Array con los nombres cortos(3 caracteres) de los dias
      por defecto: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri",
      "Sat"];
    • arrDayMothsShort:Array con los nombres cortos(3 caractres) de los meses
      por defecto: ["Jan", "Feb",
      "Mar", "Apr", "May", "Jun", "Jul", "Aug",
      "Sep", "Oct", "Nov", "Dec"]

Ejemplos:

 alert(date('d/m/Y'));
  fecha=new Date(2010,2,7,17,30,5);
  alert(date('d/m/Y',fecha));
  alert(date('F, j Y',fecha));
  labels={
  arrMoths:["Enero", "Febrero", "Marzo", "Abril",
                                  "Mayo", "Junio", "Julio", "Agosto", "Septiember",
                                  "Octube", "Noviember", "Diciember"],
  arrDays:["Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"]
  }
  alert(date('l j \de F \de\l Y',fecha,labels));
  alert(date('d/M/Y H:i:s',fecha));
  alert(date('d/M/Y h:i:s A',fecha));
 

By JfcoDíaz

wariodiaz@gmail.com

www.devtics.com.mx

17 Marzo del 2010

Download

/**
 * <p><b>date(String Format, Date date, JSON dayLabels)</b></p>
 *
 * <p><b>Descripción:</b><br/>
 * Retorna un String con una fecha formateada según el parámetro Format<br/>
 * Esta basada en <a href="http://php.net/manual/en/function.date.php">la función date de PHP</a>
 * </p>
 *
 * <b>Parámetros:</b>
 * <ul>
 * <li>
 * <p><b>Format:</b> es un string que contiene el patrón que con el cual se deberá formatear
 * el objeto date, ejemplo: 'd-m-Y' o 'D-M-Y h:m:s"</p>
 *
 * <p>Se soportan los siguientes parámetros son exactamente los mismo que en PHP:</p>
 * <ul>
 *  <li><b>Dia</b>
 *      <ul>
 *          <li> <b>d</b>: Día del mes 2 dígitos 01 a 31</li>
 *          <li> <b>D:</b> String del día de la semana en tres letras</li>
 *          <li> <b>j:</b> Día del mes sin ceros iniciales</li>
 *          <li> <b>l:</b> Día en del día de la semana</li>
 *          <li> <b>N:</b> numero del día en la semana en formato ISO-8601 (1 para el lunes y 7 para el domingo</li>
 *          <li> <strike><b>* S:</b> terminación en ingles st,nd,rd o th //falta de implementar</strike></li>
 *          <li> <b>w:</b> día de la semana 0 para domingo 6 para sábado</li>
 *          <li> <b>z:</b> el día del año iniciando de 0</li>
 *      </ul>
 *   </li>
 *   <li><b>Semana</b>
 *          <ul>
 *              <li><strike><b>* W:</b> semana en el año // Falta de implementar se encontré algunos bugs en el calculo</strike></li>
 *          </ul>
 *   </li>
 *   <li><b>Mes</b>
 *      <ul>
 *          <li><b>F:</b> Mes en texto completo</li>
 *          <li><b>m:</b> mes del año representado en 2 caracteres  01 - 12</li>
 *          <li><b>M:</b> nombre corto del mes (3 caracteres)</li>
 *          <li><b>n:</b> mes del año representado en 1 o 12 caracteres (sin cerro iniciales)</li>
 *          <li><b>t:</b> numero de días en el mes 28-31 </li>
 *      </ul>
 *   <li>
 *      <b>Year</b>
 *      <ul>
 *          <li><b>L:</b> cuando un año es bisiesto 1 para bisiesto 0 cuando no lo es</li>
 *          <li><b>Y:</b> el año representado en 4 dígitos 1999 o2003</li>
 *          <li><b>y:</b> el año representado en 2 dígitos 99 o 03</li>
 *      </ul>
 *  </li>
 *  <li>
 *      <b>Time</b>
 *      <ul>
 *          <li><b>a:</b> am o pm</li>
 *          <li><b>A:</b> AM o PM</li>
 *          <li><b>g:</b> hora en 12 si cero inicial 1-12</li>
 *          <li><b>G:</b> hora en 24 sin cero inicial 0-23</li>
 *          <li><b>h:</b> hora en 12 con cero inicial 01-12</li>
 *          <li><b>H:</b> hora en 24 con cero inicial 00 - 23</li>
 *          <li><b>i:</b> minutos con cero inicial 00-59</li>
 *          <li><b>s:</b> segundos, con cero inicial 00-59</li>
 *          <li><b>u:</b> micro-segundos</li>
 *      </ul>
 *    </ul>
 *
 *  </li>
 *  <li>
 *      <div><b>date:</b> (opcional)es un objeto Date que indique la fecha a formatear
 *          si se omite se operara con la fecha actual en el reloj del cliente
 *      </div>
 *  </li>
 *      <li>
 *        <p>JSON dayLabels: (Opcional), es un JSON que nos permite pasar los arreglos con
 *              las etiquetas de los nombres de los meses y días, por defecto se
 *              trabaja con los nombres en Ingles
 *        </p>
 *        <p> Los arreglos que puede contener dayLables son:</p>
 *        <ul>
 *          <li><b>arrMoths:</b> Array con el nombre de los meses por defecto
 *          ["January", "February", "March", "April",
 *                                  "May", "June", "July", "August", "September",
 *                                  "October", "November", "December"];
 *          </li>
 *          <li><b>arrDays:</b>Array con los nombres de los dias, por defecto:
 *          ["Sunday", "Monday", "Tuesday", "Wednesday",
 *                                  "Thursday","Friday", "Saturday"]
 *          </li>
 *          <li><b>arrDaysShort:</b>Array con los nombres cortos(3 caracteres) de los días
 *              por defecto: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri",
 *                                  "Sat"];
 *           </li>
 *          <li><b>arrDayMothsShort:</b>Array con los nombres cortos(3 caracteres) de los meses
 *              por defecto: ["Jan", "Feb",
 *                                  "Mar", "Apr", "May", "Jun", "Jul", "Aug",
 *                                   "Sep", "Oct", "Nov", "Dec"]
 *          </li>
 *        </ul>
 *      </li>
 *  </ul>
 * <p>
 * <b>Ejemplos</b><br/>
 * alert(date('d/m/Y'));<br/>
 * fecha=new Date(2010,2,7,17,30,5);<br/>
 * alert(date('d/m/Y',fecha));<br/>
 * alert(date('F, j Y',fecha));<br/>
 * labels={<br/>
 * arrMoths:["Enero", "Febrero", "Marzo", "Abril",<br/>
 *                                 "Mayo", "Junio", "Julio", "Agosto", "Septiember",<br/>
 *                                 "Octube", "Noviember", "Diciember"],<br/>
 * arrDays:["Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"]<br/>
 * }<br/>
 * alert(date('l j \de F \de\l Y',fecha,labels));<br/>
 * alert(date('d/M/Y H:i:s',fecha));<br/>
 * alert(date('d/M/Y h:i:s A',fecha));<br/>
 *
 * </p>
 * <div>By JfcoDíaz<br/>
 * wariodiaz&#64gmail.com<br/>
 * <a href="http://www.devtics.com.mx"> www.devtics.com.mx </a><br/>
 * 17 Marzo del 2010
 * </div>
 */
function date(strFormat,objDate,jsonTexts){
    objDate = (objDate)?objDate:new Date();
    function hr12(objDate,bwith0){
        var hr=objDate.getHours();
        hr = (hr<13)?hr:hr-12;
        return (bwith0)? ((hr<10)?"0"+hr:hr) :hr;
    }
    jsonTexts = (jsonTexts==undefined)?{}:jsonTexts;

    jsonTexts.arrMoths = (jsonTexts.arrMoths)?jsonTexts.arrMoths:
                                   ["January", "February", "March", "April",
                                   "May", "June", "July", "August", "September",
                                   "October", "November", "December"];

    jsonTexts.arrDays = (jsonTexts.arrDays)?jsonTexts.arrDays:
                                   ["Sunday", "Monday", "Tuesday", "Wednesday",
                                   "Thursday","Friday", "Saturday"];

    jsonTexts.arrDaysShort = (jsonTexts.arrDaysShort)?jsonTexts.arrDaysShort:
                                   ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri",
                                   "Sat"];

    jsonTexts.arrDayMothsShort=(jsonTexts.arrDayMothsShort)?
                                   jsonTexts.arrDayMothsShort:["Jan", "Feb",
                                   "Mar", "Apr", "May", "Jun", "Jul", "Aug",
                                   "Sep", "Oct", "Nov", "Dec"];
     var c ,dt , str="";
     for(i=0;c=strFormat[i++];){
        switch(c){

            case "\":str+=strFormat[i++];break;

            case "c":break;

            case "d":dt=objDate.getDate();
                      str+=(dt<10)?"0"+dt:dt;
                      break;

            case "D":
                      str+= jsonTexts.arrDaysShort[ objDate.getDay() ];
                      break;

            case "j":str+= objDate.getDate(); break;

            case "l":str+= jsonTexts.arrDays[objDate.getDay()]; break;

            case "N":
                dt=objDate.getDay();
                str+=(dt==0)?7:dt;
                break;
            case "S":break;

            case "w":str+=objDate.getDay();break;

            case "z":
                    dt=new Date(objDate.getFullYear(), 0, 1);
                    str+= Math.floor(((((objDate.valueOf() - dt.valueOf())/1000)/60)/60)/24);
                    break;
            case "W":
                //pendiente de implementar
//                    dt = new Date(objDate.getFullYear(),0,1);
//
//                    str+= (Math.ceil(
//                               ( (parseInt(date("z",objDate),10))/7)))+
//                                   ((dt.getDay()>0)? -1 : 0);
               //     str+=objDate.getWeekNumber();
                    break;
            case "F":

                        str+=jsonTexts.arrMoths[ objDate.getMonth() ];
                    break;
            case "m":
                      dt=objDate.getMonth()+1;
                      str+=(dt<10)?"0"+dt:dt;
                      break;
            case "M":
                        str+= jsonTexts.arrDayMothsShort[ objDate.getMonth() ];
                     break;
            case "n":str+=objDate.getMonth()+1;
                     break;
            case "t":
                switch(objDate.getMonth()+1){
                   case 4: case 6: case 9: case 11:str+="30"; break;
                   case 2:
                       str+=(date("L",objDate)==="1")? "29" : "28";
                       break;
                   default :str+="31";
                }

                break;
            case "L":
                    dt=objDate.getFullYear();
                    str+=((dt % 4 == 0 && dt % 100 != 0) || dt % 400 == 0)?"1":"0";
                break;
            case "Y":
                     str+=objDate.getFullYear();
                     break;
            case "y":
                     str+= objDate.getFullYear().toString(). substr(2,2);
                    break;
            case "a":
                    str+=(objDate.getHours()<12)?'am':'pm';
                break;
            case "A":
                    str+=(objDate.getHours()<12)?'AM':'PM';
                break;
            case "g":
                    str+=hr12(objDate);
                break;
            case "G":
                    str+=objDate.getHours();
                break;
            case "h":
                    str+=hr12(objDate,true);
                break;
            case "H":
                    dt=objDate.getHours();
                    str+= (dt<10)? "0"+dt : dt;
                break;
            case "i":
                    dt=objDate.getMinutes();
                    str+=(dt<10)?"0"+dt:dt;
                break;
            case "s":
                    dt=objDate.getSeconds();
                    str+=(dt<10)?"0"+dt:dt;
                    break;
            case "u":
                    str+=objDate.getMilliseconds();
                break;
            default :str+= c;break;
        }
     }
     return str;
}

addTimeToDate Sumar/Restar Tiempo a Fechas JavaScr...

March 11th, 2010 by pako received 6 Comments »
Date addTimeToDate(int time, String unit, Date date,Boolean referencia) (v1.1)
Descripción:Suma o Resta tiempo a una fecha(objeto Date), puede ser usada tanto para
agregar como quitar tiempo a una fecha, el tiempo se da en milisegundos,
segundos, minutos, horas, días, meses o años
Parámetros:

  • Time:Entero con la cantidad de unidades de tiempo a sumar a
    la fecha
  • Unit: String con el tipo de unidades que se agregaran a la fecha
    • y: Años
    • M: Meses
    • w: Semanas
    • d: Días
    • h: Horas
    • m: Minutos
    • s: Segundos
    • “”: (En blanco o cualquier otro) Milisegundos
  • Date: Objeto Date al que se le sumara el tiempo Indicado
  • dateReference: es un booleano
    • true indica que
      se operará directamente en el objeto Date pasado en el tercer parámetro,
      de igual forma se retorna la referencia al final de su ejecución.
    • false, la función creara un nuevo objeto Date y lo retornara
      al final de su ejecución sin afectar el objeto Date original

Retorno: Objeto Date, con la nueva fecha resultante de la suma de tiempos

Download

 /**
* <div>
*        <b>Date addTimeToDate(int time, String unit, Date date,Boolean referencia)</b> (v1.1)
*   </div>
*   <div>
*   <b>Descripción</b>:Suma o Resta tiempo a una fecha(objeto Date), puede ser usada tanto para
*    agregar como quitar tiempo a una fecha, el tiempo se da en milisegundos,
*    segundos, minutos, horas, días, meses o años
*   </div>
*   <div>
*    <b>Parámetros:</b>
*    <ul>
*        <li><b>Time</b>:Entero con la cantidad de unidades de tiempo a sumar a
*                   la fecha</li>
*        <li><b>Unit:</b> String con el tipo de unidades que se agregaran a la fecha
*            <ul>
*                <li><b>y</b>: Años</li>
*                <li><b>M</b>: Meses</li>
*                <li><b>w</b>: Semanas</li>
*                <li><b>d</b>: Días</li>
*                <li><b>h</b>: Horas</li>
*                <li><b>m</b>: Minutos</li>
*                <li><b>s</b>: Segundos</li>
*                <li><b>""</b>: (En blanco o cualquier otro) Milisegundos</li>
*            </ul>
*        </li>
*        <li><b>Date</b>: Objeto Date al que se le sumara el tiempo Indicado</li>
*        <li><b>dateReference</b>: es un booleano
*               <ul>
*              <li><b><i>true</i></b> indica que
*              se operará directamente en el objeto Date pasado en el tercer parámetro,
*              de igual forma se retorna la referencia al final de su ejecución.</li>
*
*              <li><b><i>false</i></b>, la función creara un nuevo objeto Date y lo retornara
*                al final de su ejecución sin afectar el objeto Date original
* </li>
* </ul>
*        </li>
*   </ul>
*  <b>Retorno: </b> Objeto Date, con la nueva fecha resultante de la suma de tiempos
*  </div>

* <div>
* By: JFcoDiaz <br/>
* wariodiaz&#64;gmail.com<br/>
* www.devtics.com.mx<br/>
* Licencia GPLv3/MIT
*
* 9 de Mazo del 2010
* Update V1.1
* 20/Jun/2010
* </div>
*/

function addTimeToDate(time,unit,objDate,dateReference){
    var dateTemp=(dateReference)?objDate:new Date(objDate);
    switch(unit){
        case 'y': dateTemp.setFullYear(objDate.getFullYear()+time); break;
        case 'M': dateTemp.setMonth(objDate.getMonth()+time); break;
        case 'w': dateTemp.setTime(dateTemp.getTime()+(time*7*24*60*60*1000)); break;
        case 'd': dateTemp.setTime(dateTemp.getTime()+(time*24*60*60*1000)); break;
        case 'h': dateTemp.setTime(dateTemp.getTime()+(time*60*60*1000)); break;
        case 'm': dateTemp.setTime(dateTemp.getTime()+(time*60*1000)); break;
        case 's': dateTemp.setTime(dateTemp.getTime()+(time*1000)); break;
        default : dateTemp.setTime(dateTemp.getTime()+time); break;
    }
    return dateTemp;
}

para restar tiempo a la fecha, solo pasa el valor en negativo ;)

Ejemplo:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="addTimeToDate.js" type="text/javascript"></script>
    </head>
    <body>
        <script type="text/javascript">
            /* www.devtics.com.mx
             * By Jfco Diaz
             * @fcodiaz
             * 22/06/2010
             * Licencia GPLv3/MIT
             **/
            var hoy=new Date();//se crea el objeto Date a la fecha actual
            function printBr(txt){
                document.write(txt+"<br/>");
            }
            function printHr(txt){
                document.write(txt+"<hr/>");
            }
            printHr("Hoy Es "+hoy);

            printBr("Hoy + 700000 milisegundos "+addTimeToDate(700000, '', hoy));
            printHr("Hoy - 700000 milisegundos "+addTimeToDate(-700000, '', hoy));

            printBr("Hoy + 150 segundos "+addTimeToDate(150, 's', hoy));
            printHr("Hoy - 150 segundos "+addTimeToDate(-150, 's', hoy));

            printBr("Hoy + 10 min  "+addTimeToDate(10, 'm', hoy));
            printHr("Hoy - 20 min  "+addTimeToDate(-20, 'm', hoy));

            printBr("Hoy + 2 hrs  "+addTimeToDate(5, 'h', hoy));
            printHr("Hoy - 5 hrs  "+addTimeToDate(5, 'h', hoy));

            printBr("Hoy + 5 dias "+addTimeToDate(5, 'd', hoy));
            printHr("Hoy - 10 dias "+addTimeToDate(-10, 'd', hoy));

            printBr("Hoy + 2 semanas "+addTimeToDate(2, 'w', hoy));
            printHr("Hoy - 2 semanas "+addTimeToDate(-2, 'w', hoy));                        

            printBr("Hoy + 5 mese "+addTimeToDate(5, 'M', hoy));
            printHr("Hoy - 5 meses  "+addTimeToDate(-5, 'M', hoy));            

            printBr("Hoy + 12 año  "+addTimeToDate(12, 'y', hoy));
            printHr("Hoy - 12 min  "+addTimeToDate(-12, 'y', hoy));

            /* Si se pasa como cuarto parámetro un true addTimetoDate usa el objetoDate
             * como referencia y modifica el objeto directamente,
             *  -*no crea un nuevo objeto Date
             **/
            printBr(hoy);
            addTimeToDate(5,'d',hoy,true);
            printBr(hoy);
            /*
             * Si se omite el cuarto parámetro o se pasa un false(por defecto)
             * addTimeToDate *crear un nuevo objeto* y opera sobre este dejando
             * intacto el objeto original, al final regresa el objetoDate temporal
             * o la referencia al objetDate original según se indico en el
             * tercer parámetro
             **/
        </script>
    </body>
</html>

Ver Ejemplo

Mi Primer Aplicación de Escritorio en PHP + GTK2

March 10th, 2010 by pako received 1 Comment »

Ya hace algún tiempo fácil unos 3 años se de la posibilidad de crear aplicaciones de escritorio con PHP, así es, una parte muy desconocida de este lenguaje es que fusionándose con la librería GTK se pueden crear entornos de escritorio, por decidía y falta de tiempo no he entrado en este campo de PHP aparte que no lo he requerido, hoy hace 4 hrs tenia que hacer una aplicación y dije ha estaría chido hacerla en PHP+GTK haber vamos a ver como se maneja!, ya estuve navegando un rato, leí el introductorio, baje los dos primeros ejemplos y realice mi primera aplicación utilizando esta tecnologías combinadas. y aquí esta mi aplicacioncita de sumar dos números =D, nada mal para solo haber visto solo 2 ejemplos y tener 4 hrs en el tema :), veo que es un tema muy poco documentado en español así que muy posiblemente estaré postiando mas sobre este tema.

Aquí el Código de mi aplicación

<?php
if (!class_exists('gtk')) {
   die("Esto es una aplicación PHP+GTK2 no tienes gtk instalado");
}

function suma(GtkWindow $wnd,GtkEntry $txtN1,GtkEntry $txtN2, GtkLabel $lbRes){
   $lbRes->set_text(" = " .  ($txtN1->get_text()+$txtN2->get_text() ));
}

$wnd = new GtkWindow();
$wnd->set_size_request(170, 70);
$wnd->set_title('Programa de Suma en PHP-GTK2');
$wnd->connect_simple('destroy', array('gtk', 'main_quit'));
$wnd->show_all();
$btnSum = new GtkButton('_Sumar');
$txtN1 =  new GtkEntry();
$txtN2 = new GtkEntry();
$lb1 = new GtkLabel("+");
$lbRes = new GtkLabel(" = ");
$txtN1->set_size_request(40, 20);
$txtN2->set_size_request(40, 20);
$lbRes->set_size_request(30, 20);
$btnSum->connect_simple('clicked', 'suma', $wnd, $txtN1, $txtN2,$lbRes);
$table=new GtkTable(5,2);
$table->attach($txtN1, 0, 1, 0, 1);
$table->attach($lb1,   1, 2, 0, 1);
$table->attach($txtN2, 2, 3, 0, 1);
$table->attach($lbRes, 3, 4, 0, 1);
$table->attach($btnSum, 0, 5, 1, 2);
$wnd->add($table);
$wnd->show_all();
Gtk::main();
?>
Así se ve en Windows Xp Sp3.

y Así en Linux Ubuntu 9.10

De entrada veo la desventaja de que no existe una IDE para realizar el diseño de las interfaces arrastrado (no que yo sepa hasta ahorita) como VisualStudio para .net o NetBeans para Java por lo que los controles hay que escribirlos a manita esto es una desventaja vs los lenguajes que si lo tienen .net o Java etc, aunque sigue siendo mucho menos el código que se necesita codificar para crear la interfaces en PHP que en java por ejemplo, pero pues son lineas que una interfaces nos podría evitar y como siempre enfocarnos en la solución del problema.

Update: 16 Marzo 2010

Ya encontré la forma de crear la GUI desde un programa que se llama Glade, la verdad aun no lo he echando a andar, he tenido problemas al importar, Glade es una herramienta para crear GUI’s con los controles GTK en genera no para un lenguaje en especifico en si no es un IDE, los archivos que maneja glade son XML los cuales en teoría se deberían de importar en lenguaje que se quisieran programar, en PHP+GTK se carga el xml y sólito crea los objetos que requerimos y solo nos restaría la asignación de evento, mas adelante les comentare que tal funciona esto y como hacerlo… cuando me salga ahorita tengo problemas al momento de importar el xml a php, encontré unos ejemplos y funcionan bien pero mis interfaces nada mas no jalan :( bueno ya les contare.. ;), se agradece la mención de glade en twitter de @pstglia

Saber si una fecha se encuentra entre dos [JavaScr...

March 9th, 2010 by pako received No Comments »

Aquí les dejo otra función, esta nos sirve para saber si una fecha esta entre un margen de tiempo, no sirve desde saber si un día o una hora se encuentra entre una hora que comprenda un rango de una hora de inicio y una hora de fin


/**
* betweenDate(dateBegin, dateFinish, dateTest)
*
* retorna true si dateTest se enctra entre dateInicio y dateFinish o bien
* false si no se encuntra en el margen ya sea que sea una fecha anterior a
* date Inicio o posterior a dateFinish
*
* Parametros:
* – dateBegin, objeto Date con la fecha de Inicio
* – dateFinish, objeto Date con la fecha de Fin
* – dateTest, objeto Date a evaluar si se encuentra en el margen de dateBegin y
* dateFinish
*
*
* by: JFcoDiaz
* wariodiaz@gmail.com
* @fcodiaz
* www.devtics.com.mx
* —————————-
* alert(
* betweenDate(
* new Date(2007,0,1,0,10),
* new Date(2007,0,1,0,50),
* new Date(2007,0,1,0,51)
* )
* );
**/
function betweenDate(dateBegin,dateFinish,dateTest){
return (dateBegin.valueOf()<=dateTest.valueOf() &&
dateFinish.valueOf()>=dateTest.valueOf());
}
[/javaScript]

Pasar un Datetime MySql a Date JavaScript

March 9th, 2010 by pako received No Comments »

Función para pasar un string con un datetime de MySQL a un objeto Date de JavaScript

/***
 * MySqlDatetime2jsDate(strDatetime)
 *
 * retorna un objeto Date a partir de una cadena de fecha con formato datetime
 * ("yyyy-mm-dd hh:mm:ss") de MySQL
 *
 * By Jfco Díaz
 * www.devtics.com.mx
 * wariodiaz@gmail.com
 * 9 Mazo 2010
 */
/***
 * MySqlDatetime2jsDate(strDatetime)
 *
 * retorna un objeto Date a partir de una cadena de fecha con formato datetime
 * ("yyyy-mm-dd hh:mm:ss") de MySQL
 *
 * By Jfco Díaz
 * www.devtics.com.mx
 * wariodiaz@gmail.com
 * 9 Mazo 2010
 */
function MySqlDatetime2jsDate(strDatetime){
    strDatetime = strDatetime.split(" ");
    var date = strDatetime[0].split("-");
    var time = strDatetime[1].split(":");
    return new Date(date[0], date[1]-1, date[2], time[0], time[1], time[2]);
}

Respalda en Megaupload

March 9th, 2010 by pako received No Comments »

Uno de los objetivos de la red es el intercambio de archivo (algunos legales algunos no tanto), la forma de compartir nuestros archivos a través de Internet han ido cambiando, en estos últimos años para mi la mejor forma de compartir es por las DD (Descargas Directa) aunque los servidores ofrecen el servicio gratuito no esta de mas pagar la verdad si eres filemanico como yo si que desquita el adquirir una membrecía premium. hasta hoy no soy participe de los wares mas que como usuario de desccarga, pero en estos días tengo un montón de archivos que deseo respaldar por que me he quedado casi sin espacio en el HD, la primera alternativa fue enviarme mis archivos a cuentas gmail, algo factible lo malo que muchos de los archivos que quiero respaldar sobrepasan los 25Mb que es el máximo que se pueden adjuntar ademas que son como 40GB’s.

Entonces voltee a ver a megaupload, como usuario registrado(no premium) te dan 200GB(ilimitado con premium) para almacenar lo que tu quieras, espacio suficiente para lo que necesito, con la condición que se tiene que descargar en 90 días el archivo para que este no sean eliminado y que no viole sus políticas que en resumen son no pornografía infantil ni piratería, si compras una membrecía que para mi no son caras una vitalicia esta en $2,000MX aprox., una anual esta como en $900MX no te tienes que preocupar por esto de la descarga en 90 día, si no solo hay que estar al pendiente que nuestros archivos no venzan, aparte hay un sistema de premios que si bien son tentativos son difíciles de alcanzar a menos que subas y compartas archivos de legalidad dudosa lo cual si bien lo puedes hacer pero tienes que buscar la forma de cuidar tu anonimato y si te cachan pues el dueño puede exigir a megaupload que borre tu archivo y con ello se va el premio que podrías haber ganado.

lo que se me hizo muy interesante y por lo que escribo este post aparte de la reseña de uso del servicio es que me di cuenta que al respaldar un archivo que fue descargado del servidor, este no lo vuelve a subir, lo que hace es que primero verifica el archivo y si no me equivoco lo busca muy probablemente con la suma md5 del archivo si este ya se encuentra en los servidores solo se crea una liga de tu cuenta al usuario evitando volver a subir los archivos aunque por lo que vi si tienes que descargar el archivo antes, esto esta bien para todos los que descargamos archivos de otros usuario y queremos una copia de seguridad de dicho archivo, nos ahora mucho tiempo y a megaupload espacio en sus discos duros, yo me di cuenta al respaldar una iso de 600MB que se subió en 20 segundos, dije !no puede ser¡ verifique y la descargue mi archivo y todo bien, intente con algunos otros archivos y de igual forma se “subieron” pero mas bien se creo una liga de mi cuenta al archivo sin que yo tuviera que volver a subir todo el archivo.

por ahora soy usuario registrado espero juntar algo de dinero para comprar una cuenta vitalicia la verdad creo que es un servicio que vale la pena sobretodo de respaldo de nuestros archivos, y para compartir una que otra cosa con el Internet y hay un método para refrescar la caducidad de los archivos que les comentare en otro post, ademas que viendo la interfaces y haciendo un poco de re-ingeniería inversa :) creo que puedo crear una aplicación que nos simplifique el trabajo… =D

funcion PHP is_arr_num saber si un arrays es numer...

February 26th, 2010 by pako received 1 Comment »

PHP maneja dos tipos de arreglos(arrays) numéricos y asociativos, los primeros son arreglos que manejan indices de 0 a n de forma secuencial ejemplo

$a=array(1,2,3,"hola Mundo","devTics");
print_r($a);
/*
out:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => hola Mundo
    [4] => devTics
)
*/

o bien los asociativos, que son arreglos que utilizan cadenas como indices

$a=array("nombre"=>pako, "web"=>"http://www.devtics.com.mx", "twitter"=>"@fcoDiaz");
print_r($a);
/*
out:
Array
(
    [nombre] => pako
    [web] => http://www.devtics.com.mx
    [twitter] => @fcoDiaz
)
*/

en unos de mis tantos días de trabajo me encontré con la necesidad de saber si un arreglo es asociativo o bien si es numérico, aunque también puede estar “combinados”, pero cualquier arreglo con un indice que sea un “string” debería de considerarse como asociativo aunque el resto de los indices sean numéricos ya sea consecutivos o no.

PHP tiene una función que nos permite saber si una variable es un array (is_array), pero no existe una que indique si es asociativo o no, para eso cree esta función que nos retorna true si se trata de un arreglo numérico, si encuentra un indice que no sea numérico nos retornara un false lo que nos indicara que se trata de un array asociativo

<?php
/**
 * @author fcoDiaz <wariodiaz@gmail.com> *
 * @name is_array_num
 * @link http://www.devtics.com.mx
 * @param $arr arreglo a evaluar
 * @return boolean
 * <p><b>true:</b> si el arreglo es numerico, se considera numerico el array
 * que tenga solamente indices numericos ya sea consecutivos o no</p>
 * <p><b>false:</b> si el arreglo es asociativo, se cosidera asociativo el array
 * cuando este contiene un indice que no sea numerico</p>
 * <code>
 * $a = array(
 *   array(1,2,3),
 *   array('nombre'=>"pako", "email"=>wariodiaz@gmail.com, "web"=>"www.devtics.com.mx"),
 *   array(0=>1,1=>4,"saludo"=>"hola Mundo")
 * );
 *
 * foreach($a as $i =>$v)
 *    if(is_arr_num($v))
 *      echo "$a[$i] es numericon";
 *    else
 *      echo "$a[$i] es asociativon";
 * out:
 * $a[0] es numerico
 * $a[1] es asocitivo
 * $a[2] es asocitivo
 * </code>
 */

function is_arr_num($arr){
    if(!is_array($arr))return false;
    foreach($arr as $i =>$v){
        if(!is_numeric($i))return false;
    }
    return true;
}
?>

keyValue jQuery y mi reseña sobre jQuery

February 19th, 2010 by pako received 3 Comments »

En estos días he estado trabajando y aprendiendo jQuery, si bien ya he postulado mi punto de vista sobre el uso de frameworks, y lo sigo manteniendo, la gran mayorías de las cosas que JQuery hace las se hacer desde JavaScript puro, y por motivos de trabajo indague en esta librería, que si bien se presta a mucho copy paste y de mas fanfaronada(hacer lo que no se hacer gracias al framework) que es lo que me desagrada de lo que hay alrededor de estas herramientas.

bueno lo que me agrado de jQuery a contra de los que a muchos le llama la atención(las animaciones), lo que creo que son sumamente buenos y una excelente idea son sus selectores que si no me equivoco de alli viene su nombre “Query”, en esta forma de trabajar la verdad jQuery se lleva un 100% ya que ayuda mucho y simplifica el manejo del DOM, solo que hay que tener cuidad de no llamar mucho a los selectores si no tratar de mantener enlaces de memoria a ellos ya que cada que se llama a $() se genera un nuevo objeto jQuery y para que rehacer algo que ya tenemos en memoria, y esto afecta el rendimiento de la aplicación (se hacen algoritmos de mas) aunque esto pasa en todo los framework si no se saben controlar .

otra cosa que me agrado fue la extensión en plugin, y aquí es donde me gustaría enfocarme ahora, me gusta mucho crear librerías, en este post les traigo mi primer plugin para jQuery, es un plugin el cual nos permite colocar un filtro a campos de textos para filtrar los caracteres que se permitirán en el campo de texto, por ejemplo para evitar que el usuario ingrese letras en un campo solo numero, o caracteres no permitidos en un password etc.

sin mas les dejo el código fuente de mi primer plugin
Download: http://www.megaupload.com/?d=JVHRIHMK

/*
 * $.fn.keyValue(exp,maxlength)
 * By JFco Diaz.
 * wariodiaz@gmail.com
 * www.devtics.com.mx
 * 19/02/2010
 * plugin jQuery, para evaluar una entrada en un input x expresión regular
 * y poder discriminar el carácter si no se encuentra en la expresión regular
 * evitando su inserccion
 *
 * @param expOarr, es un arreglo de caracteres y/o enteros que representen
 * el charCode del carácter a permitir, o bien una expresión regular que indique
 * en el patrón los caracteres que se permitirán, ademas opcionalmente coloca un
 * máximo de caracteres permitidos
 * Nota: la evaluación es del carácter que se esta tecleado no sobre la cadena ingresada
 *
 * ejemplo:
 *
 * $(".soloNumeros").keyValue(/[0-9]/);
 *
 * $(".soloNumeros").keyValue([0,1,2,3,4,5,6,7,8,9]/);
 *
 * ambos solo permiten la entrada de números o solo caracteres en minúsculas
 *
 * $(".soloNumeros").keyValue(/[a-z]/);
 *
 * o solo numeros y "-" y solo 10 caracteres
 *
 * $(".soloNumeros").keyValue([0,1,2,3,4,5,6,7,8,9,'-'],10);
 *
 * o con expresión regular
 *
 * $(".soloNumeros").keyValue(/[0-9-]/,10);
 *
 * */
(function ($){
    $.fn.keyValue=function(expOarr,maxLength){
        try{
            var $this=$(this);
            if(maxLength)
                $this.attr("maxlength",maxLength);
            $this.keypress(function(event){
                try{
                    var key = event.which;
                    if(key==0||event.charCode==0)return true;
                    if(maxLength && this.value.length==maxLength)return false;
                    if(typeof expOarr ==='object'&& expOarr.length!=undefined){
                        for(var i=0;(exp=expOarr[i++]);)
                            if(key==((typeof exp=="number")? exp : exp.charCodeAt(0)))
                                return true;
                        return false;
                    }
                    return expOarr.test(String.fromCharCode(key));
                }catch(e){
                    alert(e.message);
                }
            });
        }catch(e){
            alert(e.message);
        }
        return $this;
    }
})(jQuery);