Instalando Chromixium en una máquina VirtualBox.

Download PDF

He de confesarles que utilizo como navegador web al Mozilla Firefox, que es muy bueno y al Iceweasel que es mejor aún, pero no pueden competir con el caché web alojado en los servidores de Google para su navegador Chromium o Chrome. Es por ello que estaba buscando la manera de instalarlos de la manera más rápida y práctica posible y no me sentía a gusto; luego leí el reportaje “Chromixium: fusiona lo mejor de Chrome OS y Ubuntu” así que ni tardo ni perezoso me dispuse a bajarla por torrent y al poco rato la había instalado y estaba funcionando. RECOMIENDO presten atención en el particionado del disco, un detallito si escogen la opción “automatica”; donde tuve más contratiempo fue en la configuracion de teclado y lenguaje. Acá está el enlace para los detalles completos de requerimientos e instalación (en inglés) pero primero dediquen un tiempito a mirar el video y tendrán mejor panorama de la instalación.

Actualizado el 16 de noviembre de 2015:

He descargado la nueva versión 1.5 (debería ser la versión 15, pero en fin, que es la última versión publicada) y les traigo de nuevo la instalación. Lo diferente en este caso es que seleccioné completo el disco duro, todo lo demás lo dejé igual. Apliando el tema de uso del Google Chrome es que tiene ciertas características que me hacen la vida más llevadera a la hora de usar el Twitter. He aquí como quedó ahora {la otra máquina virtual la borré, esto de virtualizar es maravilloso 😎 }:

<Eso es todo, por ahora>.

Download PDF
VirtualBox bajo GNU/Linux Canaima.

VirtualBox kernels Canaima Linux.

Download PDF

VirtualBox kernels Canaima 4.1 kukenan x86 (virtual).

ESTE PROBLEMA ME QUITABA EL SUEÑO, ya no más 😎 .

VirtualBox kernels Canaima: en la entrada anterior les indiqué cómo “instalar” una máquina virtual Canaima en una máquina REAL que corre Ubuntu+VirtualBox. Vayan a este enlace, refrescan la memoria y luego regresan.


“O inventamos o erramos”


 

Como pudieron observar en el video correspondiente, la máquina virtual quedó instalada y funcionando. Luego se me ocurre la pregunta ¿Puedo instalar VirtualBox en ésa máquina virtual Canaima que acabo de crear?

La respuesta es SI, si se puede,

pero es más fácil decirlo que hacerlo,

je je je. 😉

No voy a entrar en detalles profundos para instalar VirtualBox,  yo lo he instalado en diferentes sistemas operativos sin problema alguno pero en GNU/Linux Canaima hay que hacerle dos pasos adicionales a todo lo que explican MUY CLARAMENTE en la página de dicha empresa de software:

-> https://www.virtualbox.org/wiki/Linux_Downloads

En el manual en inglés (más detallado aún que la página web) explican este procedimiento como:

“It builds the VirtualBox kernel modules (vboxdrv, vboxnetflt and vboxnetadp) and installs them.

Ya bien lo aclara el manual, para que VirtualBox acceda a ciertos recursos REALES de la computadora debe estar sincronizado con la versión linux en que se ejecuta; IMAGINO con propósitos de “compilar” y tener una versión muy bien adecuada al sistema que uno posea.

Los comandos “truco” son:

apt-get install build-essential module-assistant
m-a prepare

(aunque he de confesarles que yo instalé varias paqueterías primero -que no recuerdo cuáles fueron- y hasta hice una actualización de software completa, de allí que al principio del vídeo aparezca el mensaje de poco espacio en disco)

Sin más, pues, les presento el video, ALOJAMIENTO CORTESÍA DE YOUTUBE:

Reconocimiento de autoría.

Debo reconocer que el script que me ayudó a instalar el VirtualBox en Canaima me lo suministraron dos personas con los cuales estoy sumamente agradecido:

  • Twitter: @abr4xas
  • Twitter: @cotoprixve

Espero yo retribuir conocimientos algún día (aunque CREO ya lo estoy haciendo con esta entrada a mi blog), y ya lo saben:



 

Duerman tranquilos, duerman contentos PERO PRIMERO COMPARTAN SUS CONOCIMIENTOS CON TODOS LOS QUE PUEDAN, es la razón de ser del Software Libre 😎 .



Actualizado el sábado 30 de enero de 2016:

   En Ubunlog.com, sitio web dedicado a reseñar “tutoriales, escritorios y software para Ubuntu” publica un problema parecido al que reportamos por acá, pero en este caso el contratiempo es la actualización del propio kernel del GNU/Linux que “choca” con el ya instalado VirtualBox. La propuesta es interesante y toman otra vía que merecemos reseñar en esta entrada para así compartir el conocimiento, bastión fundamental del Software Libre.

El autor es Miguel Pérez, ciudadano español y estudiante de Ingeniería Informática en la Universidad de las Islas Baleares, dicho artículo pueden visitarlo en este enlace web.


Actualizado el viernes 8 de diciembre de 2017.

Nos tocó instalar VirtualBox sobre la madre de todas las distribucioenes: Debian en su nueva y flamante versión 9 “Stretch”, allá el problema era que teníamos un kernel muy moderno; esperamos disfruten nuestra entrada, hagan click en este enlace.


<Eso es todo, por ahora>.

Download PDF
ALT+F2 Canaima Kukenan.

GNU/Linux: linea de comandos (bash shell).

Download PDF

Introducción al BASH shell.

Algo que acompaña a todas las distribuciones GNU/LINUX es la terminal de línea de comandos (Unix shell, bash shell, o simplemente “shell”) la cual puede ser lanzada en modo de superusuario (root) o con la identidad con que hayamos iniciado sesión (aunque aún así podemos ejecutar comandos con privilegios de superusuario anteponiendo el comando sudo acompañado de su respectiva contraseña) o “escalando” privilegios con el comando su (más contraseña).

Nosotros utilizamos la línea de comandos “bash shell” desde 1990 con al antiquísimo MSDOS y luego con el venerable Netware Novell en 1993 (hoy migrado a Linux) y no tenemos aversión alguna a esta forma de trabajar pero hemos vistos casos severos de usuarios que se marean y les duele la cabeza al tipear 10 ó 12 comandos por la terminal.

Desde aquellos años nuestros terminales de BASH shell, los monitores donde aprendimos la computación, tenían un ancho de 80 columnas (80 caracteres o letras),  justos lo que cabía de ancho -y todavía es la norma- en una impresora de matriz de puntos para una hoja tamaño carta (hoy A4 según normas ISO). Pero en los años 1980 la cosa no era tan fácil, os traemos a colación este vídeo para que comprobéis que lo que  a nosotros nos parecía una norma de maravilla, no fue tan fácil llegar hasta allí:

El entorno gráfico es bello, bellísimo pero en muchas oportunidades necesitamos algo que vaya al grano y funcione rápido e incluso que funcione de manera remota y de manera segura abriendo incluso comunicaciones diversas, pero no quiero abrumarlos ni abrumarlas, con que sepan que es una opción disponible es más que suficiente.

Actualizado el domingo 27 de agosto de 2017.

Un interesante reportaje en inglés, de apenas 7 párrafos de introducción, describe muy bien la historia del bash y lo podéis leer en este enlace.

 

Abrir una ventana terminal.

En Ubuntu la combinación de teclas para abrir el “bash shell” es CTRL+ALT+T pero cada distribución tiene su método, si es por medio de menú busquen algo como “Accesorios->Terminal” o sino algo parecido en “Herramientas del sistema”. Investigando un poco pude conseguir varios atajos de teclado y un “atajo” de ratón {si es que eso existe, si no pues lo cabo de inventar 😉 }.

Si pulsamos la combinación de teclas ALT+F1 nos mostrará el menú principal del sistema (probado en GNU/LINUX Ubuntu, Canaima y Debian).

El otro atajo de teclado que me parece más poderoso es la combinación ALT+F2 la cual nos permite ejecutar casi todo programa instalado en nuestra máquina. Para comprobar esto último probé en varias de mis máquinas virtuales, incluyendo Chromixium cómo abrir el BASH shell y las que nombré en el párrafo anterior.

BASH shell en Ubuntu 14:

alt+f2 ubuntu bash shell
alt+f2 ubuntu bash shell

BASH shell en Canaima Kukenan:

alt+f2 Canaima Kukenan bash shell
alt+f2 Canaima Kukenan bash shell

BASH shell en Debian 7:

alt+f2 Debian 7 bash shell
alt+f2 Debian 7 bash shell

BASH shell en Chromixium OS 14:

alt+f2 Chromixium bash shell
alt+f2 Chromixium bash shell

Muy probablemente su cuenta creada en la distribución Linux es limitada por razones de seguridad: esto se traduce en que no podrán instalar programas, periféricos como impresoras o incluso a acceder a estadísticas sin ingresar credenciales de superusuario (ya ustedes saben que me refiero al usuario root, en adelante simplemente lo denominaré en castellano). Es así que iniciaremos la terminal con nuestras credenciales y si necesitaramos hacer algo avanzado pues “escalamos” privilegios.

Una cónsola se verá algo así como la siguiente (yo utilizo verde sobre negro porque los monitores de la universidad, los antigüos CTR eran de ese color aunque el que yo poseía en mi casa era de un horrible color ámbar):

jimmy@KEVIN: ~_011

Hay otra manera de tener acceso a la terminal de linea de comandos: por medio de una cónsola virtual, presionando simultáneamente las teclas CONTROL+ALTERNO+F1.

Advertencia.
Advertencia.

Antes de que probéis la cónsolo virtual os debo advertir que NO funciona para nada el ratón, solamente por medio del teclado podréis salir de este modo a la cónsola virtual gráfica (generalmente con las teclas CONTROL+ALTERNO+F7). He de advertiros también que debéis iniciar sesión con usuario y contraseña, sin importar que ya hayas abierto sesión gráfica, es decir, no se heredan las credenciales. Lo bueno de utilizar la cónsola virtual es que contamos con una GRAN Y AMPLIA pantalla en “modo ASCII”, ideal para editar grandes archivos de texto. Por último debo indicaros que del F1 al F6 son 6 cónsolas virtuales totalmente independientes la una de las otras. Para más detalles en cuanto a personalizar vuestra ventana terminal os aconsejo leer el excelente artículo del Licenciado Pedro Ruíz Hidalgo en Ubunlog.com.

Este viejo no los aburre más con historias así que entramos en materia:

Manejo del cursor con el teclado en bash shell.

El título de este párrafo os parececerá redundante y lo que paso a explicaros aún más. El cursor siempre ha sido un símbolo “|” (cuando está en modo de inserción) o con un símbolo de bloque “█” cuando está en modo de sobreescritura y sirve para indicarnos dónde estamos tecleando (los monitores vienen con un modo de parapadeo automático y en modo gráfico esto depende del sistema operativo correspondiente).

Cuando se masificó el uso de los “mouses” o ratones nos llegó el concepto de puntero del ratón o simplemente puntero. Es así como el teclado maneja el movimiento del cursor y el ratón el movimiento del puntero siendo posible ubicar el cursor con ayuda del puntero a donde esté disponible, generalmente cuando el puntero cambia su forma al famoso icono de “doble te”.

Cuando estamos en la línea de comandos podemos usar las siguientes teclas para manejar nuestro cursor:

  • Tecla Flecha izquierda: nos movemos un caracter a la izquierda.
  • Tecla Flecha derecha: nos movemos un caracter a la derecha, si no se ha acabado la línea.
  • Tecla INTRO o “ENTER”, RETORNO o “RETURN” (hay dos en el teclado, tienen diferentes códigos, la historia es larga): indicamos al ordenador que introduzca en memoria la cadena de caracteres que hemos escrito, si hay comando(s) válido(s) los ejecuta, de lo contrario nos indica aproximadamente dónde puede estar el error(es) de nomenclatura.
  • Tecla Flecha arriba: repetimos última línea introducida, si hubiera.
  • Si estamos seguros acerca de ual es el último comando que introdujimos simplemente tecleamos “!!” y al presionar Intro lo “repetimos” (nos coloca también una línea previa con el comando en sí apra que veamos qué estamos solicitando, por si las dudas -uno de esos raror casos explícitos en GNU/Linux). También podemos introducir “!!” seguido de comandos adicionales, el detalle es el siguiente: con flecha arriba modificamos la última línea y aís queda grabada en el historial (más adelante hablaremos del historial) y con “!!” introduciremos una línea nueva al historial.
  • Tecla Flecha abajo: luego de pulsar Flecha Arriba podremos volver a una línea de comandos nueva “bajando” tantas veces hayamos “subido” con la otra tecla.
  • Tecla Inicio o “HOME”: nos permite ubicar el cursor a al inicio de la línea que estamos escribiendo.
  • Tecla Fin o “END”: nos permite ir al final de la línea.

Más adelante veremos combinaciones de teclas (tecla Control+otra tecla, por ejemplo). Esta sección la finalizamos con otro detalle: muchas veces necesitamos escribir una linea de comando muy larga y aunque la ventana gráfica que contiene la terminal la podemos redimensionar con el puntero (arrastrando) e incluso podemos escoger una fuente más pequeña para tener más espacio de escritura de caracteres, nuestro monitor tiene un ancho finito. Para estos casos utilizamos para concatenar el símbolo de barra invertida que le indica al ordenador de que a pesar de que presionemos la tecla Intro no la va a procesar si le colocamos el “\”

Generalmente usamos esta última opción con comandos que hay que pasarles parámetros:

Ventana de comando con barra invertida para pasar varios parámetros largos
Ventana de comando con barra invertida para pasar varios parámetros largos

Como veís en la imagen anterior, introducimos el comando, luego un espacio y una barra invertida, presionamos Intro y a continuación escribimos el primer parámetro acompañado al final de otro espacio y otra barra invertida; debemos tener cuidado al finalizar con todos los parámetros NO introducir la barra invertida y presionamos Intro de nuevo: así el ordenador procesa como una sola línea. Al finalizar de procesar el comando deseado y  cuando volvemos a tener entrada de teclado, podemos presionar la tecla Flecha Arriba y veremos la línea completa que introdujimos previamente.

Otros atajos de teclado para el BASH shell.

Nosotros mostramos predilección por las teclas que son evidentes en nuestro teclado: Inicio (Home) , Fin (End), AvPag (PgDown), etcétera PERO hay unas combinaciones que son muy útiles. Dichas combinaciones implican las “teclas muertas” o “teclas pasivas” (CONTROL, ALTERNO, INVERSO) presionadas primero y sostenidas mientras se presiona otra tecla. Acá tenemos una cuenta en Twitter que se dedica a recordarnos cada cierto tiempo el uso agresivo de la línea de comandos, acá unos cuantos que consideramos muy útiles:

 

Manejo del historial de comandos introducidos en el BASH shell.

Antes de comenzar a introducir comandos os digo de antemano que todos ellos quedan registrados en memoria (así apaguemos nuestro ordenador) y solo necesitaremos escribir el comando history para revisar el historial del “bash shell”. Como dicho listado puede llegar a ser muy largo, podemos presionar la tecla CONTROL+R y escribir una palabra clave y nos buscará rápidamente en cual linea (y nos ubicará en esa línea, presionando de nuevo CTRL+R podemos “navegar” tal como indicamos anteriormente). Por último, si deseamos borrar el historial solo debemos escribir “history -c” .

Combinaciones de teclas útiles.

Control+R es apenas una de las combinaciones, tal como describimos en la sección anterior, acá otros comandos adicionales:

 

Referencia de Comandos en Linux y su BASH shell.

Servidor GNU/linux ejecuntado lineas de comandos.
Servidor GNU/linux ejecuntado lineas de comandos.

Tomado de la traducción hecha por Alex Barrios (alexbariv at gmail.com) -cuenta Twitter @alexbariv (en desuso, cuenta actual @alexertech, página web donde imparte cursos: http://www.alexertech.com/ )- quien a su vez lo tomó de Jacob Peddicort en su blog “Unix/Linux Command Cheat Sheet”  bajo licencia “Creative Commons” con la cual les puedo ofrecer esta entrada reconociendo la autoría (“appropiate credit”). En este enlace alterno de mi propio servidor suministro dicho documento traducido en formato pdf, ya ustedes saben cómo es el internet y su dinámica en el alojamiento de páginas web.

Actualizado el martes 15 de agosto de 2017.

Encontramos una útil lista abreviada de comandos realizada por Peteris Krumins y compartida por el señor Fran en su cuenta Twitter, haciendo alusión a sus talleres GNU/Linux que imparte ¡enhorabuena!:

 

Comandos del sistema operativo.

Comando “date”.

Comenzamos por conocer nuestro entorno, nuestro ordenador (o un ordenador remoto, luego veremos cómo). El primer comando es “date” el cual nos devuelve la hora y fecha de nuestro equipo. A pesar de ser uno de los comandos más sencillos no os dejéis engañar por GNU/Linux: para saber cuales otras opciones tiene podemos escribir “man” + nombre de comando. Al invocar esta ayuda sobre comando, podéis subir y bajar con las teclas de dirección del teclado, así como avanzar o retroceder páginas con las teclas correspondientes (también podéis usar la rueda del ratón, si es que está disponible). Si queréis leer ayuda sobre el comando “man” en sí mismo allí presionaréis la tecla “h” -nemotécnico para “help”- y para salir del mismo usaremos la tecla “q” -nemotécnico para “quit”-.

Es así que podemos describir que el comando “date” puede ser utilizado tanto para saber la hora y fecha del ordenador así como para fijarlo (se necesitan permisos de administrador o “root”) , así como también para conocer hora y fecha de otras ciudades del mundo. A medida que toméis experiencia disfrutaréis del comando “date” e incluso podréis usarlo como herramienta para calcular fechas y horas en formatos personalizados (muy útil para cuando querramos introducir valores de tiempo en bases de datos). Paciencia, “Roma no se construyó en un solo día”. Mirad la siguiente animación en formato gif sobre unas pocas llamadas al comando de marras:

comando "date".
Comando “date”.

Comando “clear”.

Muchas veces necesitaremos “limpiar la pizarra” (recordad vuestros tiempos en la escuela y liceo donde nuestros profesores escribía con gis o tiza), para ello solo escribiremos “clear” y la tecla introducir o “enter”. Acá observamos que la rueda del ratón es útil para ir rápidamente hacia lo que acabamos de “borrar” (o usamos las barras de desplazamiento de la venta terminal, si es que estamos en modo gráfico).

Comando “cal”.

Ya sabemos visualizar o fijar la fecha actual ahora veremos cómo visualizar el calendario del mes actual (con la fecha actual resaltada): simplemente introducimos “cal” y presionamos introducir o “enter” -de ahora en adelante obviaremos el indicar que se debe presionar la tecla INTRO para ejecutar los comandos-. Otra cosa que os preguntaréis para qué utilizar este comando si podemos ver la bandeja del sistema con tan solo mover nuestra vista a la bandeja del sistema, pero recordad que en modo TTY tendremos absolutamente toda la pantalla para la línea de comandos o tal vez estemos trabajando con un servidor al cual no dispone de entorno gráfico -lo cual es más común de lo que se cree-.

Como ya es costumbre no nos quedaremos con esa descripción tan simple del comando, sino que ahondaremos en unos cuantos más:

  • Si queremos ver el mes de diciembre del año en curso: “cal -m 12“, donde “12” es el número de mes deseado.
  • Si queremos ver el mes anterior, el actual y el próximo: “cal -3“.
  • Si queremos ver el mes actual y los próximos 5 meses: “cal -A 5” (“A” es nemotécnico para “after”).
  • Si por el contrario queremos ver los últimos 5 meses y el actual: “cal -B 5” (“B” es nemotécnico para “before”).
  • El comando “ncal” permite ver el calendario en base a los días de la semana y acepta los parámetros anteriores, además de otros específicos para “ncal” como por ejemplo el día de comienzo de semana: “-M” para lunes -“monday”- y “-S” para domingo -“sunday”-.

Comando “uptime”.

Permite conocer la hora actual, el tiempo que ha estado encendida nuestra computadora, el número de usuarios conectados (cada ventana TTY que hayamos iniciado sesión o cada conexión SSH cuenta como usuario) y el promedio de carga de trabajo que presenta el equipo los últimos 1, 5 y 15 minutos. Con la opción “-p” (nemotécnico para “–pretty“) simplemente veremos el tiempo que ha estado ejecutando el sistema operativo.

Comando “w”.

Pues sí, ¡un comando de una sola letra! Este comando complementa a “uptime” ya que muestra la misma información pero con un reporte detallado de los usuarios conectados actualmente:

  • USER: Nombre de usuario.
  • TTY: Ventana TeleTYpe en uso (recordad que van del 1 al 6 en texto y 7 en gráfico).
  • FROM: El nombre del equipo donde está conectado (dirección IP), de ser remoto.
  • LOGIN@: Hora cuando inició sesión.
  • IDLE: Tiempo transcurrido -en minutos- desde que inició sesión.
  • JCPU: Tiempo acumulado -en minutos- de las tareas adjuntas a cada terminal.
  • PCPU: Tiempo utilizado -en minutos- de la tarea que indica en WHAT.
  • WHAT: muestra la orden que inició la ventana terminal o la última ejecutada.

Los argumentos que podemos pasarle al comando “w” son los siguientes, a saber:

  • -h” o “–no-header“: Muestra solamente los usuarios conectados (omite la información que lista el comando “uptime“).
  • -s” o “–short“: no muestra las columnas LOGIN@, JCPU ni PCPU.
  • -f” o “–from“: mo muestra de donde están conectados los usuarios (dependiendo de la distribución Linux utilizada, puede ser que no sea posible desactivar esta opción).
  • -i” o “–ip-addr“: muestra la dirección IP en vez de nombre de equipo.
  • -o” o “–old-style“: imprime espacios en blanco si el tiempo transcurrido es menor a un minuto.
  • nombre_de_usuario”: muestra las conexiones abiertas para un usuario específico; se pueden solicitar varios usuarios al mismo tiempo si se solicitan los nombres separados por comas.

Comando “whoami”.

Acá por fin vemos un comando sumamente simple: “whoami” nos devuelve el nombre con que iniciamos sesión. Solamente tiene dos argumentos: “-help” muestra la ayuda que nos indica que el otro argumento es “–version” que visualiza la versión que tenemos instalada. Tal vez nos parezca un comando tonto pero si lo usamos en un comando de procesos por lotes -“bash script”- podremos usar el comando “tubería” -“|”- para pasar esta variable a otros procesos más complejos. Por ejemplo, podremos crear un guión que comprima los documentos del usuario cada cierto tiempo con crontab y colocarle el nombre del usuario, acompañado con fecha y hora, al nombre del archivo comprimido y guardarlo en una ubicación remota.

Comando “finger”.

Un comando que NO viene instalado por defecto en Ubuntu  y debemos descargarlo con “sudo apt install finger“. Sirve para obtener el usuario, el nombre de usuario, directorio de datos personales, última conexión, último correo leído por dicho usuario e incluso la agenda almacenada. Un uso muy útil es para verificar si existe un usuario en particular, ya que dicho comando devuelve si existe o no en el equipo. Por demás está decir que con el comando “chfn” podemos cambiar nuestros datos personales para que pueda ser visualizado por otros usuarios del sistema.

Comando “uname”.

Con este comando podremos ver el sistema operativo utilizado, Linux. Si queremos ver toda la información del ordenador usaremos el argumento “-a” o “–all” o podremos ver valores específicos (de nuevo, por ejemplo, podremos realizar un guión que nos devuelva la versión Linux utilizada para instalar un programa por nosotros escrito). Los argumentos detallados son:

  • -s” o “–kernel-name“: nombre del kernel instalado.
  • -n” o “–nodename“: nombre del ordenador para indetificarse en la red de área local.
  • -r” o “–kernel-release“: subversión del kernel instalado.
  • -v” o “–kernel-version“: versión del kernel instalado.
  • -p” o “–processor“: tipo de procesador.
  • -i” o “–hardware-platform“: plataforma del procesador.
  • -o” o “–operating-system“: sistema operativo instalado.

 

Manejo de archivos con bash shell.

En la figura arriba mostrada aparece el siguiente prefijo de manera constante:

jimmy@KEVIN:~$ (cursor titilando)

 Esto me indica que estoy conectado con la cuenta de usuario jimmy en la máquina KEVIN seguido de “:~$”: todo esto es el indicador o prompt y al aparecer como el signo de pesos indica que somos un usuario sin privilegios (ya comentado en un párrafo anterior) y cuando tenga el símbolo almohadilla o numeral estaremos en modo de superusuario. El símbolo de la virgulilla nos indica que estamos en nuestro directorio raíz del sistema.

En este otro ejemplo trabajamos con una máquina con Canaima 4.1 Kukenan y como pueden observar el nombre del usuario coincide con el nombre de la máquina y estamos con derechos limitados, ver signo de pesos:

Captura de pantalla de 2015-04-16 21:27:26Volviendo a nuestro ejemplo original comenzamos por ver los comandos para el manejo de archivos por medio del BASH shell.

Comando “ls”.

Se define como “listar directorio” pero yo agregaría también que archivos también. Así como en una oficina hay escritorios con gavetas y documentos almacenados en ellas, en nuestros discos duros (=escritorios) cada gaveta (=directorio) guardamos hojas (=archivos) y estas hojas pueden tener diferentes tamaños, colores y usos (=extensiones de archivos). Esa es la abstracción más fácil para comprender, de manera física y humana, el sistema de archivos. Al introducir ls y presionar la tecla intro(ducir) o “enter” (dependiendo de cuál tipo de teclado tengan ustedes)

jimmy@KEVIN: ~_013En seguida notamos los colores que destacan los diferentes elementos (vuelvo y repito, estoy utilizando Ubuntu 14.04 LTS Trusty Tahr, muy probablemente el GNU/Linux que vosotros utilicéis sea diferente). Coloreado en verde son los archivos y en azul los directorios (nosotros los hombres distinguimos sólo un puñado de colores así que me disculpan la falta de precisión y/o daltonismo).

Los archivos contienen atributos que le indican al sistema operativo la fecha de creación, de modificación, quién es el propietario y a cual grupo de usuarios pertenece (ya les comenté que existe el root y su cuenta de usuario ¿recuerdan?) así como también si es de lectura, escritura y hasta si es oculto para los usuarios. En GNU/Linux ocurre que los archivos ocultos simplemente llevan un punto delante de su descripción (por favor, los que sepan la historia de esta “costumbre” pro favor comente a pie de entrada). Al introducir “ls -a -l” en el BASH shell obtendremos el siguiente resultado (la lista es larga, la captura de pantalla NO abarca todos los archivos y directorios listados):

jimmy@KEVIN: ~_014Como pueden obervar, podemos notar que siguen apreciendo “Descargas”, “Documentos”, “Escritorio” entre otros pero además los archivos y directorios ocultos que comienzan con un punto en su nombre. También notamos que aparecen unos arriba de otros, a modo de columna o simplemente en modo lista (de allí el parámetro “-l” del comando). Este modo de lista, de izquierda a derecha -como es el castellano-:

  • Tipo de archivo (“filetype”): el primer caracter si es “d” es un directorio (“directory”), de lo contrario es un archivo “-“.
  • Permisos de archivo (“file permissions”): los siguientes 9 caracteres (más adelante veremos qué significan al agruparlos en tríos de caracteres).
  • Enlaces (“links”): indica en qué nivel se encuentra, cuántas carpetas “por encima” tiene cada archivo o cada directorio. Para comprender estos volvamos al ejemplo de nuestra oficina en el mundo real: dentro de cada gaveta puedo tener hojas sueltas y además carpetas que agrupan folios; es como una estructura jerárquica en la que si queremos leer un documento debemos abrir la gaveta y luego abrir la carpeta: ésos son los niveles a los cuales se refiere.
  • Propietario (“user”): el usuario quien creó el archivo (o heredó, veremos más adelante).
  • Grupo propietario (“group user”): el grupo de usuario al cual pertenece el archivo o carpeta.
  • Tamaño en bytes que ocupa en disco.
  • Fecha de la última modificación.
  • Nombre del archivo o directorio.

Como podrán deducir, el parámetro “-a” del comando ls permite mostrar los archivos y carpetas ocultas; también es válido “juntar” parámetros que sean compatibles y escribir simplemente “ls -la” o “ls -al“, intenten y comprueben ustedes que produce los mismos resultados.

Si queréis ver una lista completa de los parámetros de cualquier comando sólo tendréis que escribir “man comando” (en este caso “man ls“) y obtendréis toda la información.

Comando “pwd”.

Si en algún momento se nos olvida en cual carpeta estamos trabajando simplemente utilizamos el comando pwd, esto es especialmente útil si personalizamos nuestro indicador o “prompt” (también podemos usar este comando para pasarlo como variable en archivos de procesos por lotes si queremos, por ejemplo, recorrer de manera recursiva el árbol de directorios para buscar un archivo: “pwd” nos indicará en cual directorio se encuentra).

Comandos “df”, “du” y “free”.

  • Con el comando “df” prodremos obtener la cantidad de espacio utilizado en nuestro disco duro.
  • Con el comando “du” nos dará la información de los archivos en una carpeta pero será una lista extensa.
  • Con “free” podremos observar la cantidad de memoria RAM y SWAP y con los parámetros -b lo podremos ver expresadas en bytes, con -k en kilobytes y así sucesivamente: -m, -g y si queremos subar ambas memorias incluiremos el parámetro -t.

 

Comandos “whereis” y “wich”.

  • Con el comando “whereis” podremos saber dónde se encuentra instalada determinada aplicación, si está instalada en neustro ordenador, ejemplo “whereis pinta“.
  • Con el comando “which” podremos saber dónde se ejecutará una aplicación, ejemplo: “which sh“.

Comando “cat”.

Muchas veces necesitamos “mostrar por pantalla” el contenido de uno o varios archivos de texto: pues bien a esto se le llama “standard ouput” o salida normal del BASH shell. El comando cat es capaz enviar a la salida normal todo lo que le envíen, incluso si se ejecuta sin parámetros todo lo que escribamos -y presionamos intro- lo observaremos por pantalla.

En este punto cabe recordaros que en GNU/Liux todo es un archivo incluso los procesos del sistema operativo, por ejemplo los siguientes comando nos devolverán datos interesantes de nuestro procesador y memoria en nuestro ordenador:

cat /proc/cpuinfo
cat /proc/meminfo
Como funciona la entrada y salida normal en GNU/Linux BASH.

Haremos aquí un pequeño paréntesis para poneros un ejemplo sencillo sobre cómo aprovechar la salida normal “output standard” del comando “cat” y para ello nombraremos al artículo publicado en Totaki.com (desconocemos su autoría) y donde explican rapidamente cómo funcionan los ciclos:

for j in `cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies`
do
  echo "Frecuencia: "$j" Hz"
done

En la línea número uno observamos todo lo que está entrecomillado: el comando “cat” lee un archivo que contiene las frecuencias disponibles del CPU en nuestro ordenador (en este año 2017 es común y frecuente que tengan dos o más núcleos como en nuestro caso que tenemos cuatro) y dicha salida es almacenada en una variable implícita hacia un ciclo evaluado en una variable j y que separa los elementos por medio del Separador Interno de Campos (Internal Field Separator) -espacio, tabulador, nueva línea- imprimiendo por pantalla todos y cada uno de los elementos.

De igual manera en otro artículo publicado en DigitalOcean sobre como instalar nuestro servidor web Ngix se hace eco de un truco para conocer nuestra dirección IP local, la asignada por nuestro enrutador de área local o bien la que nos asigna nuestro proveedor de internet cuando estamos conectados directamente al modem respectivo. Para ello podemos ejecutar una ventana terminal donde escribimos la siguiente orden:

ip addr show eth0

(si usáis un ordenador portátil conectado por inalámbrico, cambiad a eth0 por wlan0)

Si la ejecutamos en nuestra ventana terminal notaremos que es mucha más información que la que necesitamos (os invito a practicar directamente los comandos en vuestra computadora a medida que vayáis leyendo nuestro artículo) así que notamos que hay una palabra clave “inet” sobre la cual nos apoyaremos para extraer lo quenos interesa, así que ahora le agregamos el símbolo de tubería “|” acompañado de otro comando llamado “grep” el cual nos permite imprimir líneas de acuerdo un patrón -en este caso la palabra clave “inet“-:

ip addr show eth0 | grep inet

Como veréis ya estamos más cerca de nuestro cometido. Para seguir adelante usaremos la metodología de estudio de la Facultad de Ingeniería de la Universidad de Carabobo (donde nos quitaron a nosotros la costumbre de propinar coces a diestra y sisniestra) y os presentamos el resto de los comandos necesarios los cuales dejamos a vuestro estudio posterior –metodología de estudio: ésta es la letra A, la B, la C… ahora recitadme el abecedario completo aunque NO os lo hayamos enseñado aún-:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
Preludio a los atajos de teclado.

Como un avance a la siguiente sección podemos indicaros que no es necesario escribir el nombre completo de las rutas y/o archivos: con escribir dos o tres letras y presionar la tecla tabulador nuestro shell completará automáticamente siempre y cuando el nombre del archivo o carpeta sea único con las letras que introduzcamos. Es por ello que si no “completa” entonces volvemos a presionar la tecla tabulador y nos mostrará una lista de carpetas o archivos que comiencen con las letras solicitadas. Acá podéis ver parte del proceso:

cat cpuinfo meminfo
cat cpuinfo meminfo

Volviendo a los atajos de teclado en bash shell.

Es sumamente útil sólo usar el teclado para trabajar en nuestra terminal pero la primera frustración que tendremos es la muy famosa acción “copiar y pegar“, una técnica que nació en las antiguas imprentas para aligerar el trabajo con los tipografías de plomo. La historia del por qué no funciona en el bash las combinaciones CRTL+C y CTRL+V es larga y está bien explicada (en inglés) en este enlace. Para hacer corta esta entrada sólamente les enseño que lo que debemos hacer es usar MAYÚ+CTRL+C (SHIFT+CTRL+C) para “copiar” y MAYÚ+CTRL+V para “pegar”.

Hasta aquí no representa mayor sacrificio de nuestra parte, lo podemos aprender rápidamente, sólo es cuestión de pulsar sólo una tecla más. ¿Recuerdan que les dije al principio sobre un “atajo de ratón”? Pues bien para seleccionar, aunque ustedes no lo crean, sólamente se puede seleccionar con el puntero del ratón, y luego usar las combinaciones de teclas descritas. Hoy en día los ratones generalmente traen tres botones: izquierdo, central (rueda) y derecho. Pulsando la rueda sobre un texto seleccionado COPIARÁ Y PEGARÁ AUTOMÁTICAMENTE EN DONDE TENGAMOS EL CURSOR. ¿Cómo puede sernos útil dicho comportamiento? Será cuestión primero de practicar cómo funciona para luego encontrarle uso. 😎 Aquí les dejo un video explicativo:

Otras combinaciones de teclas útiles:

  • CTRL+FLECHA IZQ o CTRL+FLECHA DER va de palabra en palabra, al principio de cada una, en la dirección correspondiente.
  • TECLA “INICIO” y “FIN” nos ubica al principio o al final de la línea que estemos introduciendo en el prompt.

Actualizado el lunes 29 de febrero de 2016, año bisiesto.

Por Twitter seguimos la cuenta @Ubunlog donde se dedican de lleno a publicar temas sobre GNU/Linux Ubuntu pero sin dejar de lado asuntos que son comunes a todas las “distro’s”. En esta caso en particular tuvimos la oportunidad de leer el artículo “Los 5 comandos que todo usuario de Linux debería conocer” y, con toda humildad, leemos todas las noticias que podemos para mantenernos actualizados. Una opción que NO conocíamos es el comando gksudo el cual nos permite, con derechos de superusuario, “correr” una aplicación gráfica, como por ejemplo gedit. Generalmente utilizamos nano para editar con la linea de comandos, pero a veces los ojos agradecen un entorno más agradable, y como la consigna es hagamos más con menos trabajo y/o con más agrado pues publicamos esta enmienda a nuestra entrada en el blog. Aquí tenéis el mensaje “tuit” publicado por nuestros “tutores” del otro lado del “charco”:

Es así que si deseamos “lanzar” gedit como superusuario pues tecleamos lo siguiente seguido de la tecla INTRO (“ENTER”) en el BASH shell:

gksudo gedit

Y si tecleamos solamente el comando gksudo pues se nos muestra una ventana gráfica para que podamos seleccionar el usuario que necesiteis utilizar:


Actualizado el viernes 29 de septiembre de 2017.

¿Cuales son los comandos que más utilizamos?

Para responder esta pregunta, la cual nos puede sorprender por su resultado, utilizamos el siguiente truco en este hilo creado por Brian P. Hogan (más abajo nuestro resultado, agregad el vuestro a al hilo en Twitter por favor):

history | awk '{print $2;}' | sort | uniq -c | sort -rn | head -n 10

Enlaces relacionados al BASH shell.

Enlaces relacionados (en castellano):

Cuentas en Twitter dedicadas a la terminal (y otras cositas adicionales):

Enlaces relacionados (en inglés) con el BASH shell:

Some funny facts about command terminal:

 

Enlaces relacionados en Twitter:



Mensajes puntuales, “tuits” útiles

Download PDF

GNU Linux Canaima 4.1 x86.

Download PDF

Hay muchísimas distribuciones Linux, eso es la libertad pura y sincera. Aquí en Venezuela esta distribución es apoyada por el Gobierno de la República Bolivariana de Venezuela en su página dedicada al respecto. Recomiendo descargue por vía torrent ya que comparto esta archivo .iso y allí mismo tienen el hash md5 para comprobar que dicho archivo se haya descargado correctamente, doble verificación ya que el protocolo torrent tiene también su mecanismo de comprobación.

En mi caso utilizaré VirtualBox 4.3.10 corriendo sobre Ubuntu 14.04 LTS 64 bits, sobre el proceso de instalación de este programa de virtualización de computadoras le dedicaremos su entrada correspondiente.

Menú_005No abundaré en muchos detalles para el proceso de instalación, pero si los necesarios para lograrlo con éxito, espero me disculpen mi parquedad en esta entrada. En VirtualBox hacemos click en “Crear nueva máquina virtual” y se abre el siguiente cuadro de diálogo:

Crear máquina virtual_015

Y seleccionamos “Debian 32 bits” ya que VirtualBox así lo manifiesta en sus manuales “soportamos sólo las principales distribuciones” ya que es imposible colocar todas para seguirlas a una por una. Al hacer click en siguiente nos pregunta la cantidad reservada a la máquina virtual y dejamos el valor por defecto, 512 megabytes:

Crear máquina virtual_016

Lo siguiente es configurar el disco duro virtual, tenemos varias opciones pero elegiremos el formato por defecto .vdi y de manera dinámica, es decir, el archivo crece a medida que la máquina virtual se va instalando pero no sobrepasará en ningún caso la cantidad asignada 8 gigabytes (si necesitaramos más espacio para el disco duro virtual hay una manera por linea de comando pero merece su entrada aparte):

Crear máquina virtual_017Crear unidad de disco duro_007Crear unidad de disco duro_020Una vez hayamos creado el disco duro virtual y finalizado la creación con los valores que sugiere VirtualBox debemos hacer unos ajustes adicionales e importantes para comenzar a isntalar el sistema operativo GNU Linux Canaima. Primero seleccionamos la máquina virtual que acabamos de crear y hacemos click en configuración y se abre el siguiente cuadro de diálogo:

GNU_Linux_Canaima_X86 - Configuración_021Hacemos click en la pestaña “Sistema” donde vamos a desmarcar y bajar la opción de disquete dejando de primero el arranque por “CD/DVD/BLURAY” y de segunda “DISCO DURO” y en el dispositivo apuntador seleccionamos “Ratón PS/2”:

GNU_Linux_Canaima_X86 - Configuración_022Luego hacemos click en “Pantalla” y en “Memoria de vídeo” le colocamos 32 megabytes (que era lo que tenía de video mi primera computadora 486 en los años 90, con una tarjeta PCI, para Linux es más que suficiente):

GNU_Linux_Canaima_X86 - Configuración_023A continuación seleccionamos “Almacenamiento” iremos a lo más importante que es señalarle dónde se encuentra ubicado nuestra imagen .iso del Canaima y se lo especificamos en la unidad de cd virtual tal como lo vemos a continuación:

GNU_Linux_Canaima_X86 - Configuración_025GNU_Linux_Canaima_X86 - Configuración_026Por último vamos a la pestaña “Red” y le colocamos en “Conectado a” le especificamos “Adaptador puente” y expandimos “Avanzadas” y desmarcamos “Cable conectado” para que no se conecte al internet.

Lo que sigue a continuación es largo de describir,  pero revisando la pestaña “Pantalla” observo la opción “Captura de video” de donde pude grabar (con los valores por defecto) todo el proceso de instalación que para mi sorpresa descubro que graba en el formato .webm el cual es libre y orientado al HTML5. El reproductor que lo abre y visualiza es el VLC Y TAMBIÉN EL MOZILLA FIREFOX SIN NINGÚN TIPO DE PROBLEMA. Es también un formato soportado por Youtube así que se me ocurrió subirlo y presentarlo en ese formato multimedia, adaptándome al siglo XXI y orgullosamente aquí se los presento:

Ya para finalizar la entrada os confieso que traté de instalarle las “Guest Additions” para que VirtualBox pueda “pasar” dispositivos USB, carpetas compartidas y muchas otras características pero cansado y con sueño cometí errores y no finalizé por eso os ruego obvien del minuto 25:17 en adelante; gracias por su comprensión.

<Eso es todo, por ahora>.

Download PDF

Curso básico de HTML 5.

Download PDF

Ya usted, ellos, ellas y yo lo sé: hay infinidad de tutoriales en internet sobre HTML: sería “llover sobre mojado” volver a tratar el tema, pero ¿quién dijo miedo? 😉

En mi caso, el que me ocupa, es actualizarme al HTML 5 y enfrentar a dos viejos “demonios” en esto de la creación de páginas web. Y no, no me refiero a los servicios en GNU/Linux a los cuales llamamos “D.A.E.MON” si no a los dos grandes problemas que debemos enfrentar antes de comenzar a escribir una sola línea de código en HTML:

  1. La multitud de navegadores web existentes y el legado que traemos a rastras, ya que muchas personas se niegan a actualizar sus programas. Agreguemos a eso las particularidades de los nuevos celulares con Android y ni mencionemos los celulares con WAP (y por ende WML) que aún están en uso con sus micronavegadores.
  2. Los gustos de nosotros los seres humanos en cuanto a diseño, colores y funcionalidad de las páginas web (en otra entrada presentaré las hojas de estilo en cascada con las cuales enfrentaremos este aspecto).

Y para no abrumarlos ni abrumarlas más comienzo de una vez el tema.

Prefacio.

La “World Wide Web”, tal como la conocemos hoy día, vino de la genial idea del profesor Tim Berners-Lee (inspirado por Ted Nelson y convencido por Richard Matthew Stallman) y es quien actualmente aún lleva las riendas al presidir la “World Wide Web Consortium“, una organización creada en 1994, que agrupa a nivel mundial a más de 300 entes y quienes en conjunto recomiendan las normas del HTML. Y sí, leyeron bien, RECOMIENDAN las normativas ya que el HTML no es en realidad un lenguaje de programación sino un lenguaje de marcado, que además descansa sobre dos tecnologías llamada URL y HTTP. Por ahora sólo necesitamos saber de dónde viene y cuál es la situación actual, si quereís ahondar en conocimientos allí mismo teneís los enlaces (gracias de nuevo Señor Tim Berners-Lee).

Los lenguajes de marcado son (y para poder explicarlo y que sea comprensible rápidamente) como el antiguo dictado oral que hacíamos a las secretarias y/o mecanógrafas (casi siempre eran mujeres por su talento natural para lidiar con formas, colores y seres humanos) en el siglo pasado:

“Ponga estilo de carta. ponga comillas, ponga mayúsculas, Estimado Juan, ponga dos puntos, aparte, sangría, ponga primera letra mayúscula, te escribo esta carta, ponga negrillas, de forma muy urgente, cierre negrilla, ya que no me has enviado… etcétera“.

Y para los que nacimos y tuvimos la oportunidad de vivir en el siglo pasado, cada empleada tenía su manera de escribir y presentar las cartas, de allí la actuación de los navegadores web, cada uno ofrece ventajas y desventajas y cada quien escoge de acuerdo a sus necesidades.

Aclaratoria.

A menos que se diga expresamente lo contrario, todo a lo que nos refiramos es HTML versión 5, la del año 2014, la recomendada. Por supuesto que las etiquetas html presentan cierta compatibilidad hacia atrás, y también hay unas totalmente nuevas para esta versión. No entraré demasiado en dichas compatibilidades, si quereís estudiar ese aspecto por favor seguid los enlaces que presento a lo largo y ancho de la entrada. Si ya sabéis, habéis adquirido conocimiento con antelación, os recomiendo un tema más avanzado escrito en este mismo blog: Un CAPTCHA fácil y sencillo de implementar“.

Otra cosa que os parecerá harto extraño (pasado el tiempo lo comprenderíes con la experiencia que logréis) yo seguiré la siguiente consigna:

“Cualquiera puede equivocarse, excepto nosotros“.

¿Qué significa lo anterior? Que seremos más estrictos en la sintaxis del HTML pero sin llegar a declararnos explícitamente como XHTML, así tendremos lo mejor de ambos mundos.

Mi primera página web.

Así que llegamos a dar nuestros pininos en el internet como protagonistas y no como simples lectores. Las páginas web descansan en archivos de texto plano con la extensión .htm o para los sistemas operativos modernos .html y dichas extensiones permiten que identifiquemos qué tipo de contenido albergan más sin embargo para nuestras computadoras el contenido es lo importante. Es así que debemos conocer nuestro primer elemento del lenguaje HTML dentro del archivo nombrado (recordemos que los nombres de archivos son sensibles a mayúsculas y minúsculas):

<!doctype html>

 Como vemos comienza con el signo “mayor que” y finaliza con “menor que”. He aquí la primera diferencia con los lenguajes de programación: aquí dichos símbolos carecen de significado matemático alguno, sirven más bien como delimitadores. Ya que le damos ese uso, nuestra mente cambia el enfoque y los asocia a los paréntesisque trabajan por pares donde uno “abre” y el otro “cierra”. Dentro de esta categoría están los corchetes y luego las llaves: ( [ { } ] ) , en ese orden anidado. Como son rectos y se parecen más a los corchetes que a los otros dos optamos por llamarlos corchetes angulares y así son llamados en inglés angle brackets (y en inglés antiguo chevrons). Y hemos de referirnos al inglés porque precisamente es éste el idioma en el que está escrito el HTML, angle brackets es la traducción literal de corchetes angulares.

Dentro de estos delimitadores está el cierre del signo de admiración acompañado de la palabra doctype que es un recurso nemotécnico abreviado de  “DOCument TYPE” y traduciremos como “tipo de documento” acompañado, por supuesto, de la palabra html. Para este caso particular el uso de mayúsculas y minúsculas es indistinto pero tiene una excepción: como esta declaración se incluye por compatibilidad con anteriores versiones del lenguaje y dichos identificadores para cada versión son un tanto largas y complicadas y de paso eran obligatorias se decidió incorporar lo que yo llamo “un relleno” que debe ser escrito literalmente y entre comillas dobles o simples para aquellos servidores que buscan estos identificadores: dicha sentencia es “about:legacy-compat” que viene a ser leida por nosotros como “acerca de:compatibilidad heredada”. Nuestra primera linea quedaría de la siguiente manera:

<!doctype html system "about:legacy-compat">

La segunda linea a continuación define la página web en sí y tiene el propio nombre html para declarar dónde comienza y dónde termina:

<html lang="es-419"> ... </html>

Donde están los puntos suspensivos colocaremos todo el código, notemos la nomenclatura para definir el idioma y región de nuestro país según el organismo Naciones Unidas: “es-419”; (y ratificado por el W3C en esta página, sin embargo muchos utilizan la norma ISO 639-1 ambos son válidos si recordamos que la W3C sólo recomienda, no obliga) y si necesitaramos programar para alguna otra región del mundo acá está el resto de los códigos.

A partir de este momento colocaré el código completo de la página web las cual ustedes introducirán con el editor de texto de su preferencia, hay muchos, a mi me gusta el nano, notepad++ y gedit. Para uso avanzado están vi y vim. Las capturas de pantalla que verán son tomadas al gedit que viene con ubuntu al cual le hice unas cuantas modificaciones de perfil, para verlas en detalle haga click aquí.

<!doctype html system "about:legacy-compat">
<html lang="es-419">

</html>

Nosotros los seres humanos necesitamos, nos gusta, tener información adicional que nos guía o aclara el código pero que para las máquinas no tiene relevancia. La manera de que ellas “ignoren” dichos datos es colocándolo como comentarios con la siguiente sintaxis:

<!-- ... -->

Donde están los tres puntos insertamos el comentario que deseemos, no importa si ocupa varias lineas pero lo importante es que tengan su apertura y cierre. ¿Recuerdan que les dije que gedit lo utilizo con una configuración especial? Comparen el código que llevamos en purito texto plano y vean como lo presenta el editor de texto gedit:

<!doctype html system "about:legacy-compat"><!--Declara HTML5-->
<html lang="es-419"><!--Escrito en castellano de América-->

</html>

-primera_clase.html (~) - gedit_029

¡Qué diferencia! Al suministrar el nombre al archivo, con todo y extensión, gedit automáticamente codifica al lenguaje html como pueden obervar en la barra de estado inferior de la ventana.

El siguiente paso que haremos es ir a la carpeta donde guardamos nuestro archivo ( al que le dimos el nombre “primera_clase.html”) y lo abrimos ya sea con doble click, click izquierdo o click derecho+abrir en navegador. Cada sistema operativo moderno tiene un navegador web predeterminado, así es que se puede visualizar nuestra primera página web, MÁS SIN EMBARGO NO VEREMOS NADA PUES AÚN FALTAN MÁS LÍNEAS DE CÓDIGO. ¿Por qué entonces yo pido abrirla de una vez, sin más?

La respuesta es: pedirle al navegador web que nos muestre la página web que estamos haciendo para visualizar el código fuente (generalmente haciendo click derecho sobre nuestra página web abierta en navegador). Quiero hacer énfasis que una página web, a pesar de todo nuestro empeño de escribirla bien -según las recomendaciones- depende de algunas cosas más. Les muestro lo que interpreta nuestro navegador web, en este caso Mozilla Firefox:

Fuente de: file:---home-jimmy-primera_clase.html - Mozilla Firefox_015

El punto que quiero recalcar es la palabra América la cual se muestra incorrectamente, con unos caracteres extraños, así que hemos de reparar en que nuestro bello idioma castellano sea escrito (y visualizado) correctamente. A pesar de derivar del latín, (idioma que nunca tuvo acentos ni signos ortogŕaficos) con la evolución de nuestro idioma se llegó a un lenguaje de marcado (ver inicio de esta entrada) que ayuda muchísimo a transmitir mejor las ideas; o lo que yo llamo “degustar las palabras”. Es por ello que en el lenguaje HTML se tomó la previsión de mostrar correctamente dichos caracteres con etiquetas especiales, así tenemos que para mostrar nuestras vocales acentuadas y la letra eñe (las mayúsculas siguen la misma normativa):

á -> &aacute;
é -> &eacute;
í -> &iacute;
ó -> &oacute;
ú -> &uacute;
ñ -> &ntilde;

Y para los acentos en idioma catalán y francés (aquí podeís ver una lista de los más utilizados):

à -> &agrave;
è -> &egrave;
ì -> &igrave;
ò -> &ograve;
ù -> &ugrave;
â -> &acirc;
ê -> &ecirc;
î -> &icirc;
ô -> &ocirc;
û -> &ucirc;

Si insertamos los anteriores caracteres “especiales” (no usados en el idioma inglés) en nuestra primera página web, la guardamos y abrimos con nuestro navegador web (y pedimos visualizar nuestro código fuente) veríamos algo similar a esto en el programa gedit:

primera_clase.html (~) - gedit_019

Y en el navegador web Mozilla Firefox:

Área de trabajo 1_016

Como pueden notar el navegador cumple con su trabajo de mostrar los caracteres especiales, más sin embargo podemos observar que la palabra América en el comentario sigue sin visualizarse correctamente y no, no es porque no utilicé el &ecute; (si quieren hagan la prueba) es por otro motivo más importante. Y, yo ya se que los comentarios no revisten importancia, pensarán ustedes, total eso no se muestra en nuestra página web, sigamos adelante y comprenderán.

Mi primera página web es en castellano.

Ya que hay muchísimas páginas web en inglés, pues vaya que le toca al castellano llenar espacio. Antes de proseguir debo aclarar que lo que los voy a comentar lo aprendí en esta página web. (si no está en línea, prueben este otro enlace o este otro). Si quieren saber la historia de la codificación de caracteres puede leer (en inglés) esta otra página web del lenguaje de programación Python. Debemos indicar también que tocaremos brevemente ciertos aspectos inherentes a los programas que sirven páginas web, “servidores web”.

Volviendo a nuestro archivo de texto plano con extensión .html y editado con el programa gedit debemos tener especial cuidado en guardar dicho archivo en la codificación de caracteres utf-8 tal como muestro al escoger la opción “Guardar como”, les resalto con una elipse para acentuar la opción:

Guardar como_035

¿Por qué usar UTF-8 en vez de otros sistemas de codificación?

La respuesta les va a sorprender (y el que me quiera refutar, por favor escriba abajo en los comentarios): USAMOS EL UTF-8 POR COSTUMBRE HEREDADA DEL IMPERIO ROMANO, nacido además en Grecia, cuna de nuestra civilización occidental. Es así, de hecho, que en marzo de 2015 el 83% de las páginas web utilizan esta codificación, y de paso es la recomendada por la World Wide Web Consortium (W3C) por su compatibilidad hacia atrás con la codificación ASCII y hacia adelante con los caracteres (o más bien ideogramas) orientales (hindi, coreano, chino, etc). Esta “compatibilidad hacia adelante” se ve sacrificada por el aumento de bytes en página ya que el UTF-8 fue pensado para ser de longitud variable: si escribimos en cualquier lengua indoeuropea usaremos menos espacio y si escribimos en ideogramas usaremos un poco más de espacio. Es por ello que elegimos UTF-8 PERO NO SE LIMITEN A ELLO si se les presenta la oportunidad de trabajar en otro país de Asia (ejemplo loable cuenta Twitter: @Kopepasah ), si ese fuera su caso, están las codificaciones UTF-16 y la más completa por ahora UTF-32 (vean aquí cómo se estructuran los caracteres); agregarlas a nuestro programa gedit es bien fácil, sólo hacemos click en la ‘flechita’ de codificación de caracteres (ver gráfico anterior) y escogemos “añadir o quitar” y nos muestra este cuadro de diálogo:

Códigos de caracteres_037

Seleccionamos la codificación que necesitaramos y listo, lo guardamos en esa codificación PERO CON EL CUIDADO ESPECIAL DE ESPECIFICARLO EN NUESTRA PÁGINA WEB.

El metacomando para declarar la codificación de caracteres escogida es:


 y debe ser incluida en el meta comando head:

<head><meta charset="UTF-8"></head>

Sólo queda informar dos detalles más acerca de esto y es referida explícitamente al programa servidor web Apache utilizado ampliamente en el mundo:

  • Lo correcto es que incluyamos dicha sentencia en todas y cada una de nuestras páginas html pero hay quienes piensan que debemos simplificarnos la vida y configurar a Apache a que automáticamente ‘emita’ nuestra página web con dicha configuración UTF-8.
  • Debido a lo anterior podemos especificar en el archivo .htacces en el directorio raíz de nuestro sitio web (subdirectorios ‘heredarán’ la configuración) que contenga la sentencia “AddDefaultCharset UTF-8“.
  • Si se configura según el punto anterior, el servidor obviará la sentencia que coloquemos en el fichero .html: si por ejemplo especificamos <head><meta charset=”UTF-16″></head> se obviará UTF-16 y será emitido como UTF-8.
  • Si especificamos en el fichero /etc/apache2/conf.d/charset la sentencia “AddDefaultCharset UTF-8” tendrá el mismo efecto con la diferencia que afectará a todos y cada uno de los sitios web alojados en ese servidor (esta configuración es muy común para ahorrar hardware con sitios web de poco tráfico).
  • Es por tanto que recomendamos agregar en el archivo .htacces la sentencia “AddDefaultCharset OFF” y simplemente a cada archivo .html le especificamos <head><meta charset=”UTF-8″></head>.
  • De ser posible que tengamos acceso /etc/apache2/conf.d/charset (osea, el servidor está entera y únicamente a nuestro sitio web) agregarlo allí también para mayor seguridad (si desea saber más vaya usted a este enlace).
  • Para finalizar este punto, existe un método para indicar la codificación de caracteres empleando lenguaje PHP pero escapa al alcance de este tutorial, no obstante anótenlo para tenerlo siempre presente cuando evolucionemos.

Agregando más comandos a <head></head>.

Al comando para declarar la codificación de caracteres, agregaremos las siguientes etiquetas para que el navegador muestre nuestro título de página en la ventana , si es que el dispositivo lo permite (por ejemplo los celulares no lo hacen):

<title>Titulo de la página web.</title>

En dicha cabecera (que sería la traducción al castellano), además de <meta> y <title> admite los siguientes elementos:

  • <style>…</style>:permite especificar estilos como color de fondo, color de texto, etc. aplicadas a cada sección o texto de la página web.
  • <link>: si por el contrario queremos especificar dichos estilos en un archivo aparte para servir distintos archivos .html en un mismo directorio, podemos usarlo y ahorrar esfuerzo y espacio en disco. No tiene etiqueta de cierre. Dichos aspectos son cubiertos por las Hojas de Estilo en Cascada (cascading style sheets o CSS) y las presentaremos en el siguiente capítulo, por ahora basta saber que la sintaxis será (ejemplo): <link rel=”stylesheet” href=”mystyle.css”>
  • <script></script>: sirve para encerrar código en lenguaje de programación interpretado del lado del cliente (nuestro navegador web) denominado JavaScript (aunque también tiene una versión del lado del servidor). Merece una entrada totalmente aparte.
  • <base>: permite especificar una directorio diferente al que por defecto está nuestra página web. No tiene etiqueta de cierre. En nuestro caso, por ejemplo, nos serviría para especificar imágenes alojadas incluso en otro servidor web (si lo permite) ahorrándonos la escritura de código adicional. Ejemplo: <base href=“http://www.w3schools.com/images/”>
  • Por último volvemos a la etiqueta <meta></meta>, la cual puede contener numerosos valores, ya vimos charset pero además acepta name, http-equiv, e itemprop.

Como pueden ver, las opciones se nos agigantaron rápidamente, pero cuando algo es complejo debemos picarlo en trozos para luego digerirlos uno por uno. Volviendo a nuestra primera página quedaría de la siguiente manera:

Mi primera página web es en castellano

página web y código fuente

Cuerpo de página:la etiqueta <body></body>.

Como pueden observar hasta ahora lo único  “visible” que hemos hecho son los caracteres especiales los cuales incluimos con propósitos didácticos. Para estar en lo correcto debemos encerrarlas entre las etiquetas <body>…</body>, donde están los puntos supensivos. Dentro de estas etiquetas irá toda nuestra página web ordenadas con las siguientes etiquetas:

  • <header></header>: un resúmen de la página, pudiéndose indicar además algún ícono y/o datos del autor. Se pueden declarar varias veces, de ser necesario, aunque nuestro estilo será declararlo una sola vez por página.
  • <section></section>: donde se desglosará lo planteado en el punto anterior pero además debemos encerrarlos entre <article>…</article>. Se pueden declarar las veces que sean necesarias, pero recuerden anidar correctamente cada uno: <section><article></article></section>.
  • Refinando el punto anterior, HTML5 no manda ni ordena anidar de la forma en que yo lo explico pero ¿A quién NO le gusta el orden y sentido?
  • Si queremos mostrar una figura e incluso colocarle un texto descriptivo usaremos <figure> </figure> y <figure> (imagen) <figcaption> (texto) </figcaption></figure>.
  • Si queremos mostrar un menú lateral debemos usar <aside></aside>.
  • Para finalizar el elemento de pie de página <footer></footer> donde podemos indicar autoría, licencias de uso, datos de contacto, mapa del sitio o enlaces externos o internos como siguiente o previo.
  • NÓTESE EL EXTRAORDINARIO PARECIDO con escribir un libro:
    1. Datos de imprenta: <doctype>.
    2. Lomo del libro: <head> y <title>.
    3. El libro en si mismo: <html>.
    4. Prólogo y/o índice: <header>.
    5. Capítulos y subcapítulos: <section><article>.
    6. Imágenes y/o gráficos explicativos: <figure>.
    7. Comentarios al margen: <aside>.
    8. Pie de página -mayor analogía imposible-: <footer>.

Diseño de página.

Llámenme “conservador” pero Gutenberg y el medioevo siguen vigentes hoy día, así como físicamente un libro debe ser diagramado según unos valores armónicos, nosotros también debemos otorgárselo a nuestra página web. He aquí cómo se hacía antes y hacia adonde vamos ahora:

Popularized by Jan Tschichold in his book The Form of the Book in 1975.
The Van de Graaf canon is used in book design to divide a page in pleasing proportions. This canon is also known as the “secret canon” used in many medieval manuscripts and incunabula. The page proportions vary, but most commonly used is the 2:3 proportion. In this canon the text area and page size are of same proportions, and the height of the text area equals the page width.

Tal como en la antigüedad se dieron a la tarea de diagramar los libros hoy en día hay gente que se ha dado a la tarea de ahorrarnos ese trabajo con unos marcos de trabajo (framework) para el lenguaje HTML pero eso lo explicaré en su entrada respectiva.

En este punto les muestro cómo es la estructura de cualquiera página web, lo que está en color blanco es lo que nos muestra finalmente nuestro navegador web preferido:

HTML page structureEn el gráfico anterior, si detallan bien, hay dos elementos que aún no he explicado: son los comandos que nos permiten insertar un título y su párrafo correspondiente; ¿recuerdan la analogía con un libro? Pues ahora vamos a ello.

Títulos y párrafos.

Los títulos que deseemos deben ir dentro de la siguiente estructura de comando, siendo 1 el tamaño más grande y el 6 el más pequeño. No debemos preocuparnos por la fuente de letra que utilice el navegador, dicho programa al leer  el tamaño del título se encargará de mostrarlo adecuadamente.

<h1>Título 1.</h1>
<h2>Título 2.</h2>
<h3>Título 3.</h3>
<h4>Título 4.</h4>
<h5>Título 5.</h5>
<h6>Título 6.</h6>

Acá pueden observar, “en vivo”, cómo se mostraría nuestra página web en castellano en su navegador favorito o escogido para leer mi enseñanza.

primera_clase_titulos_y_parrafosAntes de continuar debo explicaros ciertos detallitos con propósitos didácticos y prácticos:

  • Ya nuestra página tiene 35 líneas y es difícil de mostrar en una sola captura de pantalla, si haceís click en la última imagen podrán verla en una ventana (o pestaña) nueva en su tamaño original.
  • El código indentado facilita la legibilidad a los humanos pero ocupa espacio -tanto en disco como en tráfico- cuando el usuario solicita la página.
  • Dicho código indentado me fue posible escribirlo rápidamente con la personalización que le hice a gedit, el indentado ayuda a visualizar y los resaltados de colores nos ayuda a encontrar errores de sintaxis.
  • Podríamos eliminar los “espacios sobrantes” a fin  de optimizarla para cuando la vayamos a publicar pero dicho trabajo es titánico a la larga.
  • Además podríamos indicarle a nuestro servidor Apache que comprima todo lo que vaya a enviar a los usuarios, pero ese tema escapa a este tutorial.
  • Debido a todo lo anterior en lo sucesivo sólo explicaré el comando correspondiente y su enlace “en vivo” para que vean cómo lo interpreta su navegador web y con click derecho (o el método adecuado) observen el código fuente, analízenlo y vuelven por estos lares. Ojito pues. 😉
  • Por supuesto debo acotar que esto último de los espacios extras para el código html ya otras personas han tenido que lidiarlo y lo han sobrellevado pero que muy bien; por ejemplo en esta página web nos hacen el trabajo: copiando , pegando y ejecutando me dice que pudo cortar 123 espacios, éso son 984 bits ahorrados, multipliquen eso por las miles o decenas de miles de visitas a su página web: bueno “éso no son conchas de ajo” como dice el refrán.

Formato básico del texto.

Ya sabemos cómo agregar títulos y párrafos en lenguaje html, ahora veremos cómo darle formato a nuestro texto, verbi gratia a lo largo de este tutorial hacemos gala de ello.

Texto en negritas:

<p>«Los Estados Unidos parecen destinados por la Providencia a plagar la América de miserias en nombre de la libertad».<br><b>Simón Bolívar.</b></p>

El pensamiento de nuestro Libertador arriba expresado en lenguaje html introduce el salto de línea para separar la cita del autor ya que debemos tener en cuenta que los navegadores hacen sólo lo que le ordenamos: todo el texto es un párrafo y así lo muestra, seguido, pero a fin de darle un sentido de relación (pensamiento-autor) se le debe insertar el comando <br> cuantas veces lo necesitemos recordando siempre que separa líneas, no párrafos.

En XHTML se debe escribir como <br />, con un espacio entre la letra erre y la barra, teniendo un así un “autocierre” pero en HTML dicho comando no tiene cierre y si le agregamos (</br> o <br/>) los navegadores lo admiten e interpretan como <br>. Yo prefiero utilizar <br /> tal y como convenimos al comienzo de este documento.

¿Recuerdan lo que hablamos sobre eliminar los espacios del texto indentado? Pues bien he de añadirles que si escribimos varios espacios entre las palabras y saltos de línea nuestro navegador web lo mostrará exactamente igual. Así el código arriba mostrado es igual a este:

<p>«Los Estados Unidos   parecen destinados por la Providencia a plagar   la América de   miserias en    nombre de la libertad».<br>


<b>Simón

1
&amp;nbsp;
Bolívar.</b></p>

Noten esas letras que agregué entre el nombre y apellido: se conoce como espacio irrompible y se utiliza para decirle al navegador que mantenga esas dos palabras unidas por un espacio sin importar ningún otro comando (centrado, justificado, etc.) y se representa como &nbsp; y observen el recurso nemotécnico: nbsp=NoBlankSPace (encerrado entre et y punto y coma tal como lo vimos para representar caracteres especiales; si lo pensamos bien es un comando de apertura y cierre no simétrico en html).

Texto en cursivas:

<i>Fuente</i>: de la carta al Coronel Campbell, Guayaquil, 5 de agosto de 1829.

Si queremos “aislar” dicho pensamiento podemos agregar una linea horizontal antes y después y no es necesario escribir una serie de guiones como estilan los editores de texto avanzados, simplemente le colocamos <hr> y para ser más preciso con su correspondiente autocierre <hr /> (tal como lo expliqué dos párrafos hacia arriba).

Texto enfatizado:

Es diferente de las cursivas (también llamadas “italics” en inglés) y nos sirve para hacer notar algo, por ejemplo fechas, tal como lo muestro:

<i>Fuente</i>: de la carta al Coronel Campbell, <em>Guayaquil, 5 de agosto de 1829</em>.

Tal vez veamos iguales a cursivas y enfatizados en nuestro navegador web. Pero hay diferencia, y aquí voy a englobar la etiqueta de negritas <b> con la etiqueta fuerte <strong>: mientras que <i> y <b> es opcional para el navegador el mostrarlo diferente, las etiquetas <em> y <strong> obligan a mostrarlo diferente.

Aún más allá, como los dispositivos electrónicos han adquirido gran poder de cálculo, eso ha permitido que incluso dichos aparatos lean en voz alta a personas discapacitadas de la vista y cuando encuentran las etiquetas <em> y <strong> el tono de voz cambia de manera correspondiente.

Texto “grande” y “pequeño”:

Encierro entre comillas los términos sólamente para que noten que dependerá del tamaño predefinido en su navegador web: en base a ese tamaño mostrará más grande o más pequeño los textos a mostrar:

<p>
  <big>«Los Estados Unidos   parecen destinados por la Providencia a plagar la América de miserias en nombre de la libertad».<br />
  <b>Simón&nbsp;Bolívar.</b></big><br />
  <small><i>Fuente</i>: de la carta al Coronel Campbell, <em>5 de agosto de 1829</em></small>.
</p>

Texto “preformateado”:

Muchas veces necesitamos, por ejemplo, escribir fórmulas matemáticas (y ya sabemos cómo insertar caracteres especiales) y por practicidad se definió este comando para que el navegador lo presente con una fuente monoespaciada y respetando los espacios y saltos de lineas sin necesidad de etiquetas especiales tal como hemos venido aprendiendo. Aquí la simplicidad es bienvenida, imaginen todo el esfuerzo en tecleo de comando para mostrar esto:

<pre>
   y =  x + 3
y -3 =  x
  -x = -y +3
   x =  y + 3
</pre>

Ese cuadro semisombreado que ven está hecho con el comando <pre> pero es el estilo aplicado en este blog lo que lo hace así, sirva como introductorio a las hojas de estilos en cascada.

Superíndices y subíndices.

De nuevo las fórmulas matemáticas son las que mayor uso dan a estas etiquetas:

<pre>
   y<sub>1</sub> =  x<sup>2</sup> + 3
</pre>

Texto resaltado:

Si queremos indicar algo importante, podemos resaltarlo (teniendo siempre en cuenta que cada navegador lo muestra a su manera prestablecida):

y = 5 - 3
<mark>y = 2</mark>

Texto insertado y eliminado:

Muchas veces queremos explicar cómo se llegó a un punto determinado agregando y eliminando explicaciones, encuentro útil siempre las fórmulas matemáticas; siguiendo con el ejemplo anterior:

y = 5 - 3
y = 5 - <ins>(+</ins>3<ins>)</ins>
y = 5 - <del>(+</del>3<del>)</del>
<mark>y = 2</mark>

Observación especial: el insertado puede confundirse con el comando subrayado <u></u>, etiqueta esta que no he explicado aún porque lo considero en desuso ya que se confunde fácilmente con los enlaces “links” en los navegadores. Tanto es así que ahora se utiliza para denotar palabras mal escritas (o en uso especial para el idioma chino); valga la acotación.

Todo lo que explico sobre formato de texto está en este enlace para que lo visualicen y analicen.

Con lo que hemos aprendido es suficiente para comenzar a escribir una página web decente, pero en camino a la excelencia debemos aprender más sobre el sueño de Tim Berners Lee: el hipertexto.

Enlaces y tipos de enlaces.

 La razón de ser del html: los enlaces que permiten guiar hacia otros contenidos, construídos unos sobres otros. Es lo que he hecho con este tutorial, los “links” que he colocado indican de dónde he obtenido información e incluso permiten profundizar los conocimientos de usted amable lector o lectora, si así lo quisiera. Sin más lo presento:

<a href="http://www.seniat.gob.ve/">Servicio Nacional Integrado de Administración Aduanera y Tributaria.</a>

Tal como pueden apreciar, tiene su apertura y cierre <a>…</a> pero además se debe incluir la dirección web (que no será visible a menos que el usuario ubique el puntero sobre el enlace) y en los tres puntos colocaremos la descripción del sitio a donde queramos referir al internauta.

Es de hacer notar que incluso podemos especificar la dirección ip del servidor a consultar (si es dedicado, es decir, sirve una sola página web) y hasta por cual puerto vamos a hacer la consulta. El siguiente ejemplo nos permite preguntarle al Instituto Nacional de Higiene “Rafael Rangel”, ente que tiene en Venezuela el monopolio sobre la aprobación o negación de nuevos medicamentos o la renovación de los mismos, sobre los medicamentos vigentes cuyos nombre comiencen con la letra hache:

<a href="http://190.202.114.146:7474/ef/aprobados_int/productos-1.php?l=H">Medicamentos aprobados en Venezuela, letra H.</a>

 Por el contrario, si lo que queremos es referirnos a una página web que está en nuestro mismo servidor y en la misma carpeta lo que debemos hacer es simplemente colocar el archivo que contiene la página web:

<a href="ejemplo.html">Ver ejemplo</a>

Para que cambiemos la búsqueda por defecto en nuestro propio servidor web sólo debemos colocar el comando <base> el cual explicamos brevemente y ahora vamos a ampliar:

<head>
<base>href="http://www.ks7000.net/images/"</base>
</head>

Siendo así que este comando <base> esté declarado en <head> por defecto el penúltimo enlace de ejemplo será buscado en el dominio “ks7000.net” en la carpeta “images” en vez de la carpeta donde está alojada la página abierta.

Otra opción muy útil es especificar si el enlace se abrirá en la misma ventana o pestaña de donde se le llama o en una nueva, aquí en este tutorial las he colocado en una nueva ventana o pestaña para poder seguir el hilo del tema principal de estudio. Así el comando que necesitamos es:

<a href="http://www.ivss.gob.ve" target="_blank"></a>

El otro valores para target es “_self”, que es el valor por defecto y generalmente no se escribe (“_parent”, “_top” y “framename”, que se usaban con frame –no  soportado por HTML5- dejaron de usarse). El comando <base> también acepta ambos parámetros.

 Imágenes.

La inclusión de imágenes en una página web pasa por hablar brevemente sobre la historias de los formatos utilizados para representarlas. Pero primero veamos el comando utilizado por HTML para decirle al navegador cual imagen debe “cargar” y luego ahondaremos el tema de la historia de las imágenes digitales:

<img src="mi_imagen.jpg" alt="Mi imagen" />

Como ven el comando no tiene un cierre sino más bien un autocierre (opcional en HTML pero obligatorio en XHTML). En este ejemplo asume que la imagen está alojada en la misma carpeta que contiene el archivo .html (a menos que usemos el comado <base>, visto anteriormente dentro de <head>). Si la imagen estuviera ubicada en una subcarpeta, simplemente colocaríamos:

<img src="/images/mi_imagen.jpg" alt="Mi imagen" />

O incluso, si estuviera ubicada en otro servidor de nuestra propiedad (por favor eviten el hotlinking ya que es de muy mal gusto “robar” el ancho de banda a otros entes o personas):

<img src="http://www.ks7000.net/images/mi_imagen.jpg" alt="Mi imagen en otro servidor" />

El parámetro alt es obligatorio ya que el navegador muestra el texto colocado entre comillas mientras descarga la imagen en sí y si no la puede descargar, pues bueno, el texto indica que allí debería ir una imagen. Otro uso importante es para los discapacitados visuales ya que los programas lectores usan este texto para narrar de que imágen se trata, así que ojito con colocarle acertadas palabras.

Un uso muy común para las imágenes es utilizarlas como botones para los enlaces ya que llaman más la atención que un mero texto subrayado, aquí debemos aplicar el anidado de instrucciones, fíjense:

<a href="www.a.com"><img src="mi_imagen.jpg" alt="Mi imagen" /></a>

Otro parámetro que soporta el comando <img> es <style> con el cual podemos especificarle al navegador web del usuario que la imagen deseada la convierta a un tamaño específico, ancho y alto en pixeles, por ejemplo:

<img src="/images/mi_imagen.jpg" alt="Mi imagen" style="width:128px;height:128px" />

Así, no importa el tamaño que tenga la imagen original, ésta será mostrada a 128×128 pixeles pero debe usarse esto con mucho cuidado: tengan presente que la imagen que descargará el usuario siempre ocupará el mismo ancho de banda, NO IMPORTA QUE SE VEA MÁS PEQUEÑA, la cantidad de bytes descargados siempre será la misma cantidad. Es por ello que ahora si hablaré de la historia de las imágenes digitales, tómense un café y vuelvan que esto se pone interesante. 😎


style=”text-align: justify;”>Imágenes digitales.

En el siglo pasado, cuando usamos rollos fotográficos (plásticos impregnados de químicos fotosensibles para fijar la luz, generalmente hechos a base de plata) quedaban como negativos fotográficos con los cuales se podían sacar las fotografías en sí, cuantas copias se necesitaran. Con las fotografías digitales sucede un proceso parecido: cada cámara o filmadora almacena la foto original en formato RAW o DCRAW que, esencialmente, consiste en millones de ceros y unos que representan los colores que recibió el sensor digital. Es, por tanto, muy grande y tiene muy poca pérdida de información sobre la fotografía tomada. Pero al igual que con los negativos fotográficos, esta información poco nos sirve por su dificultad de visualizarlos con el ojo humano. Es por ello que, para ahorrar en hardware, se decidió someter dichos datos RAW (existen cientos de formatos RAW, cada fabricante usa o inventa el que mejor le parece y la mejor alternativa a futuro es el formato libre DCRAW) a un proceso de pérdida de información y además compresión y codificación en un formato estandar para, de esta manera, poder compartir con el resto del mundo la fotografía tomada.

DCRAW: live free or die.
DCRAW: live free or die.

Es decir, nuestros navegadores web deben ser capaces de mostrar cualquier imagen siempre y cuando dicho fichero esté codificado en un formato normalizado, el formato RAW o DCRAW no nos sirve para este propósito de hacer páginas web. Simplificando: un programador de paginas web debe rápidamente hacerse estas preguntas antes de escoger un formato de imagen para el trabajo por el cual lo contrataron:

  • ¿Necesita transparencia?
  • ¿Necesita animación?
  • ¿Necesita buena calidad de imagen?

 

Lo que paso a enseñar es un resúmen al máximo de lo publicado (en idioma inglés) de las siguientes páginas:


Si tenemos en cuenta que las imágenes en una página web en promedio ocupan entre 60 y 70% del tamaño en bytes de la misma debemos prestar especial atención en escoger los formatos de imágenes correctos para ahorrar al usuario tiempo, dinero en conexión, y se queden más de un minuto en nuestro sitio web.

Fuentes consultadas.

En idioma inglés.

Download PDF
CAPTCHA con PHP.

Un CAPTCHA fácil y sencillo de implementar.

Download PDF

CAPTCHA

Introducción:

Siempre me ha llamado la atención los CAPTCHA (“Completely Automated Public Turing test to tell Computers and Humans Apart“) que hay en muchas páginas web y que permiten diferenciar consultas hechas por humanos de las hechas por “arañas” que pululan por internet (son también conocidas como “robots”). La diferencia esencial en este caso con respecto a la prueba de Turing es que se trata de convencer a una máquina que es un humano, osea el inverso de la prueba.

En el idioma inglés existe la filosofía K.I.S.S. y la practico frecuentemente ya que los sistemas complejos tienden al caos de manera natural. Es por ello que buscando por internet (precisamente ayudado por las “arañas” que pretendo combatir, ¡qué ironía!) he encontrado el siguiente artículo que me deslumbró por su simplicidad más al cabo de una hora de estudio observo los elementos implícitos sin los cuales NO funciona. Recomiendo vayan y lean dicho artículo y regresen cuando lo hayan asimilado, yo por aquí les espero. 😎


El artículo data del año 2007 pero considero que no ha perdido vigencia alguna, si administran una página web bancaria o son partidarios del último grito de la moda, recomiendo desistan de seguir leyendo esto. 😉

Pues bien manos a la obra.

Requisitos previos.

Utilizo una máquina virtual con Debian Wheezy con la cual estudio el programa para base de datos PostgreSQL a la cual le he instalado también un servidor Apache con PHP: este tipo de configuración es llamado LAMP por sus siglas en inglés, sólo que en aquí en realidad es un LAPP: Linux, Apache, PostgreSQL y PHP. Hay muchísimos tutoriales para instalar este tipo de servidores por ello partimos de la base que ustedes cuentan con uno en funcionamiento y para pruebas (no utilicen un servidor “en producción” hasta tanto no estén completamente seguros de este código). Importante recalcar que no utilizaremos funciones de bases de datos en esta entrada, pero muy frecuentemente las CAPTCHA se utilizan en este tipo de ambiente, por ejemplo, registrar usuarios en una lista de correo electrónico (tremenda tentación para los “robots spam”), así que allí encaja perfectamente.

Configuración adicional.

Al servidor LAPP anteriormente descrito debemos instalarle unas librerías para el trabajo gráfico bajo el lenguaje PHP. Aquí está muy bien descrito a lo que me refiero, haciendo la salvedad que dichas librerías NO SIEMPRE están instaladas por defecto.

En todo caso debemos crear una carpeta bajo la raíz web del servidor Apache con el nombre “captcha” y donde alojaremos el siguiente archivo “info.php”:


1
2
3
4
5
&lt;?php
// Archivo "info.php":
// Muestra toda la información, por defecto INFO_ALL
phpinfo();
?&gt;
y luego iremos a nuestro navegador web preferido a la dirección IP que le hayamos asignado en nuestra red de área local. En mi caso dicha dirección es 192.168.1.27 en la carpeta “captcha”:
captcha01En dicha página debemos buscar si están instalados los siguientes valores:
captcha02Dado el caso que no se encuentren instaladas dichas librerías debemos recurrir a la línea de comandos y escribir lo siguiente:
sudo apt-get install php5-gd
y verán algo más o menos parecido a esto (en mi caso no necesité el comando “sudo” porque ya había ganado acceso como root con el comando “su”):
captcha_003
Dichas librerías son necesarias para el trabajo con imágenes jpg, png y gif, entre otros formatos y funciones.

Imagen de fondo para el CAPTCHA:

Necesitaremos un imagen tipo gif con unas dimensiones de 100×30 píxeles con colores adecuados teniendo en cuenta que las letras serán negras buscaremos colores como azul o verde o el que gusten pero no de color negro. Yo elegí la siguiente imagen (aunque al final agregaremos varios elementos para dificutarles la tarea de lectura a los “robots” con técnicas OCR ): bgcaptcha.gifComo ven es una imagen con degradado que busca confundir al OCR pero con legibilidad al ser humano; no obstante usar este mismo fondo siempre y con la ayuda de la “fuerza bruta” se puede descifrar al poco tiempo -pero de eso nos encargaremos luego, de “complicarlo” para tratar de eludir la lectura-. La imagen la guardaremos en la carpeta de trabajo en el servidor web bajo el nombre “bgcaptcha.gif” (nemotécnico ‘BackGroundCaptcha.gif’=’bgcaptcha.gif’).

Para bajar archivos por líneas de comando

recomiendo usar “wget”, por ejemplo:

“wget    http://www.e.com/imagen_a_bajar.gif      nombre_imagen.gif”

Creación del archivo “captcha.php”.

Dicho archivo se encargará de tomar la imagen anterior y, aleatoriamente, “escribirle” letras encimas, almacenarlas en una variable (que leeremos con luego con el método POST) y mostrarla al navegador; para ello utilizaremos el siguiente código que explicaremos línea por línea:

<?php
  //Archivo 'captcha.php'
  session_start();
  $_SESSION['tmptxt'] = randomText(7);
  $captcha = imagecreatefromgif("bgcaptcha.gif");
  $colText = imagecolorallocate($captcha, 0, 0, 0);
  imagestring($captcha, 5, 16, 7, $_SESSION['tmptxt'], $colText);
  header("Content-type: image/gif");
  imagegif($captcha);
  imagedestroy($captcha);
?>
  • Para que el servidor sepa dónde comienza y dónde termina el lenguaje PHP debemos encerrarlo todo con los siguientes comandos: “<?php (…) ?>” y donde van los paréntesis y puntos suspensivos ubicaremos nuestro código a ejecutar. Todo lo que esté fuera de estos demarcadores será considerado lenguaje HTML e interpretado como tal.
  • Cada final de sentencia le será indicado al servidor con un punto y coma “;”.
  • Los comentarios, que son importantísimos para nosotros los seres humanos, para las máquinas carecen de importancia y se identifican con “//” y la derecha el texto explicativo.
  • La función session_start()permite crear o recuperar un identificador único que servirá para que el servidor pueda atender varios clientes al mismo tiempo sin confundir las respuestas de cada usuario. No debemos preocuparnos mucho ya que todo es automatizado, si acaso dedicaremos una sentencia “if-then-else” por si acaso devuelve el valor “falso”, es decir, no se pudo iniciar sesión (todo el mundo da por sentado que devuelve “verdadero”). Importante, muy importante, el comprender sobre el cómo PHP compara dos variables y/o valores para devolver “verdadero” o “falso”, merece su estudio de 10 minutos.
  • La función “$_SESSION[]” permite asignar un valor a una variable en la sesión iniciada en el punto anterior y es un variable de arreglo global. El texto, que será aleatorio, lo proporcionará la función “randomText()” que escribiremos luego.
  • La función “imagecreatefromgif()” nos permitirá “cargar en memoria” la imagen que destinamos como fondo del CAPTCHA y devolverá un “identificador de imagen” representado en una variable que usaremos para agregar el texto que identificará e introducirá el usuario, ser humano. De nuevo digo que deberíamos destinar un “if-then-else” dado el caso la función devuelva “falso”.
  • El comando anterior nos permitió establecer el “lienzo” donde vamos a escribir las letras aleatorias; pues el comando “imagecolorallocate()” nos permite fijar el color con que las “pintaremos”: “0, 0, 0” corresponde al color negro en la codificación de valores “RGB”, “Red Green Blue” y cuyos valores van del 0 al 255 cada uno y nos permite usar +16 millones de colores. Luego echaremos mano de esta función para confundir aún más a los “robots”, por ahora nos conformaremos con el color negro. Es de hacer notar que para esta función CERO es “falso” y cualquier otro valor es “verdadero”, si usted considera esto una tontería le invito a leer la disertación sobre el tema, está avisado o avisada.
  • La funcíon “imagestring()” dibuja una cadena de texto en nuestro “lienzo”, la imagen gif seleccionada. Los parámetros de esta función son: (image, font, x, y, text, color)  y los detallo a continuación:
    1. image: la que cargamos en memoria con la función imagecreatefromgif() y que llamamos $captcha.
    2. font: numeradas del 1 al 5 y es la fuente nativa predeterminada en la librería GD e incluso nos permite cargar nuestras propias fuentes pero debemos cargarlas y compilarlas de acuerdo a la arquitectura de nuestro servidor. Si se entusiasman a realizar esto último deberán cargar dicha fuente “compilada” con la función imageloadfont() de acuerdo a unos valores binarios. Más interesante hallo utilizar la función imagettftext() NO SIN ANTES VERIFICAR el phpinfo() devuelva que el ambiente del servidor lo soporte (si quieren saber más sobre fuentes True Type en GD visiten este enlace): captcha_004
    3. Coordenadas X e Y: tomadas a partir de la esquina superior izquierda, pónganse de cabeza para que las entiendan (ahhh me recuerdo de la materia Geometría Analítica, ¡qué belleza para Autocad! ¡Y dibujábamos por comandos escritos en papel fuera del laboratorio de computación!).
    4. text: en este caso lo que ya tenemos almacenado en la variable global de sesión “$_SESSION[‘tmptxt’]”.
    5. color: el que establecimos a negro con la función “imagecolorallocate()”.
  • La función “header()” permite que nuestro servidor se ciña a las normas del lenguaje HTML que consiste en “notificarle” al navegador web (en formato NO html) que le será enviado un flujo de datos, por defecto “application/octet-stream”, pero que nosotros utilizaremos para indicarle que es una imagen gif “Content-type: image/gif”. Si desean conocer más acerca del nacimiento de la web y sus normas de funcionamiento de la mano del mismísimo Tim Berners-Lee hagan click en este enlace.
  • Por último la función “imagegif()”  instruye a nuestro servidor que le envie la imagen al navegador del usuario, el CAPTCHA que queremos interprete el ser humano.
  • Una función que considero importante y que yo agrego al código mostrado originalmente -y del que desconozco la autoría- es “imagedestroy()” a fin de liberar la memoria utilizada por la variable “$captcha”. Aunque toda la memoria se libera cuando el usuario cierra su navegador o cuando nosotros mismos invocamos “session_destroy()” nunca está demás liberar “trabajo” apenas sea posible.

Creación de la función “randomText()”.

Ahora explicaré la función que devuelve una cadena de texto de manera aleatoria pero con dos mejoras al código fuente original, el cual es el siguiente:

function randomText($length) {
  $pattern = "23456789abcdefghijkmnpqrstuvwxyz";
  for($i=0;$i<$length;$i++) {
    $key .= $pattern{mt_rand(0,32)};
  }
  return $key;
}
  • Las funciones en PHP se declaran con la palabra clave reservada “function” y los argumentos se pasan entre paréntesis separados por comas.
  • Todo el cuerpo de la función esta demarcado por inicio y fin de corchetes “{ … }”.
  • La función toma como parámetro la variable “$lenght” la cual toma el valor de “7” al hacer el llamado de la siguiente manera: “randomText(7)”. Por ende nuestro CAPTCHA tendrá 7 caracteres, recuerden que estamos limitados al espacio del “bgcaptcha.gif”.
  • En la primera variable “$pattern” establecemos los caracteres que queremos mostrar al usuario, no repetidos, y aquí va la primera mejora que les dije antes: NO incluyo el número uno (“1”), ni la letra ele (“l”) ni tampoco el número cero (“0”) ni la letra o (“O”) porque se trata de ponersela difícil al “robot”, no al ser humano, quien puede confundir dichos signos.
  • Utilizamos un ciclo “for” similar al usado en lenguaje C, es decir, un valor de inicio, una condición que se evalúa en cada ciclo y un incremento en cada ciclo. Así establecemos que al escribir “for ( $i=0; $i<$length; $i++ ) {…}” estamos ordenando ejecutar un ciclo basado en la variable “$i” que comienza desde cero y que mientras sea menor que la longitud de caracteres de nuestro CAPTCHA se incremente en una unidad para cada ciclo, “$i++”.
  • Dentro de los corchetes del ciclo “for” anterior colocamos la variable “$key” que se autoconcatena en cada rizo “.=” con una letra aleatoria del patrón elegido y que llevamos asignado en la variable $pattern.
  • En el lenguaje PHP (e igualmente en Python) cada cadena de caracteres es considerada de manera implícita una matriz de una sola fila, esto nos permite “imprimir” en el navegador del usuario una letra del patrón, por ejemplo “echo $pattern{10}” devolverá “b”.
  • ¿Cómo escogemos una letra cualquiera del patrón? Aquí es donde viene la segunda mejora que les comenté: en vez de usar la función “rand()” utilizamos la función “mt_rand()” la cual, aparte de ser más rápida nos permite utilizar números más grandes (de ser necesario). Dicha mejora la propone un usuario llamado “caos30” en los comentarios de la entrada del blog en la cual se inspira este tema. Esta función tiene dos argumentos que nos permiten acotar el número devuelto: para este caso es (0, 32) que es precisamente el largo del patrón que escogimos (el abecedario inglés 26 caracteres más los diez dígitos numéricos son 36 menos 4 que eliminé para evitar confusiones a los humanos).
  • Es necesario el comando “return” acompañado de la variable que debe devolver la función, en nuestro caso es un tipo “cadena de texto”.

Guardado del archivo “captcha.php”.

Ya suficientemente explicado línea por línea el código unimos ambos algoritmos y con el editor de texto nano (o el que ustedes prefieran) guardamos en la carpeta “captcha” que hicimos en “\var\www” (donde generalmente Apache guarda el sitio web):

<?php
  //Archivo 'captcha.php'
  function randomText($length) {
    $pattern = "23456789abcdefghijkmnpqrstuvwxyz";
    for($i=0;$i<$length;$i++) {
      $key .= $pattern{mt_rand(0,32)};
    }
    return $key;
  }
  session_start();
  $_SESSION['tmptxt'] = randomText(7);
  $captcha = imagecreatefromgif("bgcaptcha.gif");
  $colText = imagecolorallocate($captcha, 0, 0, 0);
  imagestring($captcha, 5, 16, 7, $_SESSION['tmptxt'], $colText);
  header("Content-type: image/gif");
  imagegif($captcha);
  imagedestroy($captcha);
?>

Antes de continuar nos aseguramos que la CAPTCHA se ejecute y muestre correctamente en nuestro navegador conectado a nuestro servidor LAPP de pruebas:

captcha_005

Cada vez que pulsamos CTRL+F5 nos mostrará una CAPTCHA diferente cada vez y asigna a la variable “$_SESSION[‘tmptxt’]” el valor deberá comparar con el valor introducido por el usuario humano. El siguiente paso es hacer la interfaz para la presentación e introducción de los datos.

Formulario web “captchademo.php”.

El uso básico de sesiones bajo PHP está explicado en detalle en este enlace. No obstante buscando la simplicidad para la comprensión de todos ustedes, amables y pacientes lectores, haremos un archivo php para mostrar la CAPTCHA e introducir la respuesta del usuario y otro archivo php donde compararemos la respuesta; a este archivo lo llamaremos “captchaanswer.php” y esta explicado más adelante.

Sin más pretensiones de seguridad ni estética escribiremos el siguiente código:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>CAPTCHA con PHP</title>
<meta name="description" content="CAPTCHA con PHP: ejemplo para demostrar la creacion de Captcha con PHP." />
</head>
<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
 <tr>
   <td align="center">
     <strong>CAPTCHA con PHP </strong><br>
     Ingresar el texto mostrado en la imagen: <br>
     <form action="captchaanswer.php" method="post">
       <img src="captcha.php" width="100" height="30" vspace="3"><br>
       <input name="tmptxt" type="text" size="30"><br>
       <input name="btget" type="submit" class="boton" value="Enviar">
       <input name="action" type="hidden" value="checkdata">
     </form>
   </td>
 </tr>
</table>
</body>
</html>

Al navegar nuestro servidor de prueba podrán ver algo parecido a esto:

captcha_006Todo el código anterior es puro lenguaje HTML y mencionaré brevemente línea por línea y su cierre correspondiente (nota: los términos que usaré para describir lo que sucede probablemente hiera la sensibilidad académica de algún lector, no obstante recuerdenme y escríbanme si estoy equivocado) :

  • Etiquetas “<html>…</html>”: le indica a nuestro servidor dónde comienza y dónde termina el lenguaje HTML, veremos en una entrada futura que esto es esencialmente útil en nuestros “scripts php”.
  • Etiquetas “<head>…</head>”: contiene información prioritaria que nuestro servidor tendrá que darle tratamiento especial, leer próximo punto.
  • Etiquetas “<meta (…) />”: estas etiquetas contienen datos que describen datos y están categorizados. La categoría “Content-Type” la describimos anteriormente pero en esta ocasión la usaremos para decirle al navegador del cliente que la vamos a enviar lenguaje HTML y que lo interprete como tal. Envuelve mayor complejidad una solicitud HTTP pues incluye códigos numéricos de respuesta y aceptación pero con saber que esta información es una de las primeras que se envían es más que suficiente.
  • También en los metadatos podemos incluir la codificación de caracteres utilizados en la página web (algún día cuando usemos todo en 128 bits esto caerá en desuso) por medio del comando “UTF-8”.
  • Hay ciertas palabras claves reservadas en los metadatos y es lenguaje de alto nivel, el que usamos usted y yo, seres humanos. Uno de ellos es la palabra name=”description” que nos permite especificar a manera general el propósito principal de la página.
  • En este punto es útil preguntarnos ¿para qué es todo esto del encabezado? Para ello debemos recordar que hace 20 años el ancho de banda en internet era “oro en polvo” y el protocolo se diseñó para no cargar la página completa de un solo golpe sino que echaramos “un ojo” antes de descargar completo. Hoy en día se ha vuelto obsoleto (yo escucho una radio por internet, mientras corro una máquina virtual que actualiza su software desde varios repositorios y otra máquina virtual “baja” parches de seguridad mientras escribo estas líneas ‘en línea’ y además de tanto en tanto superviso servidores de datos remotos; el tráfico de datos es asombroso) pero aún sigue siendo útil para las “arañas” o buscadores como https://duckduckgo.com/  a fin de categorizar las páginas web visitadas y de las cuales hasta guardan una copia espejo, datos, datos y más datos; discos duros a reventar (alguien dijo alguna vez “lo que se sube a internet allí se queda”, yo lo creo fehacientemente 😯 ).
  • Con las etiquetas “<title>…</title>”, valga la redundancia, titulamos nuestra página (el “caption” de la ventana) y algunos navegadores agregan su propio nombre como pueden ver el ejemplo mostrado.
  • Dentro de las etiquetas “<body>…</body>” insertaremos la página web en sí, sólo que en este caso es un formulario para mostrar e introducir los datos.
  • Con “<table><tr><td>…</td></tr></table>” dibujaremos una tabla de un solo cuadro ayudados por el concepto de anidación de etiquetas ¿recuerdan el método de la “doble C” para dividir fracciones? Pues bueno es algo parecido a eso.
  • Con “<strong>…</strong>” podremos poner en negritas lo escrito entre las etiquetas.
  • Con “<br>” le decimos al navegador que termina una línea y comience una nueva.
  • He aquí lo más importante: “<form>…</form>”. Allí declaramos y establecemos los elementos del formulario en sí.
  • Con form <form action=”captchaanswer.php” method=”POST”> indicamos que las variables siguientes sean pasadas a otro “script php” con el método “POST” para que el usuario no visualize las variables(a diferencia del método “GET”).
  • He aquí la “magia”: al pasar la orden de visualizar la imagen CAPTCHA realmente le indicamos es que ejecute el “script”: <img src=”captcha.php” width=”100″ height=”30″ vspace=”3″> y que lo muestre como tal (con ayuda de “header()”).
  • Los demás elementos son para dibujar el cuadro de texto y el botón enviar, creo no merecen mayor explicación.
  • Las normas estéticas las agregaremos en una próxima entrada pero de manera normalizada, como el tema es largo y quiero escribirlo desde hace tiempo le dedicaré una entrada aparte.

Actualizado el lunes 22 de febrero de 2016.

Para prevenir que los servidores proxy instalados en redes de área local NO guarden en caché la imagen de nuestro CAPTCHA podemos hacer uso de generar diferentes nombres al “archivo” de imagen misma con, por ejemplo, la función uniquid de la siguiente manera:

<?php
  echo "<img src='";
  echo uniqid("captcha", true);
  echo ".php' width='100' height='30' vspace='3'><br>";
?>

Formulario web “captchaanswer.php”

Como ustedes pueden ver loq ue yo llamo “formularios web” o “páginas web” en este servidor LAPP son en realidad unos “scripts” en lenguaje PHP. El que nos ocupa ahora es el que se invoca cuando el usuario pulsa el botón “Enviar”:

<?php
    session_start();
    if ($_POST['action'] == "checkdata") {
        if ($_SESSION['tmptxt'] == $_POST['tmptxt']) {
            echo "Bienvenido.";
        } else {
            echo "Intentalo nuevamente.";
        }
        exit;
    }
?>

De nuevo lo analizamos línea por línea obviando, por supuesto, las funciones y comandos que de nuevo encontremos y hayamos explicado antes:

  • Es necesario llamar a la función “session_start()”, recordemos dicha función también nos permite recuperar los datos de la sesión almacenados en la variable global.
  • La próxima acción es verificar que la variable ‘action’ esté establecida a ‘checkdata’  de no ser así pues simplemente finaliza y sale sin aviso alguno.
  • El punto decisivo es la comparación de la cadena aleatoria creada por el script “captcha.php” y compararla con la enviada por el usuario. De ser iguales emite el mensaje “BIENVENIDO” y aquí es donde podemos ubicar el código que nos interesa: la publicación de un comentario a una entrada de blog, la confirmación a una lista de correos, etc.

Conclusiones.

Esto es sólo un abreboca de lo que podemos realizar con PHP en cuanto a gráficos se refiere, estoy consciente que para las normas actuales es un CAPTCHA bastante débil pero lo podemos mejorar hasta llevarlo a un nivel básico. Para mi caso particular lo voy a implementar de una vez en un “servidor de producción” y que trabaje de una vez.

<Eso es todo, por ahora>.

Download PDF