viernes, 30 de diciembre de 2011

Juegos con el tiempo (la función time())

La función time() devuelve, en tiempo unix,  la fecha del momento en que se ejecuta el script. El tiempo unix cuenta el tiempo, en segundos, a partir de las 0:00 horas (GMT) del 1 de enero de 1970 (algo más de un año antes de mi nacimiento).
Esto quiere decir que, el siguiente código php:

<?php
echo time ();
?>

devuelve, en el momento que estoy escribiendo esta entrada (23 de diciembre de 2011) lo siguiente:



Si a ese número, 1.324:641.094, lo guardamos en una variable, que llamaré $original, y con ella hacemos algunas divisiones, utilizando operadores aritméticos, podríamos convertir esa cantidad inimaginable de segundos, en algo más entendible:

<?php
$original=1324641094;
$uno=($original / 60);
$segundos=($original % 60);
$dos=($uno /  60);
$minutos=($uno % 60);
$tres=($dos / 24);
$horas=($dos % 24);
$cuatro=$tres-10;
$anios=floor($cuatro / 365);
$dias=($cuatro % 365);
$meses=floor($dias / 30);
$dias=($dias % 30);
echo $anios." a&ntilde;os, ".$meses." meses, ".$dias." d&iacute;as, ".$horas." horas, ".$minutos." minutos y ".$segundos." segundos.";
?>

El resultado de este script sería el siguiente:



Como ven, convierte esa cantidad de segundos transcurridos entre el 1 de enero de 1970 y el 23 de diciembre de 2011 en su equivalente en años, meses, días, etc.
Explico el script, línea por línea:
  1. Marca de apertura del script PHP
  2. Define la variable $original conteniendo el número 1324641094 que corresponde al total de segundos.
  3. Define la variable $uno conteniendo el resultado de dividir la variable $original entre 60, para obtener el total de minutos.
  4. Halla el resto de la división de la línea anterior, o sea los segundos que "sobran" y no completan el minuto. Este valor lo guarda en la variable $segundos, una de las que se va a imprimir en la línea 14.
  5. Define la variable $dos como el resultado de dividir $uno (el total de minutos) entre 60 para obtener el total de horas.
  6. Halla el resto de la división de la línea anterior, o sea los minutos que "sobran" y no completan la hora. Este valor lo guarda en la variable $minutos, otra de las que se va a imprimir en la línea 14.
  7. Define la variable $tres como el resultado de dividir $dos (el total de horas) entre 24 para obtener el total de días.
  8. Halla el resto de la división de la línea anterior, o sea las horas que "sobran" y no completan el día. Este valor lo guarda en la variable $horas, otra más de las que se van a imprimir en  la línea 14.
  9. Desde 1970 hasta la fecha, han habido 10 años bisiestos, o sea de 366 días. Así que para la operación a realizarse en la línea siguiente es necesario quitar de los días totales ($tres) esos 10 días (para poder considerar todos los años iguales, de 365 días). El resultado de esta resta se guarda en la variable $cuatro. Para usar este script a partir del 29 de febrero de 2012, serán 11 los años bisiestos, por lo que la resta el sustraendo pasará a ser 11.
  10. Define la variable $anios, como el resultado de dividir $cuatro (el total de días, menos los 29 de febrero) entre 365.
    La función floor redondea el resultado hacia abajo, ignorando los números después de la coma en el resultado de la división. Esta variable $anios, es una de las que se imprimen en la línea 14.
  11. Halla el resto de dividir $cuatro (la cantidad de días totales, menos los 10 días "extras" de los años bisiestos) entre 365 y guarda el resultado, o sea los días que "sobran" y no completan un año, en la variable $dias.
  12. Define la variable $meses, como el resultado de dividir $dias (los días "sobrantes") entre 30 (*).
    La función floor redondea el resultado hacia abajo, ignorando los números después de la coma en el resultado de la división. Esta variable $meses, es una de las que se imprimen en la línea 14.
  13. Halla el resto de la división de la línea anterior, o sea, los días que "sobran" y no completan el mes. Este valor lo guarda en la variable $dias, y le sobrescribe el valor que tenia previamente. Esta es la última de las variables que se van a imprimir en la línea 14.
  14. Finalmente, con echo, se procede a imprimir en la pantalla los contenidos de las variables evocadas y  concatenados con los textos que se muestran entre comillas, para dar el resultado que se ve en la captura de pantalla anterior.
  15. Marca de cierre del script PHP

El mismo resultado se obtendría escribiendo menos líneas, de la siguiente manera:

<?php
$original=1324641094;
$segundos=($original % 60);
$minutos=(($original / 60) % 60);
$horas=((($original / 60)/  60) % 24);
$anios=floor((((($original / 60)/  60) / 24)-10) / 365);
$meses=floor(((((($original / 60)/  60) / 24)-10) % 365)/ 30);
$dias=(((((($original / 60)/  60) / 24)-10) % 365) % 30);
echo $anios." a&ntilde;os, ".$meses." meses, ".$dias." d&iacute;as, ".$horas." horas, ".$minutos." minutos y ".$segundos." segundos.";
?>

Estos dos scripts devuelven siempre el mismo resultado, ya que parten de una variable  con contenido fijo. Si se modifica la línea en la que se define la primera varible (o sea $original=1324641094;) por $original=time(); el resultado del script es distinto cada vez que se ejecuta (ya que el contenido de $original cambiaría cada segundo). Hagan la prueba.

(*) El resultado no es exacto, ya que  se consideraron todos los meses como de 30 días.
Para obtener un resultado exacto (aunque sin horas, ni minutos, ni segundos),  se podría utilizar un script de Webtutoriales.com que, levemente modificado, da el siguiente resultado:


Las pequeñas modificaciones que le hice al código original son, por ejemplo, ingresarle las fechas que me interesan para este ejemplo (01/01/1970 y  23/11/2011) y cambiar la forma que se muestran los datos que devuelve el script para que se mostraran de forma similar a los scripts anteriores.

Como pueden ver, el error del script que hice yo a lo "bruto" es de unos 4 días con respecto al correcto script de Webtutoriales.com.

lunes, 26 de diciembre de 2011

¡Hola, Mundo!

Ya instalé XAMPP y ya sé dónde guardar los archivos para que el servidor web los pueda interpretar.
Así que ahora voy a hacer la primera página con PHP, con el clásico saludo de "¡Hola, Mundo!", para probar que todo esté funcionando bien.
En cualquier editor de texto (yo utilicé Kate) hay que escribir lo siguiente (sin los números de línea):

<?php
echo "&iexcl;Hola, Mundo!"
?>

Luego, guardar el archivo como index.php en el directorio correspondiente. Arrancamos el servidor XAMPP, y, al ir a http://localhost en el navegador web, se debería ver algo así:


Lecturas recomendadas

jueves, 22 de diciembre de 2011

¿Dónde se guardan los archivos del proyecto web?

Ya instalé XAMPP.
Para que el servidor XAMPP pueda interpretar a los archivos de los proyectos web, se los debe guardar, de forma predefinida, en /opt/lampp/htdocs.
Pero, puede pasar que se deseen guardar los archivos de los proyectos en otro directorio. Para ello, y según se explica en  esta entrada de DesarrolloWebme, lo que hay que hacer es lo siguiente:
  1. Abrir la terminal (Konsole o similar) y escribir: sudo nano /opt/lampp/etc/httpd.conf
    Luego de ingresar la contraseña de administrador, se abre, con permisos de super usuario, el archivo de configuración con el editor nano en una ventana de la Terminal:
  1. Buscar la línea DocumentRoot "/opt/lampp/htdocs" y sustituirla por el camino al directorio deseado.
    En mi caso, lo sustituí por: DocumentRoot "/media/datos/Javier/clcphp.blogspot.com/clcphp"
  2. Hacer lo propio con la línea <Directory "/opt/lampp/htdocs"> (en mi caso la sustituí por <Directory "/media/datos/Javier/clcphp.blogspot.com/clcphp">)
  3. Hacemos Ctrl+ O y luego Enter para guardar los cambios en el archivo y Ctrl+X para salir del editor nano.
  4. Finalmente, se reinicia XAMPP escribiendo sudo /opt/lampp/lampp restart en la Terminal.

domingo, 18 de diciembre de 2011

Primero, lo primero

Para poder crear, probar y corregir las páginas del proyecto hay que tener instalado PHP en el sistema (y Apache y MySQL).
Para ello, la manera que parece más sencilla es a través de Xampp.
Así que primero descargué XAMPP Linux 1.7.7 (el sistema operativo sobre el que voy a empezar este proyecto es Kubuntu 11.10). El archivo descargado, xampp-linux-1.7.7.tar.gz, pesa 76,1 Mb.
A continuación abrí Konsole y allí:
  • me autentifiqué como administrador:
    sudo - i
    (luego ingresé la contraseña).
  • me moví hasta el directorio de descargas y allí descomprimí el archivo descargado a /opt:
    tar xvfz xampp-linux-1.7.7.tar.gz -C /opt
    Con esto Xampp quedó instalado en opt/lampp
  • Ya que para arrancar Xampp me pidió la contraseña de administrador, tuve que escribir en Konsole:
    sudo /opt/lampp/lampp start e ingresar la contraseña de administrador.
  • Luego, en la barra de direcciones de un navegador web, hay que escribir:
    http://localhost
    y listo, Xampp queda funcionando:

Tengan en cuenta que, como sentencian en su propia web, ...XAMPP no está pensado para producción sino exclusivamente para uso de programadores en un entorno de desarrollo. La forma en que está configurado XAMPP es para que sea lo más abierto posible y para permitirle al desarrollador cualquier cosa que desee. Esto es fantástico para entornos de desarrollo, pero en un entorno de producción puede ser fatal.

Lecturas complementarias:

miércoles, 14 de diciembre de 2011

Declaración de intenciones

Mi formación es de diseñador, no de programador. Pero, a través de esta fantástica herramienta que es Internet, aprendí las básicas de programación web con PHP.

Con ese conocimiento, hace unos años, programé un calendario web que mostraba efemérides y otras informaciones según el día seleccionado. También quería agregarle la cita bíblica correspondiente al día, pero, luego de mucho buscar, no encontré un script PHP que lo hiciera.
La solución en ese momento, fue vincular el día actual al sitio catholic.net, pero sólo funcionaba con el día actual, no con cualquier otra fecha.

Mi intención ahora es rehacer ese calendario paso a paso y desde cero, al tiempo que voy consignando los pasos en este blog. Pero, principalmente, luego que finalice con el armado del calendario, lo más importante será crear un sistema que permita obtener las citas bíblicas de cualquier día.

Como ya escribí: no tengo formación de programador y, evidentemente, eso se notará a los ojos de programadores de verdad, pero espero armar una herramienta que funcione y estoy abierto a recibir todas las sugerencias y correcciones de quienes, con buena fe, quieran corregir y mejorar el sistema.
El resultado final quedará disponible bajo alguna de las licencias libres existentes, pero aún no se cuál.

Como dice el título de esta primer entrada, todo esto es una declaración de intenciones y el proyecto es para mí bastante ambicioso. Espero poder cumplir.