Si quienes escribían manualmente eran amanuenses, quienes escribimos digitalmente seremos…
 Logo de Digituenses

 Una cafetera

Sobre la construcción del sitio

Debes saber que Digituenses no es una bitácora o blog al uso ni pretende serlo, por lo que he decidido no utilizar los llamado sistemas de gestión de contenidos (CMS) ni cosas parecidas.

Este sitio está hecho directamente en HTML, con alguna ayudita de PHP y sin contar con bases de datos. La primera intención fue emplear HTML únicamente, pero la incomodidad de tener que añadir las partes comunes en todas y cada una de las páginas —como por ejemplo la cabecera y el pie— no me hacía mucha gracia. Sé que hay alternativas a PHP, como no, pero ni me las he planteado. Por supuesto que la presentación —decir diseño suena pretencioso— está hecha con hojas de estilo, también conocidas como CSS. Las herramientas tipo Bootstrap, por mencionar alguna, de momento no las considero necesarias. Tampoco utilizo Javascript, ya que al ser un lenguaje ejecutado del lado del cliente —PHP lo hace en el servidor—, tarde o temprano acabará dando problemas en algún navegador. Sí, sí, hay cosas como jQuery y AJAX, pero —insisto— para las pocas funciones que utilizo prefiero un lenguaje que se ejecute directamente en el servidor, con las menos complicaciones añadidas que sea posible.

He procurado atenerme a los estándares del W3C, por lo que si esta web no se ve bien en tu navegador, tal vez deberías comprobar que el mismo se atiene a dichos estándares antes de criticarme mucho por ese motivo. También he tenido en cuenta a los smartphones. En mi recién adquirido telefonillo se ve bien, aunque en las páginas HTML de los libros la letra aparece pequeña. Pero como los dispositivos permiten ampliar, se puede leer sin mayores dificultades. De todas maneras pienso dedicar algo de tiempo a investigar soluciones más acordes.

Incluso me he atrevido a implementar mis propias estadísticas. Utilizando PHP se puede construir un cuarto de contadores a medida, donde registrar el número de visitas a cada página y también las descargas de archivos. Naturalmente, como ya habrás intuido si sabes de esto, dicha cuenta no se refiere a las visitas individuales —sería necesario guardar la identificación de cada una y eso aquí no se hace—, sino a su número total, de modo que se suma cada acceso a una página aunque la recargues varias veces seguidas en un corto intervalo de tiempo. El proceso es sencillo: al final de la página se incluye una llamada a la función del programa —script o guion— con el nombre del archivo contador como argumento. El guion lee el valor del contador, añade uno y lo vuelve a guardar con el nuevo valor. Si el archivo contador no existiera, por ser la primera vez que se accede a la página en cuestión, el script también se ocupa de crearlo.

Por lo que respecta al conteo de las descargas, el truco consiste en enlazar un guion PHP en lugar del archivo real a descargar. En ese nuevo script se llama a la función encargada de la cuenta de la forma que se ha explicado en el párrafo anterior, y una vez incrementado el contador correspondiente, se redirige al archivo que va a ser descargado. El inconveniente de esto es que se necesita un script para cada archivo cuyas descargas se quieran contar. La ventaja es que esos scripts puente sólo contienen tres líneas. Pero un vistazo al código debería valer más que mil palabras añadidas.

Script principal: manejar_contadores.php


<?php
// Para forzar descarga de archivos en lugar de mostrarlos en el navegador.
$raiz = "$_SERVER[DOCUMENT_ROOT]/web/contadores/";  // Carpeta del sistema de archivos, no la URL.
$anno = date('Y') . '/';                            // Carpeta para cada año en formato '9999'.
$mes = date('m') . '-' . date('M') . '/' ;          // Carpeta para cada mes en formato '99-xxx'.
$carpeta = "";                                      // Para la ruta (path) a la carpeta 'raiz/anno/mes/'.

function contar_visita($nombre_contador)
{
    global $raiz, $anno, $mes, $carpeta;
    $carpeta  = $raiz . $anno . $mes . "visitas/";
    $contador = $carpeta . $nombre_contador . ".txt";
    incrementar($contador);
}

function contar_descarga($nombre_contador)
{
    global $raiz, $anno, $mes, $carpeta;
    $carpeta  = $raiz . $anno . $mes . "descargas/";
    $contador = $carpeta . $nombre_contador . ".txt";
    incrementar($contador);
}

function contar_lectura($nombre_contador)
{
    global $raiz, $anno, $mes, $carpeta;
    $carpeta  = $raiz . $anno . $mes . "lecturas/";
    $contador = $carpeta . $nombre_contador . ".txt";
    incrementar($contador);
}

function incrementar($contador)
{
    global $carpeta;  // Ruta sin incluir al contador por si es necesario crearla.
    if (file_exists($contador)) {
        $archivo = fopen($contador, "r") or die("Error al leer: $contador.");
        $valor   = fgets($archivo) + 1;
        fclose($archivo);
        $archivo = fopen($contador, "w") or die("Error al escribir: $contador.");
        fwrite($archivo, $valor);
        fclose($archivo);
    } else {
        if (!file_exists($carpeta)) {
            mkdir($carpeta, 0755, true);
        }
        $valor   = 1;
        $archivo = fopen($contador, "w") or die("Error al crear: $contador.");
        fwrite($archivo, $valor);
        fclose($archivo);
        chmod($contador, 0644);
    }
}
?>


Script para contar y realizar la descarga: prueba_pdf.php


<?php
require_once("manejar_contadores.php");      // Se incluye el script principal.
contar_descarga("prueba_pdf");               // Se incrementa el contador prueba_pdf.
header("Location: /biblioteca/prueba.pdf");  // Se redirige para efectuar la descarga.
?>


A partir de aquí ya es cosa mía el montar (o no) en mi computadora personal, algún sistema de tratamiento de la información contenida en los contadores, bien sea incorporándolos a alguna base de datos, a una hoja de cálculo, o utilizando cualquier otro método automágico que se me pueda ocurrir para entretenerme. Y sí, sé que existen cosas como el panel de control que proporcionan los hostings, las bases de datos relacionales en el propio servidor, Google Analytics… Y diré más: las he usado.

Es de suma importancia no olvidar que los archivos contadores y las carpetas, o directorios, que los contienen, deben tener los permisos necesarios para poder escribir en ellos. En el código se han aplicado permisos totales para el propietario, de acceso y lectura para el grupo, y ninguno para el resto del mundo. En sistemas basados en Linux, y por lo general en sabores Unix, los permisos se pueden establecer en base numérica octal, de ahí el cero a la izquierda en el código PHP. A las carpetas de los años se les da permisos totales para el propietario con el 7, de ejecución (que aplicado a una carpeta equivale a permitir el acceso) y de lectura para el grupo con el 5, y al resto del mundo se le deniega todo con el 0. A los archivos contadores se les aplican permisos de lectura y escritura para el propietario con el 6, de solo lectura para el grupo con el 4, y se vuelve a dejar sin permisos al resto del mundo con el 0. Ya dijimos que el primer cero, el de la izquierda, significa para PHP que estamos utilizando base numérica 8 (octal).

Veamos un ejemplo del uso de un contador de visitas para la portada, con las inclusiones de la cabecera y el pie, más las dos líneas necesarias para contar cada carga de la página.

Ejemplo de uso de un contador de visitas


<?php
  require_once("cabecera.php");  // Se incluye la cabecera.
?>
<article>
  <header>
    <img src="/web/imagenes/desarrollo/zaguan.png" alt=" Un zaguán " />
    <h1 class="titulo_articulo">Zaguán</h1>
  </header>
  <p>
    Te doy la bienvenida a este mi humilde sitio, navegante. Si es la primera
    vez que vienes, has de saber que en la <b>antesala</b> tienen lugar las
    debidas presentaciones. Por lo demás, estás en tu casa.
  </p>
</article>
<?php
  require_once("pie.php");                 // Se incluye el pie.
  require_once("manejar_contadores.php");  // Se incluye el script principal.
  contar_visita("portada");                // Se incrementa el contador portada.
?>


Para el ejemplo de un contador de descargas se muestra solamente la parte relevante de la página. Las descargas se cuentan a través del enlace DESCARGAR, mientras que las visitas a la página que contiene dicho enlace se cuentan al final, utilizando su propio contador llamado prueba_descargas.

Ejemplo de uso de un contador de descargas


<?php
  require_once("cabecera.php");  // Se incluye la cabecera.
?>
<article>
  <header><h1 class="titulo_articulo">Prueba descargas</h1></header>
  <p>
    A través del enlace DESCARGAR se accede al script prueba_pdf.php, el
    cual contará la descarga y redirigirá a biblioteca/prueba.pdf, que es
    el archivo que va a ser descargado.
    <a href="http://www.digituenses.com/prueba_pdf.php">DESCARGAR</a>
  </p>
</article>
<?php
  require_once("pie.php");                 // Se incluye el pie.
  require_once("manejar_contadores.php");  // Se incluye el script principal.
  contar_visita("prueba_descargas");       // Se cuenta la visita a esta página.
?>


Por si acaso te has percatado, perspicaz internauta, de las lecturas en línea, tengo a bien informarte, para tu mayor tranquilidad, de que también llevo la cuenta de las mismas en carpeta aparte, por supuesto. Es como las descargas.

Sobre la cita del día y la foto del día que aparecen en el zaguán, no espero de tu inteligencia que creas que me ocupo de cambiarlas a diario. He ideado una forma de escoger uno para cada día de una lista con cualquier número de elementos, volviendo a empezar por el primero cuando hayan pasado todos. Es un pequeño script en PHP, naturalmente, cuyo secretillo voy a guardarme, a no ser que me contactes directamente por correo electrónico convenciéndome para que te lo cuente, y tengas suficiente paciencia como para esperar a que me acuerde de abrir el buzón y contestarte.

Como cualquiera sabe, o debería saber, los navegadores tienen una opción que permite ver el código fuente de la página. Si no ha sido desactivada con algún truco retorcido (casi siempre soslayable), a esa opción se accede normalmente haciendo clic con el botón secundario del ratón, que suele ser el derecho, o —según el navegador— pulsando la tecla Control más la u. Si la activas sobre cualquier página de este sitio, verás que la cabecera es lo que antecede a <article> y el pie lo que va después de </article>. Lo que hay entre ambas etiquetas es el contenido de la página, obviamente. No esperes ver el código PHP, ya que este lenguage es interpretado por el servidor web y solo será visible aquello que se quiera mostrar mediante las funciones echo(), print() y alguna que otra más. Por lo general, lo que se quiera mostrar estará en formato de texto normal o de código HTML. Para ignorantes con curiosidad diremos que no tiene mayor dificultad el mezclar PHP con HTML, es muy normal que se mezclen, aunque también es posible escribir toda la web en PHP generando el HTML a base de echo(), print() y otras funciones por el estilo. También se puede usar JavaScript, ya sea como único lenguaje adicional al HTML o junto con PHP —para rizar el rizo— pero, como dijimos anteriormente, a JS y a sus familiares no se les considera necesarios en este sitio, aunque no diré de esta agua no beberé.

Otro detalle sobre como trabajo Digituenses es que no me limito a escribir los textos para después subirlos sin más, sino que primero los sitúo en un servidor web virtual que he instalado en mi portátil, sin conexión desde (pero sí hacia) Internet, para ver como quedan, hacerles las correcciones oportunas, y una vez dados por definitivos ya los publico. De esta forma siempre tengo una copia exacta de la web además de conservar los textos en la, digamos, carpeta de desarrollo, por lo que si algún día necesito cambiar de alojamiento lo único que tengo que hacer, una vez contratado y configurado el servidor, es subir todos los archivos a la nueva ubicación y listo. No es necesario obtener copias de bases de datos, ni buscar la manera de volver a cargar el contenido en el nuevo sitio, ni tampoco se pierde información alguna sobre los contadores (siendo descargados justo antes de abandonar el servidor viejo, obviamente). Hay que decir que esto es consecuencia del diseño escogido para el sitio y no al contrario. La web Digituenses no ha sido pensada en función de estas características, pero ya que han surgido las aprovecho lo mejor que se me ocurre.

En los textos pueden aparecer varias fechas, como la de la primera publicación y las de las sucesivas revisiones del contenido, o de la última revisión en todo caso. En el apéndice de mis libros incluyo un párrafo automatizado con el día y la hora en que fue procesado el escrito. Esta fecha puede ser incluso bastante posterior a las otras porque indica la última vez que el libro fue construido, sin que ello signifique modificaciones en el contenido —para eso están las otras fechas—, sino algún cambio relativo a los aspectos tecnológicos de alguno de los programas usados para obtener los formatos, o incluso estético u organizativo. El motivo de estas revisiones es que la web es semejante a un ecosistema vivo que evoluciona, cambiando continuamente y obligando a una continua adaptación a los seres que lo pueblan —los sitios web—. Enlaces que cambian o desaparecen, nuevas fuentes de información, actualización tecnológica…

Los principales motivos que me han impulsado a construir el sitio de esta forma son el entretenimiento —hacerlo todo uno mismo desde cero— y la rapidez de carga de las páginas, mayor mientras menos procesos sean necesarios para generar el HTML final. También ha influido la voluntad de contar con un sitio independiente de cualquier interacción tecnológica con terceras partes (a excepción del hosting, claro está). Yo me lo guiso y yo me lo como, ya sea para bien o para mal.

Este sitio no está hecho pensando en potenciar marca alguna, ni pretende adoptar la última moda o tecnología de desarrollo web, sino que ha sido enfocado a un estilo que podría llamarse casero. Esta es una web sencilla y sin pretensiones, concebida para ocio de su autor y regocijo de visitantes. Esto último suponiendo que quienes la encuentren, no teniendo bastante aún, se atrevan incluso a leer lo que aquí escribo.