jueves, 13 de septiembre de 2012

PHP 5.2 y operaciones de fecha

Recientemente me encontraba desarrollando una aplicación web para PHP y configuré mi ambiente de desarrollo con un WAMP, que contenía una versión de PHP superior a la 5.3.  Encantado comencé a utilizar operaciones y funciones de su orientación a objetos, pero al pasar a ambiente de producción, me doy cuenta de que utilizaba una versión anterior de PHP ¡que no soporta funciones de objeto DateTime!

Especificamente, sumar y restar fechas, DateTime::add y DateTime:sub, ni sus equivalentes en procedural date_add() y date_sub.

Esto implicó una recodificación (aunque no tan larga) y la creación de funciones que permitiran hacer las operaciones con una facilidad parecida a la de las funciones no soportadas.

Para resolver el problema, en una librería general codifiqué funciones para agregar las fechas, sean positivas o negativas, eliminando la necesidad de tener un date_add y un date_sub. Una función por cada intervalo que necesitaba, como lo maneja C#.

A continuación expongo un ejemplo de la función para agregar días.


    /**
    *
    * Agrega dias a una fecha
    * @param datetime $date
    * @param int $days
    * @return DateTime
    */
    function add_days($date, $days)
    {
      // Inicializamos el símbolo, como "más" ( + )
      $symbol = '+';
     
      //    Si días es menor a 0, es decir, negativo
      if ( $days < 0 )
      {
            //    Configuramos el símbolo como "menos" ( - )
            $symbol = '-';
      }
     
      //    Hacemos la operación y la guardamos en result
      //    Convirtiendo a UNIXTIME mediante strtotime
      //    el intervalo y la fecha
      $result = strtotime (
            '+' . $days . ' day' ,
            strtotime (
                  date_format($date, 'Y-m-d')
            )
      );
     
      //    Regresamos una fecha, a partir del resultado
      //    transformado a formato Y-m-d
      return date_create( date( 'Y-m-d', $result ) );

    } // end function add_days
 
Siguiendo este ejemplo, podemos codificar las funciones para semanas, meses, años, etc.

martes, 4 de septiembre de 2012

Como reestablecer los archivos recuperados por ChkDsk

Cuando utilizas el ChkDsk (o cuando al iniciar Windows este lo corre automáticamente) y este arroja errores, los archivos que este "recupera" normalmente los almacena dentro de un archivo found.000, en el directorio raíz del disco que contenia los errores.

Este archivo actua como una carpeta en realidad, y dentro de la misma ChkDsk guarda archivos *.chk, con la siguiente nomenclatura dirXXXX.chk, donde XXXX comienza en 0000 y se va elevando según el número de archivos, es decir, puede contener el archivo dir0000.chk, dir0001.chk, dir0002.chk, y así sucesivamente.

Pues bien, estos archivos tambien actuan como carpetas y dentro contienen los archivos recuperados por ChkDsk.

Normalmente estos archivos son invisibles y no pueden ser navegados desde el explorador de Windows Para recuperarlos totalmente al sistema de archivos, utiliza el command.exe (ó simbolo de sistema, como lo llama Windows) y mediante comandos DOS podrás realizar las operaciones para la recuperación.

Primero que nada, asegurate de usar command.exe con privilegios de administrador.

Ahora, busca dentro del directorio raiz del disco que tuvo los errores el archivo found.000. Puedes realizar la busqueda con el comando:
dir *.000

Si no lo encuentras, puedes usar la excelente aplicación freeware Space Sniffer, en la que podrás visualizar el contenido de todo el disco.

Una vez localizado el archivo, tratalo como un directorio, navegando hacia el con el comando cd:
cd found.000

Una vez que hayas navegado al archivo, realiza el comando dir. Este te mostrará los archivos *.chk que contiene el archivo found.000.

Ahora, cada archivo *.chk se comporta como una carpeta, por lo que puedes copiar su contenido a otro directorio. Crea una nueva carpeta llamada Recovery en el disco duro (preferentemente en uno diferente al que tuvo errores). Dentro de esa carpeta, crea tantos directorios como archivos *.chk tengas dentro de found.000.

Es decir, para el archivo found.000/dir0000.chk, crea la carpeta Recovery/dir0000, para el archivo found.000/dir0001.chk, crea la carpeta Recovery/dir0001 y así sucesivamente.

Posteriormente, navega a cada archivo *.chk con el comando cd, dentro de found.000 usa el comando:
cd dir0000.chk

Posteriormente utilza el comando cp con la siguiente sintaxis: cp -apv . [directorio destino]
Ejemplo:
cp -apv . Recovery/dir0000

Esto copiará el contenido del archivo dir0000.chk a la carpeta dir0000.

Realiza la misma operación con todos los archivos *.chk que existan dentro de found.000.

Una vez que hayas recueperado todos tus archivos, debemos eliminar el archivo found.000, ya que no lo necesitaremos más. Esto no puede efectuarse desde Windows, así que debemos utilizar un live CD como los que distribuye Ubutu, para bootear desde el CD y usar el sistema operativo desde el mismo.

Para ello, inserta el Live CD dentro del drive de Disco, reinicia la computadora y entra a BIOS para cambiar el dispositivo de booteo al drive del CD. Luego graba los cambios y sal del BIOS. La computadora arrancará ahora desde el CD que contiene Ubuntu.

Una vez que hayas ingresado a Ubuntu, este te preguntará si deseas intentar el Live CD o instalar Ubuntu. Como solo queremos borrar un archivo. ingresaremos al Live CD.

Una vez dentro, en "Places" selecciona el disco duro que contiene found.000. Ubuntu lo tratará como una carpeta, así que la puedes eliminar sin problemas. Cerciorate tambien de eliminarla de la Bandeja de Basura (Trash). Con esto podemos salir de Ubuntu, regresar a Windows y verificar que realmente el archivo found.000 ya no existe.