PDF logo

Trabajando con documentos PDF

El formato PDF es hoy en día ubicuo, sin embargo no nos detenemos a pensar mucho sobre cómo funcionan y qué podemos hacer con ellos. Anteriormente publicamos un problemilla que tuvimos para extraer los datos allí contenidos y los cuales ofuscaron de una manera muy intelegente, admirable en verdad, muy bien pensado. Pero eso no nos detiene y allí propusimos una solución que luego lo vamos a complementar con otro de nuestros artículos (todos nuestros tutoriales están interconectados o relacionados para configurar un todo). Empezemos, pues, ¡VAMOS!

Introducción.

Esta entrada no va a ir sobre la historia y normas de los documentos PDF (“Portable Document Format” por sus siglas en idioma inglés) ya que sobre eso hay bastante material en la red y, además, que nosotros somos terriblementes pragmáticos. Ojo, no estamos diciendo que estudiar la teoría es mala, sino que en este caso la teoría es compleja, e incluso hay quienes piensan que las especificaciones establecidas son “maléficas” ya que permiten muchos fallos en la seguridad de nuestros ordenadores, pero ¿por qué a devenido esta situación? Veamos.

Brevísima historia del PDF.

Para todos los efectos, en vez de escribir a cada rato “Formato de Documento Portátil” os mostraremos el acrónimo de tres letras PDF por el cual es ampliamente conocido a nivel mundial por ser la norma de facto digital.

Aunque vosotros no lo creaís, el PDF comenzó siendo un formato privativo por allá en 1991 (cuando nosotros en esa época montábamos redes de área local con Netware Novell con IPX/SPX y cable de red coaxial RG58 de 10 mbps -y estudiábamos ingeniería en la Universidad de Carabobo y aún Linus Torvalds estab por comenzar a estudiar en la universidad-) por parte del Doctor John Warnock. Originalmente el proyecto se llamaba “Camelot” y para 1992 obtuvo su madurez técnica.

La idea era “sencilla”: poder abrir un fichero bajo diferentes sistemas operativos (y, por ende, en distintos hardwares) de la misma forma y manera, tanto por pantalla como por impresora. Debido a las limitaciones de los ordenadores y el costo de los mismos (y vaya que nosotros lo podemos atestiguar, lo sufrimos en carne propia) la ardua tarea era lo que hoy damos por sentado -recordad que el internet no estaba masificado aún-: que un documento se viera igual a como lo habían diseñado, “artísticamente”, los autores respectivos. En aquel tiempo la idea era evolucionaria, apenas comenzábamos a usar sistemas operativos con entorno gráfico y dispositivos apuntadores -léase ratones-.

Para ello el Dr. John Warnock y su socio Charles Geschke basaron las especificaciones en un archivo autocontenido que contuviera las fuentes (tipos de letras) e imágenes -tan simple como eso- y en base a esas especificaciones programar diferentes ejecutables que pudieran abrir y mostrar dichos documentos en diferentes ambientes. Pero ellos no estaban solos en su trabajo, ambos (Warnock y Geschke) trabajaban en “Xerox’s Palo Alto Research Center (Xerox PARC)” y estaban tratando de convencer a dicha empresa acerca de un nuevo lenguaje gráfico que ellos denominaban Interpress pero no le prestaron atención tras lo cual decidieron renunciar y fundar la empresa Adobe (¿la conoceís acaso?) y rebautizaron dicho lenguaje como PostScript. Como véis, era software privativo e hicieron dinero a raudales por aquello de que “en tierra de ciegos, el tuerto es el rey”.

Fallas en la seguridad del PDF.

Como podremos imaginar, lo único constante es el cambio, y para PDF ésto no es la excepción. Con el devenir de los años y el aumento de la potencia de los equipos aunado a la masificación de la internet, se hizo necesario -por ejemplo- que en los archivos PDF pudiera insertarse enlaces web para ampliar la información que uno leía. Pero las aplicaciones que leen y muestran documentos PDF no fueron hechas para navegar por internet, eso ya es un mundo completamente aparte y diferente, sumamente difícil de incrustar (ya veremos después que al final sucedió lo contrario: los modernos navegadores web pueden mostrar documentos PDF sin ningún tipo de problema debido a las bien conocidas especificaciones de formato de archivo).

La solución para la época fue que las aplicaciones lectoras de documentos PDF (lo abreviaremos de ahora en adelante como visor PDF) se les dió la “facultad” de lanzar aplicaciones no solo para los enlaces web contenidos en el documento sino también para todo el “multimedia” -audio y vídeo- e incluso la ejecución de ciertos lenguaje scomo JavaScript . Acá un ejemplo, en vídeo, de la situación en el año 2010:

El señor Neil J. Rubenking en el año 2010 se hizo la pregunta ¿acaso PDF significa Pretty Dangerous Format (Bonito y Peligroso Formato)? y a la conclusión que él llega es que en ese año, ahora en 2017 y allá por 1990 la solución a los problemas de seguridad en los archivos PDF es volver a sus raíces: mostrar correctamente un documento tal como fue concebido y eliminarle todos los agregados “multimedia” que pueden hacer daño a nuestros ordenadores.

PDF como “formato abierto”.

Irónicamente el artículo que data del año 2010, y al cual hacemos referencia en la sección anterior, no nombra para nada el hecho que en el año 2005 la Asociación Internacional para la Normalización (“International Organization for  Standardization” o ISO por su abreviatura) emitió la norma ISO 19005-1 mejor conocida como PDF/A la cual está basada en la consabida norma PDF dictada por Adobe la cual recoge los sueños y anhelos de los más puristas defensores del documento de formato abierto.

Las características que hacen al PDF/A una joya a ser conservada son las siguientes:

  1. Debe ser independiente del dispositivo donde se visualize.
  2. Debe ser autocontenido, no necesita descargar ningún recurso fuera de los que contiene el archivo en sí.
  3. Debe ser autodocumentado, lo cual garantiza a futuro su interpretación y correcta lectura.

Debido a estas tres características -cada fichero debe contener las instrucciones para abrirlo junto con el texto e imágenes también- resulta en que dichos archivos son ligeramente voluminosos. Pero es un costo que muchos estamos dispuestos “a pagar” e incluso existe una asociación formal que defienden a capa y espada dicho formato y desarrollan aplicaciones que garantizan mantener sus especificaciones.

El PDF/A garantiza su “pureza” al prohibir expresamente las siguientes características:

  • No deben contener ni audio ni vídeo.
  • No deben contener imágenes en formato JPG (deben ser imágenes de formato abierto, el JPG es privativo).
  • El lenguaje JavaScript y el llamado a ejecutar aplicaciones está prohibida.
  • Todas las fuentes o tipos de letras deben estar contenidas y se debe garantizar que no tienen restricción alguna para ser reproducidas y mostradas (entiéndase fuentes de dominio público).
  • La manera de definir y describir los colores debe ser independiente del dispositivo utilizado (entiendase especificaciones abiertas o normalizadas de color).
  • La encriptación está deshabilitada (lo cual es totalmente diferente a comprimir y/o encriptar un fichero PDF/A para enviarlo a otras personas o instituciones).
  • El uso de metadatos (datos que se describen a sí mismos) basados en normas internacionales reconocidas es obligatoria.

Subsiguientes normas PDF/A.

La norma ISO PDF/A en realidad es la norma PDF/A-1 y luego le sucedieron dos normas adicionales:

  • PDF/A-2 emitida en el año 2011 la cual extiende las capacidades del PDF/A-1.
  • PDF-/A-3 emitida en el año 2012 el cual permite la incrustación de diverson formatos de archivos tales como XML, CSV, CAD, hojas de cálculo, etc.

Desde luego, las especificaciones son más complejas, pero en aras de la simplicidad, así lo hemos explicado. Tal vez, y a futuro, publicaremos algo sobre formularios en PDF lo cual consideramos algo verdaderamente útil: recibes un fichero donde puedes llenar ciertos campos (tu nombres, apellidos, etc.) y mandarlo a la impresora. Lo que no consideramos para nada útil es devolver ese mismo fichero por correo electrónico ya que para eso mucho mejor es crear una página web segura (https) para recolectar dicha información en una base de datos.

Ah, y otra cosa, no creaís que Adobe está tranquila y jactándose de ser “padres” del PDF/A-1, incluso tienen tutoriales acerca de cómo eliminar dicha especificación, eliminar todo rastro -más bien restricción- que establece dicha norma en lo archivos que osen usarla.

Extrayendo elementos de un fichero PDF.

Si habéis aguantado hasta acá nuestra resumida descripción del mundo PDF os felicito y ahora pasemos a la práctica. Como ya os dijimos el PDF fue creado para transmitir información y su contenido jamás ni nunca fue diseñado para ser editado ni transformado.

Es por ello que a veces suceden cosas como la acontecida a nuestro colega de “Linux GNU Blog“:

Lo que sucede es lo siguiente: es un fichero PDF que contiene las instrucciones para un electrodoméstico y con cualquier visor PDF abre perfectamente y de maravilla. Pero he aquí lo extraño: pesa 9 megabytes (exactamente 9.212.740 bytes) lo cual es MUY grande para la información que contiene, considerando que los gráficos son en escala de grises y no tienen mayor detalle que el estrictamente necesario para describir al aparato electrónico. Lo más extraño viene luego, si extraemos un rango de sus páginas, el fichero resultante tiene mayor tamaño incluso que el original, lo cual contraviene cualquier tipo de lógica.

De hecho arriba vemos que si lo abrimos con Libre Office Draw tardará muchísimo tiempo en ser abierto, e incluso tal vez no lo hará. Eso es debido a que tiene en capas transparentes que en modo normal no se visualizan pero que a la hora de “editar” el fichero aparece como polígonos aparentemente aleatorios que llenan y “engordan” todo el documento. De hecho Libre Office Draw NO ESTÁ EDITANDO EL ARCHIVO PDF, está simplemente extrayendo su información para que pueda ser editado en formato de dibujo “.odg”, y el hecho que pueda ser exportado de nuevo a formato PDF pues es un extra añadido, ya que si queremos seguir editando dicho documento cada vez que queramos, debemos guardarlo en formato “.odg“.

Nosotros hicimos un análisis exportando el contenido PDF a formato XML y eso ocupó más de 50 megabytes debido a la técnica de ofuscamiento basado en dibujar incontables polígono que, en teoría, evitarían que sea “editado” o más bien transformado a otro documento PDF: ¡tanto misterio para un manual de usuario de un artefacto electrónico! Pues más bien nos causa risa tal comportamiento.

Usando aplicaciones para unir y cortar documentos PDF.

Cada quien tiene un estilo diferente de publicar sus conocimientos, en nuestro caso lo orientamos más bien hacia la programación (Python, PHP, lenguaje C, etc.) pero hay excelentes aplicaciones gráficas que suplen rápidamente nuestras necesidadas e incluso algunas como Ghoscript corren en una ventana terminal. Os recomendamos un excelente artículo escrito en castellano donde podréis ampliar vuestro conocimientos sobre el tema PDF.

Usando Python para trabajar con ficheros PDF.

Ya os hemos explicado sobre el cómo programar -y por supuesto instalar- el lenguaje Python, incluso viene incluído en las mayorías de las distribuciones basadas en GNU/Linux. La utilería elegida para sacar información es PyPDF2 y podemos instalarlo por medio de una línea de comando en una ventana terminal(recordad anteceder el comando sudo):

pip install PyPDF2

Luego que haya descargado pues estamos prestos y listos a lanzar nuestras líneas de código. Acá os colocamos el ejemplo dado el caso vosotros utilicéis Python3, ya que debéis utilizar pip3(se sugiere utilizar el comando sudo con la opción “-H” para referirnos a nuestro propio directorio “home“):

pip3 install PyPDF2
pip3 install PyPDF2

Primero podéis descargar el manual de marras cuyo enlace está en uno de nuestros mensajes tipo “tuit”:

Sobre ese manual es que vamos a practicar los comandos -programa- en Python con PyPDF2 y para todos los efectos prácticos nosotros descargamos y renombramos dicho archivo a “manual.pdf” para escribir menos código y mayor legilbilidad didáctica. Comencemos , pues, a desgranar el fichero en una cónsola terminal con Python en modo interactivo:

>>> # agregamos la referencia a la libreria necesaria
... 
>>> import PyPDF2
>>> # abrimos el archivo en si y lo almacenamos en 'archivoPDF'
... 
>>> archivoPDF = open('manual.pdf', 'rb')
>>> # ese archivo abierto lo leemos con PyPDF2 y lo almacenamos en el objeto 'lectorPDF'
...
>>> lectorPDF = PyPDF2.PdfFileReader(archivoPDF)
>>> # ahora procedemos a obtener la pagina 61, instrucciones en castellano y almacenamos en objeto 'paginaPDF'
>>> paginaPDF = lectorPDF.getPage(61)
>>> # ya tenemos esa pagina en memoria y aplicamos el metodo de extraer solamente el texto
>>> paginaPDF.extractText()
u'2Instrucciones de seguridad\nLea detenidamente estas instrucciones de seguridad \nantes de utilizar el producto.\n ADVERTENCIA\nNo coloque la TV ni el mando a distancia en los siguientes entornos:\nUna ubicaci\xf3n expuesta a luz solar directa\nUn \xe1rea con mucha humedad, com
>>> # LA PAGINA ES LARGA hemos publicado apenas el inicio de ella
... # NOTAD que el texto esta 'formateado' para lenguaje Python para representar caracteres unicode

Cada línea está debidamente comentada y debemos agregar que para visualizar correctamente el texto de la página que está en formato unicode para Python3 se debe utilizar, simplemente, lo siguiente:

print(paginaPDF.extractText())

Para Python (2) debemos hacer una función como la siguiente:

def MuestraUnicode(texto):
 try:
   texto = unicode(texto, 'utf-8')
 except TypeError:
   return texto

print(MuestraUnicode(paginaPDF.extractText()))

print(paginaPDF.extractText())
print(paginaPDF.extractText())

Pero no nos desviemos de nuestro objetivo, desgranar un documento PDF.

Extrayendo un rango de páginas a un documento nuevo PDF.

Acá volvemos a reutilizar los conceptos del ejemplo anterior, de nuevo cada línea está comentada indicando claramente qué hace cada comando:

>>> # Referencia a la libreria necesaria
... 
>>> import PyPDF2
>>> # Abrimos el manual al cual lo denominamos origen de datos
... 
>>> origenPDF = open('manual.pdf', 'rb');
>>> # Leemos el origen abierto en un objeto lector;
... 
>>> origenPDFlector= PyPDF2.PdfFileReader(origenPDF);
>>> # Creamos un objeto escritor de PDF
... 
>>> destinoPDF = PyPDF2.PdfFileWriter()
>>> # Creamos un objeto escritor de PDF y adicionamos la pagina 60 (instruccioens en castellano)
... 
>>> paginaOBJ = origenPDFlector.getPage(60);
>>> destinoPDF.addPage(paginaOBJ)
>>> # Un ciclo para leer de la pagina 61 a la 80
... 
>>> for num_pag in range(61,80):
...   paginaOBJ = origenPDFlector.getPage(num_pag)
...   destinoPDF.addPage(paginaOBJ)
... 
>>> # abrimos un fichero de destino
... 
>>> destinoPDFarchivo = open('manual_en_castellano.pdf' , 'wb');
>>> # escribimos el objeto en el fichero de destino
... 
>>> destinoPDF.write(destinoPDFarchivo);
>>> # cerramos los archivos debidamente
... 
>>> destinoPDFarchivo.close()
>>> origenPDF.close()
>>>

Tendremos así, entonces, un fichero solamente con las instrucciones en castellano que podemos abrir con el visor de dcoumentos predeterminado en Ubuntu, en este caso Evince. En nuestro caso la salida pesa 1.240.731 bytes (para nosotros los viejitos eso es casi un diskette 3½ pulgadas) y, tercos nosotros como somos, lo intentamos abrir de nuevo con LibreOfficeDraw y cuando va más o menos por la tercera hoja “COLAPSA” la aplicación rellenando cada cuadrito “basura” que le colocaron para ofuscar el documento. Luego de 45 segundos es que se presta a mostrar por pantalla una copia del documento, tal como nosotros hicimos en lenguaje Python. Incluso después de abrir por completo la primera página, si nos ubicamos en la novena, por ejemplo, de nuevo LibreOfficeDraw colapsa de nuevo, así que el truco de cargar basura en un PDF vaya que funciona en realidad.

Por ahora vamos a recapitualr el método que aprendimos en esta sección, lo que llamamos pseudocódigo:

  • Inicio del proceso.
  • Colocamos la referencia a la librería necesaria.
  • Abrimos el documento PDF en modo lectura binario.
  • Creamos un objeto de lectura de la librería y leemos el archivo abierto.
  • Creamos un objeto de escritura de la librería.
  • Creamos un objeto de página de la librería que lee del documento origen y lo pasamos al documento destino (1 página a la vez con exactamente todo el contenido de cada página: texto, imágenes, basura…).
  • Una vez que tenemos el objeto de escritura listo con las páginas que nos interesa, abrimos un archivo destino en modo de escritura binario (lo nombramos como querramos).
  • LLamamos al método de escritura del objeto de escritura de la librería.
  • Cerramos el archivo destino.
  • Cerramos el archivo origen.
  • Fin del proceso.

Ofuscando nuestros propios documentos PDF.

Podemos “ofuscar” nuestros propios documentos PDF colocandole, por ejemplo, una licencia de Creative Commons como la que acompaña nuestra página web y dejando bien en claro que la información que compartimos es libre pero respetando, al menos, el nombrar la autoría. Para ello podemos crear un documento PDF de una sola hoja que tenga una marca de agua que simplemente es un texto en gris claro escrito a 45° sobre la diagonal de la hoja.

Para crear nuestro documento con la marca de agua podemos utilizar rapidamente a Gimp y exportamos a PDF colocandole el nombre, muy original eso sí, marca_de_agua.pdf y escribir el siguiente código:

 # Solo las librerias necesarias
 from PyPDF2 import PdfFileWriter, PdfFileReader
 # Creamos un objeto de escritura
 salida = PdfFileWriter()

 # Abrimos el documento original
 origenPDF = PdfFileReader(open('origen.pdf', 'rb'))
 # Abrimos nuestro documento creado con marca de agua
 marca_aguaPDF = PdfFileReader(open('marca_de_agua.pdf', 'rb'))
 # Abrimos la primera hoja del documento marca de agua y lo guardamos en un objeto hoja PDF
 hoja_marca_agua = marca_aguaPDF.getPage(0)

 # Hacemos un ciclo para COMBINAR cada hoja del origen con la hoja con la marca de agua
 for i in xrange(origenPDF.getNumPages()):
   # Leemos la pagina en un objeto y luego lo combinamos con 'merge()'
   pagina = origenPDF.getPage(i)
   pagina.mergePage(hoja_marca_agua)
   # vamos agregando al documento destino
   salida.addPage(pagina)

 # escribimos en nuestro disco duro el resultado
 with open('destino.pdf', 'wb') as f:
   salida.write(f)

¿En qué consiste la ofuscación? Podemos escribir con Python un programa que cree una hoja PDF con imágenes aleatorias para luego combinarla con el documento que queremos ofuscar (agregar por capas) y luego hacer la capa con dichas imágenes como invisible (la capa) que cualquier visor PDF no la msotrará pero que al extraer las hojas siempre nos llevaremos dichas imágenes y las podremos ver (y hasta colapsar) al programa que hayamos usado para extraerle páginas, ¿Qué tal os parece?

Eliminando las imágenes del archivo PDF destino.

De la sección “Extrayendo un rango de  páginas a un documento PDF” retomamos exactamente todo el código allí escrito y le insertamos la siguiente línea justo antes de escribir en el disco duro el resultado (guiense por los comentarios):

# eliminamos las imágenes del archivo destinoPDF
destinoPDF.removeImages() 
# abrimos un fichero de destino
destinoPDFarchivo = open('manual_en_castellano.pdf' , 'wb');

Con el comando “.removeImages()” logramos quedarnos solamente con el texto y el fichero resultante es de 780.895 bytes ¡una reducción de 37%! (pesaba 1.240.731 bytes). Otros dos comandos útiles de la librería PyPDF2 son los comandos para eliminar los enlaces web .removeLinks() y para eliminar el texto .removeText().

El punto interesante es que, de nuevo, abrimos el archivo resultante con LibreOfficeDraw y podemos hacer una copia del documento que puede ser editada pero por supuesto, sin las imágenes que son las que ocasionan que se “cuelgue” la aplicación.

Fuentes consultadas.

En idioma castellano:

En idioma francés:

En idioma inglés:

Shutter logo

Shutter tutorial en Fedora 25

Ya brevemente hemos descrito cómo instalar Shutter en Ubuntu cuando publicamos nuestro tutorial sobre Tesseract OCR y en esta oportunidad le vamos a dar todo el protagonismo que Shutter merece con su reportaje dedicado y, para variar, lo instalaremos bajo la distribución Fedora 25, ¡acompáñanos!

Shutter logo
Shutter logo

Breve historia de Shutter.

Shutter es software libre, segú declaran ellos y ellas mismas en su página web del proyecto, donde nombran de primero a Ubuntu como un ejemplo de sistema operativo bajo ambiente GNU/Linux.

Instalando Shutter en Fedora 25.

Fedora dispone del comando dnf (Dandified yum) desde la versión 18 y es una bifurcación del proyecto Yum3.4, y cuyo equivalente en las distribuciones basadas en Debian es apt-get. Por demás está decir que son muy parecidas ambas pero en Fedora lo hacen “con estilo”. ¿Por qué afirmamos esto? Para empezar a explicaros, primero os presentamos el comando en sí, muy sencillo (recordad que el comando sudo ejecuta otro comando con derechos de administrador “root”):

sudo dnf install shutter

Al invocar el comando se conecta a los repositorios de Fedora y empieza a “resolver” las dependencias (librerías) necesarias para instalar el software deseado. Es así que enumera 106 paquetes, entre los cuales pudimos ver a ImageMagick (visitad nuestro tutorial) para un total a descargar de 33 megabytes (aproximadamente).

Arriba tenéis el vídeo de instalación y ahora os paso a explicaros de que va el dnf resolviendo dependencias. Para ello utiliza el hawkey quien es el que hace “el trabajo sucio” de encontrar los paquetes .rpm necesarios. Una vez le hayamos dicho que si, que descargue los paquetes, irá numerando uno a uno y va indicando cuánto resta de la tarea, algo que se agradece para algunas personas que experimentamos la ansiedad de las cosas nuevas ;-).

Al finalizar de descargar dnf comproborá debidamente si todo fue “bajado” de manera correcta y vaya que lo verifica como cinco veces, al menos. Es así que si halla todo en orden, comienza la instalación con la consabida “barra de progreso anti-ansiedad”. Allí de nuevo detallamos los paquetes que se instalan y notamos abundantes módulos escritos en lenguaje Perl y de último, el paquete N° 106 el Shutter en sí mismo.

Acá de nuevo se aplica el “estilo Fedora” con otra verificación adicional con una suerte de macros .fc25 a cada paquete instalado (podéis conocer más acerca de la creación de paquetes rpm para Fedora en este enlace). Cuando todo haya finalizado con la palabra “¡Listo!” podremos cerrar la ventana terminal y hacemos click en “Actividades” y en el cuadro de búsqueda tipeamos “shutter” y ejecutamos por primera vez nuestro Shutter. Tendremos que ser pacientes pues a su vez Shutter también hace una verificación a sus complementos y pasado cierto tiempo tendremos nuestro capturador de tomas de pantalla al alcance de nuestra mano.

Utilizando Shutter.

 

 

Fuentes consultadas.

En idioma inglés.

ABC HunSpell

Hunspell tutorial

Repetimos que esta página no va de ciencias sociales, sin embargo somos fanáticos de la ortografía y en esta oportunidad os presentamos una herramienta para corregir nuestros escritos, que ya son bastantes, por demás. Ahora es el punto donde nos diréis “ea, tío,  ¿de qué váis si eso está integrado en ‘todos’ los programas?” Pues bueno preparaos a sorprenderos con los que os vamos a contar, ¡vamos a aprender a programar para corregir nuestra ortografía!

Introducción.

Ya tocamos el tema del idioma inglés anteriormente, su semántica y ortografía, un toque leve pues, nada profundo. Ahora os presentamos una herramienta llamada HunSpell para ayudarnos rápidamente a corregir archivos completos de una manera automatizada con dos grandes ventajas: se puede usar la línea de comandos (scripts bash) y con Python3.

Historia.

HunSpell deriva de MySpell.

MySpell.

MySpell fue desarrollado por Kevin Hendricks quien buscaba integrar varias herramientas de software libre para la suite de oficina Apache OpenOffice.org pero no fue sino con la ayuda de Kevin Atkinson (creador de Aspell -sucesor de Ispell- y Pspell) y un arduo trabajo en C++ que nace MySpell el cual soporta “Affix compression” el cual tiene una capital importancia para nosotros los programadores y ya veremos cómo cuando toquemos el tema con Python (Python3 en específico).

HunSpell.

¿Por qué crean HunSpell si ya existía MySpell? Porque este mundo es grande y ancho y para el idioma húngaro se necesitaba un corrector ortográfico que pudiera manejar UTF-8 y por ende los idiomas del mundo entero. Nosotros por estos lares siempre indicamos -y luchamos- para que esta codificación en bases de datos, lenguajes de programación y lenguajes de marcado sean presentados correctamente tanto por pantalla como por impresoras (aunque estas útlimas se están dejando de usar para ahorrar papel, tinta, dinero y recursos naturales). De allí proviene el “HUN-“del idioma húngaro, “Spell” es deletrear en inglés, de allí la palabra compuesta.

La última versión estable data del 2011 y al igual que su predecesor MySpell, HunSpell está escrito en lenguaje C++. En su repositorio bien reza “la librería de corrección ortográfica más popular” y al momento de escribir estas líneas tenía 7 horas de haber sido actualizado dicho repositorio ¡está más viva que nunca HunSpell!

Programas que utilizan HunSpell.

Y he aquí la sorpresa: HunSpell es el corrector ortográfico de fuente abierta para una gran cantidad de programas que usamos diariamente, por nombrar unos cuantos:

  • Apache OpenOfiice.
  • ¡LibreOffice!
  • Thunderbid.
  • Mozilla Firefox ¡desde el año 2005!
  • Google Chrome.
  • Google Chromium.
  • SeaMonkey.
  • WinShell.
  • Opera.

Lenguajes de programación y HunSpell.

Ya os dijimos que HunSpell está escrito en lenguaje C++ pero al menos hay dos lenguajes en los cuales podemos imprtar estas librerías. Uno es Python, en el cual estamos vivamente interesado gracias a su gran versatilidad y plataformas que lo soportan. El otro es el lenguaje R que ha tomado auge recientemente y que, por ahora, no tocaremos su uso. En nuestra sección de fuentes consultadas en idioma inglés os dejamos unos enlaces con ejemplos que nos parecieron bastantes sencillo por si queréis ahondar en ese tema.

Instalando HunSpell en Ubuntu.

Como en las distribuciones basadas en Debian, podemos utilizar apt para instalar por una ventana de comandos desde nuestros repositorios predeterminados. Para ello con una simple línea -con derechos de administrador root-, escribimos lo siguiente:

sudo apt-get install hunspell
apt get install hunspell
apt get install hunspell

Previo a este comando es recomendable usar apt-get update para sincronizar el catálogo de aplicaciones entre nuestro ordenador y los repositorios que tengamos predefinidos. Una vez hayamos instalado podemos consultar la versión que hayamos instalada:

hunspell -v
hunspell -v
hunspell -v

Como podéis constatar aparecen las atribuciones debidas hacia Ispell, László Németh, MySpell, Kevin Hendricks y openOffice.org: así es el software libre, se debe heredar la licencia y hacer econocimiento expreso a los autores a fin de evitar el patentado y que devenga en software  privativo.

Uso por línea de comandos de HunSpell.

ABC HunSpell
ABC HunSpell

Uso de Hunspell de manera interactiva.

Una vez tengamos instalado HunSpell podemos, sin más, abrir una ventana de comando y comenzar a usarlo. Aunque su uso principal es para revisar archivos o ficheros de texto, también podemos hacerlo interactivamente. Primero debemos conocer dónde estamos parados, conocer cuáles diccionarios tenemos instalados, y por ello usaremos el siguiente comando -el cual devuelve una extensa respuesta-:

hunspell -D

Este parámetro nos devolverá, esencialmente, tres secciones:

  1. Rutas de búsqueda: dependiendo de la cantidad de programas que tengamos instalados, cada uno de ellos -si utilizan MySpell o HunSpell- tienen sus propios diccionarios. Dada la filosofía del software libre, tenemos la opción de usarlos, descargar otros e incluso crear nuestros propios diccionarios -¡avanzado!-.
  2. Diccionarios disponibles: la “segunda” ubicación es la del propio HunSpell, generalmente está ubicada en la carpeta “/usr/share/hunspell” (esta ruta puede variar según vuestra distribución linux utilizada). En estas rutas también puede aparecer la ruta “/usr/share/myspell” así que si tenemos más opciones, pues mejor. Los diccionarios allí listados son simples ficheros cuyo nombre está compuesta por dos letras minúsculas, el guión bajo “_” y dos letras mayúsculas. Las primeras dos letras corresponden al idioma y las segundas dos letras corresponden a la distribución regional. Por ejemplo “en_GB” representa “english Great Britain”, “fr_FR” francés de Francia, “fr_CA” francés de Canadá y así sucesivamente. Para nuestro país -aunque lo identifican mal- nos corresponde “es_VE” osea español de Venezuela (cuando en realidad hablamos es castellano). Importante destacar que si queremos cargar cualquiera de los diccionarios en esta sección listada no es necesaria especificar su ruta ya que HunSpell sabe muy bien donde están ubicados.
  3. Diccionario cargado: dependiendo de la configuración regional que tengamos en nuestro sistema operativo, será cargado un diccionario de manera predeterminada, por lo cual, como dijimos, podemos usar sin más a HunSpell. Para nuestro caso tenemos el fichero “es_VE.dic” y su contraparte -ya veremos su uso- “es_VE.aff“.

Vamos, pues, a comenzar a usar a HunSpell. Ya sabemos cual diccionario tenemos cargado por defecto, pero acostumbremonos a penar internacionalmente, que es de cultura general saber o al menos tener nociones de varios idiomas modernos:

hunspell -d es_VE

Acá notamos que usamos el parámetro “-d” para cargar un diccionario que se encuentra en la ruta de HunSpell, por lo que no es necesario especificar su ubicación, HunSpell sabe ya donde está. A continucación presionamos intro o enter y escribimos la plabra que deseamos revisar y presionamos INTRO. Si la palabra está bien escrita (HunSpell la busca en el diccionario y consigue una conicidencia exacta) nos devolverá ya sea asterisco “*“, signo de suma “+” o un signo de resta ““. Por ahora nos conformamos en saber que la palabra es correcta. De estar mal escrita la palabra (no se consigue en el diccionario) HunSpell nos devuelve una lista de palabras aproximadas donde, generalmente, la primera que aparece es la correcta. Aquí es muy importante el archivo “es_VE.aff”, que utiliza el “affix compression” -fijaos la extensión del fichero-: hay palabras raíces y con prefijos, sufijos o ambos, encontramos su aproximación a la palabra correcta. Es decir, según unas reglas predeterminadas (palabras raíces, palabras derivadas) podemos corregir y lograr la ortografía.

Muchas veces devolverá pocas y a veces varias, veamos la imagen siguiente:

hunspell -d es_VE
hunspell -d es_VE

Notamos que si escribimos mal el nombre de nuestro país, HunSpell nos devuelve en primer lugar la aproximación más cercana y luego una segunda palabra que medio se le parece. Hasta aquí todo bien pero si escribimos la palabra “vurro” (sic) lo primero que nos devolverá es “curro” -palabra no muy común en Venezuela- y en segunda opción la buscada, el animal muy útil en las granjas aún hoy en día. Luego nos muestra palabras menos comunes aún. Es por ello que debemos aprender a crear o modificar nuestros propios diccionarios de acuerdo al uso más común que damos a nuestra habla cotidiana. Es evidente que este diccionario proviene de España ¡NO HAY PROBLEMA CON ESO! Allá se originó nuestro castellano, de la región abundante en castillos, Castilla, que era más fortificada y pudo someter militarmente al resto de la península ibérica e inclusó expulsó a los moros que por 600 años estuvieron allí construyendo ciudades y civilizando a la población con los últimos avances científicos de la época.

Pero seamos sinceros, las diferencias son evidentes entre el castellano de España y el castellano de Venezuela:

  • coche -> carro.
  • móvil -> celular (teléfono).
  • piso -> apartamento (departamento, vivienda).
  • ordenador -> computadora.
  • contadores -> medidores (electricidad).
  • Y paren ustedes de contar…

Uso de Hunspell sobre archivos de texto.

Cuando le indicamos a Hunspell que trabaje sobre un archivo de texto no es completamente automático su comportamiento, en cierto modo es interactivo con nosotros. Pero primero veamos el comando a utilizar:

hunspell -d es_VE archivo_de_texto.txt

Una vez comenzamos la tarea, Hunspell cambia sin preguntar las palabras mal escritas que encuentre en coincidencia en el diccionario especificado. Pero si no consigue una coincidencia clara nos pregunta a nosotros con las siguientes opciones:

  • Tecla “R”: reemplaza la palabra mal escrita completamente.
  • Tecla “Espacio”: Acepta la palabra solamente por esta vez.
  • Tecla “A”: Acepta la palabra para el resto de esta sesión.
  • Tecla “I”: Acepta la palabra, y el ingreso en su diccionario privado.
  • Tecla “U”: Acepta y añade la versión minúscula en el diccionario privado.
  • Tecla “S”: Pedir una raíz y una palabra modelo para almacenarlas en el diccionario personal.
  • Números: cuando son pocas las opciones uno puede pulsar un solo número pero a veces la lista es extensa y hay que pulsar dos, como por ejemplo doble cero.
Hunspell sobre un archivo de texto
Hunspell sobre un archivo de texto

Uso práctico de Hunspell.

Pues si ya ustedes son lectores habituales de este vuestro humilde blog -y sino pues ahora lo sabrán- somos terriblemente pragmáticos con el software, nos gusta, amamos y nos encanta darle uso práctico a las herramientas informáticas. Para este caso estamos usando el Hunspell con los archivos de texto generados con el reconocimiento óptico de caracteres, al cual le dedicamos una entrada correspondiente. A esas imágenes que capturamos con un aumento de 200% (zoom le dicen las personas que hablan inglés) y con ayuda de el maravilloso Shutter capturamos por párrafos y luego los corregimos de manera rápida con Hunspell.

Fuentes consultadas.

En idioma castellano.

En idioma inglés.

CSS Grid Layout specification

La Norma de Diseño de Cuadrícula que próximamente estará disponible en los navegadores web nos permite diseñar una serie de elementos por medio del Diseño de Hojas en Cascada (Cascade Style Sheets o mejor conocido por su acrónimo de tres letras CSS) con una rapidez asombrosa y pocas líneas de código. Por cierto, la imagen de introducción a este artículo fue creada por medio de código, no utilizamos el ratón ni una sola vez.

CSS Grid Layout
CSS Grid Layout

Introducción.

En esta entrada describiremos muy brevemente lo que son HTML y CSS para así poder probar en avance -aún no es está implementado en los navegadores web- las nuevas Normas de Diseños de Cuadrícula. Vamos pues, en esta novedosa área del diseño de páginas web.

HTML.

El Hyper Text Markup Language o simplemente HTML es un lenguaje de marcado, tal como lo explicamos anteriormente por este vuestro humilde portal web. Una muy buena definición, en castellano, de dicho lenguaje de marcado la podeis leer acá en este enlace. Específicamente vamos por la recomendación 5 que se presentó en diciembre de 2012 y que progresivamente se ha ido incorporando a los modernos navegadores web, tanto de código fuente abierto como privativo. Pero es el software libre quien lleva la delantera en esto y es por ello que los programadores de Mozilla Firefox están siempre tratando de alcanzar a las recomendaciones (normas, de facto) planteadas: una labor de hormiga, un paso a la vez.

El dibujito de advertencia que os hemos puesto es, entonces, para advertiros que en vuestro navegador actual NO FUNCIONARÁN PARA NADA LOS EJEMPLOS CON QUE TRABAJAREMOS HOY (a la fecha de hoy 14 marzo 2017 ya fue actualizado Mozilla Firefox). Tal vez ustedes pensarán que es una total y absoluta pérdida de tiempo si dichas normas cambian o, peor aún, nunca se llega a implementar en navegador web alguno (o son retiradas en su uso), pero oigamos a Eduardo Galeano: “para eso son las utopías, para mantenernos en movimiento”. Más adelante os explicaremos como instalar la sempiterna versión Beta de Mozilla Firefox: Nightly.

CSS.

Cuando presentamos el tema lo dijimos: vamos a ir muy rápido en los conceptos básicos para poder presentar la nueva norma de diseño de cuadrícula. Si HTML es un lenguaje de marcado basado en etiquetas podemos decir entnonces que viene a ser como el chasís y motor de nuestro automóvil y he aquí que el CSS viene a ser la carrocería y pintura del mismo. Como ya podéis sospechar, tanto en páginas web y como en automóviles, los humanos estamos es pendientes de las formas y colores la presentación de los elementos, y esto ya cae dentro del ámbito del gusto de cada quien.

Con HTML podremos crear nuestra propia página web.

CSS es un lenguaje que describe el estilo de un documento HTML.

CSS describe cómo los elementos HTML deberían ser mostrados.

Es por ello que siempre hemos considerado que CSS es y será la norma que nos ahorrará gran trabajo pues nos centraremos en imaginar y escribir las etiquetas HTML mínimas necesarias para nuestros programas [entradas, botones, listas, etcétera enlazadas o no con alguna(s) base de datos] y con CSS y JavaScript (eso sí, acompañado de base de datos) podremos ofrecer a nuestros usuarios unas plantillas básicas de presentación que ellos y ellas podrán escoger e incluso personalizar (por ello el uso de base de datos para luego poder recuperar esas preferencias). Pero no no extendamos más en este punto y sigamos adelante con nuestro objetivo principal, acompañadnos, por favor.

Prerrequisitos.

Firefox Mozilla Nightly.

Se tiene estimado que el 7 de marzo de 2017 salga a la luz pública la versión 52 de Mozilla Firefox y por consiguiente el apoyo a al “CSS Grid Layout“. Mientras tanto debemos utilizar la versión de avanzada, que siempre está y estará en versión BETA (una versión para un público reducido y previo a su lanzamiento) la cual es llamada Nightly. Acá os advertimos de nuevo: en este navegador no den nada por sentado, habrán cosas que se mejorarán, otras que se corregirán y algunas que no irán a la versión definitiva siguiente. De más está deciros que cualquier error que veaís lo podréis colaborar en su corrección, COLABORAD, pero no salgáis a criticar por las redes sociales porque no es una versión definitiva. Además, si todos nos diéramos a la tarea de criticar por ganar fama o popularidad ¿Quién demonios se va a dedicar a programar? ¡Alguien tiene que trabajar, colaborad, por favor!

Instalando Nightly en Ubuntu.

Para instalarlo debemos tener permiso de administrador o usuario root, abrimos una ventana terminal e introducimos los siguientes comandos:

 sudo add-apt-repository ppa:ubuntu-mozilla-daily/ppa
 sudo apt-get update
 sudo apt-get install firefox-trunk

Una vez descargados aproximadamente 46 megabytes de datos comprimidos, se procederá a su instalación y ocupará 156 megabytes en disco duro. Una observación importante que acota al final de la instalación es que debemos cerrar todas las ventanas que tengamos abiertas con Mozilla Firefox o de lo contrario tenderemos problemas, eso es un indicativo de que las librerías entre Mozilla Firefox 51 (a la fecha) y Nightly se comparten.

sudo apt-get install firefox-trunk
sudo apt-get install firefox-trunk

Instalando Nightly en Debian.

Aún usamos Debian 7, en honor a la verdad nos hemos quedado rezagados en eso porque siempre nos decantamos más por Ubuntu. La mala noticia es que no hallamos, de buenas a primera, un repositorio para esa versión, sin embargo observamos que para la versión 9 abundan repositorios, intentad fortuna con el siguiente a ver si podéis vosotros solitos.

CSS Grid Layout specification.

¿Qué es la Norma de Diseño de Cuadrícula CSS?

El Diseño de Cuadrícula nos permite separar apropiadamente el orden de los elementos desde la fuente contra su presentación visual. Como diseñador esto significa que eres libre de cambiar la ubicación de los elementos de la página en función del dispositivo que sea presentado sin necesidad de comprometer la sensible estructura de un documento HTML y siempre con un diseño responsivo.

Para el Real Diccionario de la Lengua la palabra responsivo significa “perteneciente o relativo a la respuesta” pero acá en programación de ordenadores lo enfocamos en que la respuesta viene representada por un tamaño de pantalla. Esto es así debido al la proliferación de dispositivos móviles (entiéndase, principalmente, teléfonos celulares o móviles) que tienen diversos tamaños de pantalla, pero no os llaméis a engaño, ya estos aparatitos están, de hecho, sustityendo a los ordenadores personales. Si queréis ver una prueba de lo que hablamos, y si utilizáis Firefox, probad y haced click en el menú desplegable “Herramientas” -> “Desarrollador web” -> “Modo de diseño adaptable” (o por medio del teclado pulsad de manera simultánea CONTROL+INVERSO+M).

Presentado lo anterior esperamos os habréis dado cuenta del futuro que os presentamos en este blog, ¡pinta bien y promete!

Terminología de cuadrícula.

Rápidamente os presentamos los conceptos que debéis conocer y manejar bien antes de comenzar a editar código alguno, debemos saber exactamente los nombres de los elementos.

Líneas de cuadrícula.

Son las líneas que “maquillan” a la cuadrícula, pueden ser horizontales o verticales. Podremos referirnos a ellas con un número o nombre, la mejor analogía serían las líneas de una hoja de cálculo, elemento abstracto que es conocido pro la mayoría de los usuarios de ordenadores. Acá una figurita, por si las dudas.

Lineas de rejillaPistas de cuadrícula.

Una pista de cuadrícula es toda el área entre dos líneas de cuadrícula. Dibujo de nuevo:

Pista de cuadrículaCelda de cuadrícula.

Una celda de caudrícula es la menor área posible a representar y se define como toda el área delimitada entre dos líneas verticales y dos líneas horizontales.

Celda de cuadrículaÁrea de cuadrícula.

Un área de cuadrícula también delimitada por dos líneas horizontales y dos líneas verticales pero contiene dos o más celdas de cuadrícula.

Área de caudrícula

Ahora que tenemos nuestras definiciones básicas podremos comenzar nuestro tutorial en sí.

Archivos base.

Bien podemos escribir un solo documento HTML que incluya CSS o bien podemos escribirlos en archivos aparte, escoged lo que os más os guste para estos fines didácticos. En todo caso presentamos el código básico para cada uno de ellos.

Un solo documento HTML.

<!doctype html system "about:legacy-compat">
<html lang="es-419">
  <head>
    <meta charset="utf-8" />
    <title>CCS Grid Layout.</title>
    <style>
      <!-- el código CSS aquí -->
    </style>
  </head>
<body>
   <div>
     <div>A</div>
     <div>B</div>
     <div>C</div>
     <div>D</div>
     <div>E</div>
     <div>F</div>
   </div>
</body>
</html>

Con un archivo CSS externo.

Para colocar nuestro código en un archivo externo tomaremos el código anterior pero en vez de colocar <style>…</style> simplemente colocaremos una sola línea con el siguiente código:

 <link rel="stylesheet" type="text/css" href="su_hoja_de_estilo.css">

Insertando estilo en cada línea.

Si la opción anterior -un archivo CSS externo- es la mejor opción ya que por medio del lenguaje PHP podemos generar un “link rel” apuntando a diferentes archivos .ccs para cada usuario, la tercera opción nos parece la menos adecuada pues se debe generar en cada línea de código HTML las instrucciones CSS. Para ello haríamos algo como esto:

 <h1 style="color:blue;margin-left:30px;">Encabezado 1 azul con margen izquierdo a 30 píxeles</h1>

Lo único bueno es que esta opción es la que veremos siempre, si la aplicamos, es decir: a medida que el navegador va aplicando los estilos el que prevalece es el último especificado, en este caso la línea en sí en código HTML. Por supuesto, si aplicamos código PHP perfectamente podemos programar para que, por ejemplo, cada vez que coloque un <h1> inserte un estilo para cada usuario pero li impractico de esto es que para cada línea repetiremos instrucciones, aumentando la cantidad de bytes a transferir: algo ineficiente. Si se hace esta declaración de alguna de las dos primera maneras solo tenemos que establecer una sola vez para todo el documento, a menos que en algún punto muy específico querramos presentar un encabezado 1 con un estilo diferente. Como véis, las posibilidades y combinaciones son infinitas.

Sintaxis de los comandos CSS.

Una regla de CSS está compuesta de un selector y un bloque de declaración que se aplica, por supuesto, al selector (o selectores) en el inicio. El bloque de declaración debe comenzar con un corchete de apertura “{” y uno de cierre “}” pudiendo ocupar varias líneas con propósitos de claridad  en nuestro código.

Selector  Declaración 1   Declaración 2     Declaración "n"
.h1     {   color:blue  ; font-size:12px  ;                 }
        propiedad:valor   propiedad:valor  

Si os preocupáis por agregar cantidades innecesarias de caracteres os recomendamos que a vuestro código fuente le apliquéis una “precompilación” antes de subirlas a vuestro servidor en producción, el proceso se basa en eliminar los espacios innecesarios a fin de obtiner un código compacto; no obstante si vosotros optáis por comprimir los datos antes de enviar de vuestro servidor web el tema de los espacios en blanco y retornos de carro no tendrá mayor incidencia porque como se repiten tanto son candidatos ideales para comprimirlos.

Definiendo nuestro primera cuadrícula.

A nuestro código base le vamos a hacer las siguientes modificaciones en el código HTML:

<div class="envoltorio">
  <div class="caja a">A</div>
  <div class="caja b">B</div>
  <div class="caja c">C</div>
  <div class="caja d">D</div>
  <div class="caja e">E</div>
  <div class="caja f">F</div>
</div>

Y en el código CSS le colocaremos los siguientes valores:

body {
  margin: 40px;
}

.envoltorio {
  display: grid;
  grid-template-columns: 100px 100px 100px;
  grid-gap: 10px;
  background-color: #fff;
  color: #444;
}

.caja {
  background-color: black;
  color: green;
  border-radius: 7px;
  padding: 15px;
  font-size: 150%;
}

Fijémonos en la clase envoltorio y sus valores entre corchetes:

  • display: grid“: indica al navegador que deseamos una “dibujar” una rejilla.
  • grid-template-columns“: indicamos el ancho de cada columna (e implícitamente el número de ellas).
  • grid-gap“: acá indicamos el espacio que queremos dejar entre cada una de las pistas de cuadrícula.

Resultado ejemplo N° 1.

El resultado es el siguiente (probadlo en vuestro Mozilla Firefox Nightly):

Definiendo una cuadrícula
Definiendo una cuadrícula

Actualizado el jueves 9 de marzo de 2017.

Ya tenemos instalado el Mozilla Firefox 52:

El código de este ejemplo debería ser mostrado correctamente, si tenéis la versión 52 instalada en vuestro ordenador (esto lo logramos en WordPress colocando estilo CSS directamente dentro de la línea de cada instrucción HTML):

A
B
C
D
E
F

Especificando un orden exacto de los elementos.

Para este ejemplo aprovecharemos que hemos “enumerado” las celdas de nuestra cuadrícula con las letras del abecedario, vamos a establecer nuestro siguiente tinglado: ABC/DEF –> DAF/EBC.

Código HTML.

Para este ejemplo reutilizaremos el código mostrado en el archivo base, no redundaremos, subid y mirad por favor.

Código CSS.

Para este ejemplo reutilizaremos el ejemplo anterior pero agregaremos al final el siguiente código que especifica el orden en que queremos mostrar los elementos.

.a {
        grid-column-start: 2;
        grid-column-end: 3;
        grid-row-start: 1;
        grid-row-end: 2;
    }
    .b {
        grid-column-start: 2;
        grid-column-end: 3;
        grid-row-start: 2;
        grid-row-end: 3;
    }
    .c {
        grid-column-start: 3;
        grid-column-end: 4;
        grid-row-start: 2;
        grid-row-end: 3;
    }
    .d {
        grid-column-start: 1;
        grid-column-end: 2;
        grid-row-start: 1;
        grid-row-end: 2;
    }
    .e {
        grid-column-start: 1;
        grid-column-end: 2;
        grid-row-start: 2;
        grid-row-end: 3;
    }
    .f {
        grid-column-start: 3;
        grid-column-end: 4;
        grid-row-start: 1;
        grid-row-end: 2;
    }

Fijaos bien en la numeración de los siguientes elementos CSS:

  • grid-column-start
  • grid-column-end
  • grid-row-start
  • grid-row-end

Resultado ejemplo N° 2.

Especificando un orden exacto de los elementos.
Especificando un orden exacto de los elementos.

Usando código abreviado para especificar un orden exacto.

En este ejemplo obtendremos el mismo resultado del ejemplo N° 2 pero utilizando un código abreviado: en vez de utilizar un comando de inicio y otro de cierre usaremos un solo comando acompañado de los valores numéricos de inicio y fin separados por una barra invertida, veamos:

  .a {
    grid-column: 2 / 3;
    grid-row: 1 / 2;
  }
  .b {
    grid-column: 2 / 3;
    grid-row: 2 / 3;
  }
  .c {
    grid-column: 3 / 4;
    grid-row: 2 / 3;
  }
  .d {
    grid-column: 1 / 2;
    grid-row: 1 / 2;
  }
  .e {
    grid-column: 1 / 2;
    grid-row: 2 / 3;
  }
  .f {
    grid-column: 3 / 4;
    grid-row: 1 / 2;
  }

Es de hacer notar que en el mismo orden que los escribamos en el código CSS, así mismo será progresivamente dibujado en pantalla por el navegador web. Si cometemos algún error (por ejemplo, asignando o superponiendo celdas) será mostrada el último elemento que haya ocupado la celda(s) en cuestión. También veremos que un elemento podrá ocupar una o más celdas contiguas.

Utilizando un solo comando para especificar orden exacto.

De nuevo obtendremos el mismo resultado del ejemplo N° 1 y 2 pero con un solo comando: grid-area. Para ello le pasaremos los parámetros de la siguiente manera (separados por una barra invertida “/”):

  • Fila de inicio
  • Columna de inicio.
  • Fila de finalización.
  • Columna de finalización.

Código CSS.

Como es un solo comando, por elegancia usaremos una sola línea para cada uno de ellos:

    .a { grid-area: 1 / 2 / 2 / 3; }
    .b { grid-area: 2 / 2 / 3 / 3; }
    .c { grid-area: 2 / 3 / 3 / 4; }
    .d { grid-area: 1 / 1 / 2 / 2; }
    .e { grid-area: 2 / 1 / 3 / 2; }
    .f { grid-area: 1 / 3 / 2 / 4; }

Colocando elementos que ocupen más de una celda.

Para este ejemplo N° 4 agregaremos dos elementos más: G y H para hacer notar que sucede si un elemento ocupa más de una celda. Haremos que el elemento A ocupe dos celdas horizontales contiguas (celda 1-1 y 1-2) y el elemento B dos celdas verticales contiguas (celda 1-3 y 2-3).

Código HTML.

<div class="envoltorio">
  <div class="caja a">A</div>
  <div class="caja b">B</div>
  <div class="caja c">C</div>
  <div class="caja d">D</div>
  <div class="caja e">E</div>
  <div class="caja f">F</div>
  <div class="caja g">G</div>
  <div class="caja h">H</div>
</div>

Código CSS.

Solo especificaremos una ubicación específica a los elementos a, b, c y d pero notad como son desplazados los elementos restantes e hasta la h:

    .a { grid-column: 1 / 3; grid-row: 1    ;}
    .b { grid-column: 3    ; grid-row: 1 / 3;}
    .c { grid-column: 1    ; grid-row: 2    ;}
    .d { grid-column: 2    ; grid-row: 2    ;}

Hemos formateado el código de tal manera que notéis rápidamente la diferencia: hemos omitido el valor final.

    .a { grid-column: 1 / 3; grid-row: 1 / 2;}
    .b { grid-column: 3 / 4; grid-row: 1 / 3;}

Resultado ejemplo N° 4:

Colocando elementos que ocupen más de una celda
Colocando elementos que ocupen más de una celda

Percatad que es indiferente si al código CSS le eliminamos los elementos c y d: automáticamente el navegador web los coloca en la celda inmediatamente disponible ¡y el resto de los elementos también!

Colocando elementos que ocupen más de una celda con la palabra clave “span”.

El verbo “to span” en inglés significa “extender” en castellano, pues bien, podemos especificar el inicio (columna o fila) pero especificaremos cuantas celdas queremos extender. Esto facilita , mentalmente, las ubicaciones: solo especificamos el inicio y cuantas celdas se extiende.

También haremos un cambio en como se define la cuadrícula con un comando nuevo:

  • grid-template-rows: especifica el ancho de cada fila (anotaremos tantos valores como filas queremos tener).
  • Si los elementos exceden en cantidad a los valores anteriores, el navegador utilizará los valores por defecto que a bien tenga establecer.

Código CSS.

.envoltorio {
 display: grid;
 grid-gap: 10px;
 grid-template-columns: 100px 100px 100px;
 background-color: #fff;
 color: #444;
 }
.caja {
 background-color: black;
 color: green;
 border-radius: 5px;
 padding: 20px;
 font-size: 150%;
 }

 .a { grid-column: 1 / span 2; }
 .b { grid-column: 3 ; grid-row: 1 / span 2;}
 .e { grid-column: 1 / span 3; grid-row: 3 ;}

Resultado ejemplo N° 5.

Colocando elementos que ocupen más de una celda con la palabra clave "span"
Colocando elementos que ocupen más de una celda con la palabra clave “span”

Rejillas y líneas con nombres.

Código en HTML.

Simplificaremos este ejemplo con solamente cuatro elementos y os explicaremos en la sección CSS qué es lo que queremos realizar.

<div class="envoltorio">
  <div class="caja a">A</div>
  <div class="caja b">B</div>
  <div class="caja c">C</div>
  <div class="caja d">D</div>
</div>

Código en CSS.

Vamos a abstraernos aún más en este punto, ¿recordáis la introducción y que numeramos las líneas de las filas y las columnas? Pues podemos asignarles un nombre a cada una de ellas, pero necesitamos un comando o comandos para declarar dichas variables. De nuevo os presentamos dos instrucciones anteriores:

  • grid-template-columns
  • grid-template-rows

Ambas nos permiten almacenar valores en variables pero con una sintaxis especial: los paréntesis rectos o corchetes “[]” que permiten asignar el nombre y luego, como hemos visto, podemos especificar el ancho en diferentes unidades (píxeles, porcentajes, ect.); mirad el código, observad bien como os hemos estructurado e indentado las líneas:

body {
 margin: 40px;
}

.envoltorio {
  display: grid;
  grid-gap: 10px;
  grid-template-columns:
    [col1-ini] 100px
    [col2-ini] 100px
    [col3-ini] 100px
    [col3-fin];
  grid-template-rows:
    [fil1-ini] auto 
    [fil2-ini] auto 
    [fil2-fin];
  background-color: #fff;
  color: #444;
 }

.caja {
  background-color: #444;
  color: #fff;
  border-radius: 5px;
  padding: 20px;
  font-size: 150%;
}

.a {
  grid-column: col1-ini / col3-ini;
  grid-row: fil1-ini ;
}
.b {
  grid-column: col3-ini ;
  grid-row: fil1-ini / fil2-fin;
}
.c {
  grid-column: col1-ini;
  grid-row: fil2-ini ;
}
.d {
  grid-column: col2-ini ;
  grid-row: fil2-ini ;
}

Visualización del código, ejemplo N° 6.

A estas alturas imaginamos que ya tenéis la nueva versión de Mozilla Firefox, así que os presentamos no por imagen sino por código con estilo en cada línea el resultado de este ejemplo:

A
B
C
D

Rejillas y lineas con nombres extendiendo con palabra clave “span”.

Retomamos el ejemplo anterior (el código HTML es el mismo) pero simplificaremos las filas, veamos.

Código en CSS.

body {
  margin: 40px;
}

.envoltorio {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: [col1] 100px [col2] 100px [col3] 100px [col4] 100px ;
  background-color: #fff;
  color: #444;
}

.caja {
  background-color: #444;
  color: #fff;
  border-radius: 5px;
  padding: 20px;
  font-size: 150%;
}

.a { grid-column: col1 / span 2;}
.b { grid-column: col3 / span 2;}
.c { grid-column: col1         ;}
.d { grid-column: col2 / span 3;}
.e { grid-column: col1 / span 4;}

Observemos los nombres que asignamos a cada columna y el cómo podemos referirnos a cada una de ellas. Este ejemplo colocamos nombres que a decir verdad no ahorran trabajo alguno ni ofrecen claridad: col1 es más largo que usar un simple número 1, pero acá el concepto es nombrar las columnas para nosotros , mentalmente, ubicarnos mejor. Es por ello que proponemos cambiar los nombres de la siguiente manera (eliminamos atributos para simplificar y realzar nuestro punto):

.envoltorio {
 grid-template-columns: [izq] 100px [centro] 100px [centro] 100px [der] 100px ;
}

.a { grid-column: izq      / span 2;}
.b { grid-column: centro 3 / span 2;}
.c { grid-column: izq              ;}
.d { grid-column: centro 2 / span 3;}
.e { grid-column: izq      / span 4;}

Ya diferenciamos que la primera columna es izq, las dos del centro las nombramos iguales y la derecha pues der. He aquí que con izq y der no tenemos ninguna duda de su uso pero las dos del centro debemos numerarlas debido a que le colocamos el mismo nombre a ambas (celdas b y d). En el próximo ejemplo N° 8 ahondaremos más en estos detalles.

Visualizando el resultado del ejemplo, ejemplo N° 7.

A
B
C
D
E

Ejemplo N° 8: comando “repeat”.

Ya aprendimos que podemos nombrar las lineas de cuadrícula y de paso les podemos asignar el mismo nombre porque le agregamos un espacio y luego el número de línea de cuadrícula para referirnos a ellas y evitar confusión. El comando que permite hacer esto es el comando grid-template-columns, ahora bien, hemos trabajado con pocos elementos de filas y columnas pero imaginemos que son 10, 15 o más filas y/o columnas… ¿cómo podemos definir la malla?

El “chiste” de la programación es ahorrarnos trabajo y nuestra rejilla debe estar definida, así que debemos escribir todas y cada una de las filas/columnas al navegador. A fin de ahorrarnos trabajo “inventaron” el comando repeat() para colocar entre paréntesis los valores que queremos repetir, y así escribimos menos.


Finalizando el tema.

Así nos despedimos por el día de hoy, no sin antes presentaros el código que utilizamos para presentar este humidle tutorial que espero os haya gustado y os sea útil a futuro, ¡gracias por vuestra atención!

Código en HTML.

<div class="envoltorio">
 <div class="caja a">A</div>
 <div class="caja b">B</div>
 <div class="caja c">CSS</div>
 <div class="caja d">D</div>
 <div class="caja e">E</div>
 <div class="caja f">F</div>
 <div class="caja g">G</div>
 <div class="caja h">HTML</div>
</div>

Código en CSS.

body {
 margin: 40px;
}

.envoltorio {
  display: grid;
  grid-template-columns: 100px 100px 100px;
  grid-gap: 10px;
  background-color: #fff;
  color: #444;
}

.caja {
  background-color: #444;
  color: #fff;
  border-radius: 10px;
  padding: 20px;
  font-size: 150%;
}
.d { border-radius: 47px; }
.c { background-color: blue;}
.f { border-radius: 20px;}
.h {
 grid-column: 2/3;
 background-color: orange;
}

CSS Grid Layout

Actualizado el 14 de marzo de 2017: HTML con estilo CSS en cada línea.

Es más complejo escribirlo así pero es la manera más fácil para que WordPress muestre las mallas en Mozila Firefox 52 o superior:

<div style="display: grid; grid-template-columns: 100px 100px 100px; grid-gap: 10px; background-color: #fff; color: #444;">
 <div style="background-color: #444; color: #fff; border-radius: 10px; padding: 20px; font-size: 150%;">A</div>
 <div style="background-color: #444; color: #fff; border-radius: 10px; padding: 20px; font-size: 150%;">B</div>
 <div style="background-color: #444; color: #fff; border-radius: 10px; padding: 20px; font-size: 150%;background-color: blue;">CSS</div>
 <div style="background-color: #444; color: #fff; border-radius: 10px; padding: 20px; font-size: 150%;border-radius: 47px;">D</div>
 <div style="background-color: #444; color: #fff; border-radius: 10px; padding: 20px; font-size: 150%;">E</div>
 <div style="background-color: #444; color: #fff; border-radius: 10px; padding: 20px; font-size: 150%;border-radius: 20px;">F</div>
 <div style="background-color: #444; color: #fff; border-radius: 10px; padding: 20px; font-size: 150%;">G</div>
 <div style="background-color: #444; color: #fff; border-radius: 10px; padding: 20px; font-size: 130%;grid-column: 2/3; background-color: orange;">HTML</div>
</div>

Visualización si tenéis instalado Mozilla Firefox 52 o superior.

A
B
CSS
D
E
F
G
HTML

Fuentes consultadas.

En idioma castellano.

En idioma inglés.

Youtube’s tutorials:

CSSconf EU 2014 | Rachel Andrew: CSS Grid Layout

En idioma francés:

Agradecimiento público por difundir el conocimiento:

 

 

Women and man speaking english.

Inglés conversacional

Aunque este vuestro sitio web no va de ciencias sociales es innegable la influencia -a nuestro pesar- del idioma inglés actualmente. Si antes era el latín la lengua franca del imperio romano, ahora el inglés hace las veces para formar nuevas palabras en castellano -hardware, software – que incluso ya se registran en el diccionario de la Real Academia Española. Es por ello que, para no ser mezquinos, agregamos la siguiente entrada.

Introducción.

Women and man speaking english.
Women and man speaking english.

El idioma inglés es muy simple comparado con el castellano, portugués e italiano -ni hablemos del francés- ya que, por ejemplo, la conjugación de verbos ni se le compara. El caso que nos ocupa hoy es precisamente la parquedad del idioma inglés en el ámbito conversacional. Así como no le gustan los nombres largos -fue duro para ellos tragar completo el de Schwarzenegger– tampoco son de usar muchas palabras en el habla diaria.

La parte que dificulta al idioma inglés para nosotros los castellanohablantes es que cada palabra en ese idioma tiene una pronunciación como palabra completa no por sílabas (que para ellos no existen) ni por letras. De hecho es tema recurrente en los programas de televisión y películas para la gran pantalla, sin embargo ellos han tomado prestado la singular forma del latín para formar palabras nuevas y las han llevado a su idioma (de nuevo siendo motivos de chistes en las comedias de situación “sitcom” por televisión “TV”). En su habla cotidiana los paleontólogos y biólogos que usan la clasificación de plantas y animales son las personas “más avanzadas” en cuanto a léxico se refiere.

Al punto que queremos llegar y recalcar es que, incluso, dicha característica de ese lenguaje se extiende más allá de las palabras y alcanza a varias de ellas -incluso llegando a formar una oración completa- y pronto lo veremos.

Nos pareció nuy útil entonces la siguiente lista de “155 Frases necesarias para una conversación en inglés” (ellos la presentan como una curiosidad) y como ya es costumbre la conseguimos viendo nuestra línea de tiempo en Twitter -si la cosa sigue como va, el Twitter será a futuro una seria competencia contra Google como buscador de información-.

Actualizado el 15 de marzo de 2015.

Hemos hecho un poco de estudio adicional y consideramos -si estamos equivocados, corríjanmos por nuestra cuenta Twitter @ks7000- que este conjunto de palabras son denominadas “frases nominales y un concepto del mismo es el siguiente:

A word or group of words that functions in a sentence as subject, object, or prepositional object.

En castellano:

Una palabra o grupo de palabras que funciona en una oración como sujeto, objeto o objeto preposicional.

Listado de frases en idioma inglés conversacional y su traducción al castellano.

Una lista de frases utilizadas en el idioma inglés durante una conversación informal -coloquial- que hay que verlas como un todo y por ello presenta un inconveniente a la hora de traducirlas al castellano.

LetraEnglishCastellanoFrançais
Aa while backhace un tiempoIl y a quelque temps
a while agohace un tiempoil y a un moment
after a whiledespués de un ratoaprès un moment
ahead of timecon anticipación, previamenteen avance
all alongtodo el tiempotout le long
all day longtodo el díatoute la journée
all in alldespués de todo, al final de cuentasen tout
all the sameda lo mismo, da igualtous les mêmes
all the whiletodo el tiempotout en
any daycualquier día de estosn'importe quel jour
as a rulepor lo generalcomme règle
as ifcomo sicomme si
as thoughcomo sicomme si
as thoughtcomo pensécomme pensée
as muchcomo muchoautant
as usualcomo siemprecomme d'habitude
as well asademás de, tanto comoaussi bien que
as yettodavía nopas encore
ask me anotherno tengo idea
esa no me la se, preguntame otra
demande-moi un autre
at a moment's noticeen cualquier momento, de inmediatoà la notification d'un moment
at a timea la veza la fois
at any pricea cualquier precioà tout prix
at all timesen todo momento, siemprede tout temps
at every stepa cada pasoà chaque étape
at lastal finenfin
at long lastpor finenfin
at one timeen un tiempo, en una épocaà la fois
at that pointen ese momento, en esta etapa,
en ese punto (referido al tiempo)
à ce moment
at that ratea ese paso, a ese ritmoà ce taux
at the momentactualmente, por el momentoen ce moment
at the point ofa un paso de, a punto deau point de
at the same timeal mismo tiempoen même temps
at the worse possible timeen el peor momento,
en mala hora
au pire momment possible
at timesa veces, de tiempo en tiempopar moments, de temps en temps
Bbe in for itencontrarse en una situación desagradabledans une situtation désagreable
be that as it maycomo pueda ser, sea como seade toute façon
be quitssin deuda con alguien,
estar en paz o a mano (con alguien), (en inglés es frecuente llevar todo al terreno monetario, si no tienes deudas eres feliz cosa que no es necesariamente así en nuestra sociedad)
être solvable, être à portée de main à quelqu'un
be at the end of one's tetherllegar al límite, como si uno estuviera atado como una mascota.atteindre la limite, comme si l'on troussees comme un animal de compagnie.
be well of (money)adinerado, estar bien (de dinero)riche, être bien d'argent
by all means/by any meanspor todos los mediospar tous les moyents
By and largeEn general; proviene de una expresión naútica en 1706
by no meande ninguna maneraen aucun cas
by way ofpor medio depar voie de
carry one's point, gain one's point, win one's pointsalirse con la suya, lograr su propósitosortir avec elle, atteindre son but
Dday after day, day by day, from day to daydía a díaau jour le jour
day in day outtodos los díasjour après jour
down and out, down-and-out (see outcast)pobre, indigente;
preferimos la forma con guiones para formar una palabra -tal como explicamos en la introducción-.
pauvre, indigent
Eeat one's wordscomerse sus propias palabrasmanger ses mots
either wayde cualquier manera,
de una u otra manera
d'une màniere ou d'aune outre
every now and thende vez en cuandode temps en temps
every so often, every now and againa vecesde temps en temps
Ffor a changepara variaspour changer
for all intents and purposes,
to all intents, constructions and purposes
Oficialmente o de manera oficial: deriva de una ley de Inglaterra que indicaba así literlamente, jerga legal.Officiellement ou officieusement: dérivé d'une loi de l'Angleterre indiquant que literlamente, le jargon juridique.
for gooddefinitivamente, permanentementedéfinitiviment
for the moment,
for the present
Por ahora,
por el momento
Pour le moment
from now ona partir de ahoraà partir de maintenant
from scratcha partir de ceroà partir de rien
from the ground updesde el comienzoà partir du sol
from this day forwarda partir de hoy,
de hoy en adelante
à partir de ce jour
from time to timede vez en cuandode temps en temps
from way backdesde hace tiempodepuis longtemps
Ggo back one's wordromper la promesa
(acá acostumbramos decir que una "persona no es de palabra" u "no es hombre/mujer de palabra")
revenir sur sa parole
go into detailsentrar en detallesentrer dans les détails
get into troublemeterse en problemasavoir des problèms
go to wasteser desperdiciadoaller aux dèchets
good for nothing,
good-for- nothing
bueno para nada,
inútil
bon à rien
good fortunebuena fortuna, buena suertela chance
Hhard timestiempos difícilesles temps difficiles
have a hard timespasar por tiempos difícilesavoir de moments difficiles
have a way withtener una aptitud o facilidadavoir des compétences et des capacités
high timeurgente, el momento exacto paraurgent, l'heure exacte pour
his days are numberedsus días están contadosses jours son comptés
however muchpor mucho quepeu importe combien
home inalcanzar una meta u objetivo, ejemplo "The missile homed in on its target."objectif atteint
II mean it!¡Lo digo en serio!¡Je suis sériux!
I shall never got over itNunca lo superaréJe ne m'em remettrai jamais
I wish I knewOjalá supierasi seulement je savais
In doing soAl hacerloCe faisant,
it doesn' matternada importaÇa n'a pas d'importance
it doesn't make senseesto no tiene sentidoÇa n'a pas de sens
It's all the same to meMe da igualtout est pareil pour moi
It's beside the pointeso no viene al caso,
ese no es el punto
C'est à côté du point
it's new to me es nuevo para míCést nouveau pour moi
it's up to youdepende de usted, depende de tí (es tu responsabilidad)dépend de vous

it's down to you
sólo depende de usted,
sólo usted puede hacerlo
que cela dépend de vous
it's waste of timees un desperdicio de tiempo,
es pérdida de tiempo
C'est du temps perdu
in every sense of the worden todo el sentido de la palabraDans tous les sens du mot
in his dayen su época, en sus tiemposen son temps
in no timeen un instanteen un rien de temps
in old daysen aquellos tiemposDans les temps anciens
in placeen su sitio, en su lugaren place
in the meantimeal mismo tiempo,
mientras tanto
En même temps
in time
just in time
a tiempoJuste à temps
in vainen vanoen vain
it can waitesto puede esperarça peut attendre
it could have been worsepudo haber sido peorça aurait pu être pire
it was a quite jobfue un gran trabajo,
fue todo un trabajo,
costó mucho trabajo
(la palabra "quite" también se utiliza para enfatizar algo)
C'était tout un travail
it's no go,
it's no-go,
no-goes
Esto no va,
no funciona
C'est pas aller
it's a matter of timees cuestión de tiempoc'est une question de temps
Jjust aboutcasi, ya casipresque
just nowjusto ahora,
en este momento,
¡ya!
en ce moment
Kknow one's placesaber cuál es su lugar,
en su sitio
Connaître sa place
know somebody by sightconocer alguien de vistaConnaître quelqu'un par la vue
Llet's clear it upvamos a aclarar estonous allons clarifier cette
let's drop the subjectvamos a dejar el temaLaissons tomber le sujet
Mmake a show ofhacer un espectáculo deFaire un spectacle de
make hastedarse prisase dépêcher
make timehacer tiempo,
entretenerse o entretener para que pase el tiempo
prendre le temps
mind your businessocúpate de tus asuntos (en inglés todo es dinero "business" es negocio, "deal" es trato de dinero pero se extiende al ámbito abstracto del pensamiento de esa sociedad)
no te metas en lo que no te incumbe.
Occupe-toi de tes oignons
more often than notla mayoría de las vecesLe plus souvent
Nno matterno tiene importancia,
no importa
peu importe
O
off and on
intermitentemente,
que cesa periodicamente
par intermittence
on-the-spot
inmediatamenteimmédiatement
One and the sameuno y otro a la vezUn seul et même
on timepuntual, a tiempoà temps
once and for allde una vez por todasune fois pour toutes
once in a whilede vez en cuandode temps à autre
out of dateanticuadodémodé
PPiece of cakepan comidoC’est du gâteau.
piqued my interestdespertó mi interésPiqué mon intérêt
point of viewpunto de vistapoint de vue
pro and conventajas e inconvenientesavantages et inconvénients
Rrun for one's lifecorrer muy rápido,
correr como si uno fuera a salvar su propia vida
courir très vite,
courir comme si on était de sauver sa propre vie
right awayahora mismotout de suite
round the clockdía y noche,
las 24 horas
24 heures sur 24
run out ofquedarse sinmanquer de
say one's sayemitir una opiniónExprimez une opinion
S
set the pace
marcar el ritmo,
marcar la pauta
donner le rythme
side against (someone)tomar partido en contraPrendre parti contre
so farhasta ahorajusque là
sooner or latertarde o tempranotôt ou tard
speak too soonhablar muy temprano,
adelantarse
Parler trop tôt
speak one's mindemitir una opiniónExprimez une opinion
stand one's groundmantenerse firme (en un tema),
mantenerse de pie
Se tenir debout
stand to reasonmantenerse con la razón,
ser lógico
Se tenir à la raison
Ttake a sidetomar partido,
apoyar
prendre à part
take a standtomar posiciónprendre position
take into accounttomar en cuentaprendre en compte
take timetomar tiempo,
debe transcurrir tiempo para
prendre du temps
take your time!Tómate tu tiempoprends ton temps,
prenez votre temps
till the end of timehasta el final de los tiemposJusqu'à la fin des temps
time after time,
time and again
una y otra vezencore et encore
time is upse acabó el tiempole temps est écoulé,
Il se termine le temps
time outpausatemps libre,
temps mort
time will tellel tiempo dirále temps nous le dira
time's getting shortEl tiempo se vuelve corto, se acaba.Le temps devient court, juste.
that's not the pointese no es el punto,
ese no es el tema
ce n'est pas le propos
the whole year round
all year round
todo el añoToute l'année
there is no hurryno hay apuro,
no hay prisa
il n'y a pas d'urgence
throw good money after badTirar dinero a la basuraJeter de l'argent après mauvais.
to one's faceenfrentar, en su caraÀ son visage
up againstcontraContre
use your own judgmentutilize su propio juicioUtilisez votre propre jugement
Wwhat are you driving at?¿A dónde quieres llegar? (retórica)Dans quelle mesure vous voulez aller?
what for?¿para qué?¿pourquoi?
what of it?¿qué tiene?Qu'y a-t-il?
wait and seeEspera y verásattend et regarde
Yyou can take it from metú puedes creermeVous pouvez me faire confiance

Palabras que se confunden frecuentemente en el idioma inglés.

No queremos irnos sin exponeros este interesante reportaje acerca de la ortografía del idioma inglés, que si bien para nosotros la otrografía del idioma castellano es un tanto complicada, en el idioma inglés -debido al habla coloquial- ha devenido en serios errores ortográficos que derivan en confusión a la hora de su traducción y/o comprensión para nosotros. Espero os sean útiles:

  • “Lets” y “Let’s”: “Let’s” es la contracción de “let us” que se traduce, generalmente, como “vamos” -primera persona plural-; hasta acá todo bien. El problema es no incluir el apóstrofo, lo cual genera una confusión con “lets” que es la conjugación del verbo “permitir” en tercera persona, por ejemplo: “She lets dance at hall in the morning”.
  • “Awhile” y “a while”: en la forma separada la vimos conformar 5 frases en la tabla principal de esta entrada pero conformando una estructura de frase (frase nominal). “Awhile” por sí sola -y la tratamos aquí aparte- es un adverbio que modifica verbos y significa, literalmente, “un corto período de tiempo” (ejemplo “He worked at home awhile”). Cosa diferente es “a while” la cual ya vimos: un artículo más un pronombre -frecuentemente usado con una preposición- contenidos en un sintagma. Ejemplo: “They will be coming in a while”.
  • “Affect” y “effect”: el primero es un verbo y el segundo un pronombre, el confundirlos -consideramos- no cae en el terreno de la ortografía sino en el campo del paradigma sintagmático; no obstante según el reportaje los habitantes de habla inglesa tienden a confundirlos por la similitud de sus letras -una sola diferente-. Acá estamos muy claros en eso y hasta tenemos un refrán: “confundir la gimnasia con la magnesia“.
  • “Each other’s”: es un adjetivo posesivo recíproco -si no existe esta figura, pues la acabamos de inventar, aunque lo dudamos. Es una forma correcta y aceptada, por ejemplo: “Search at each other’s addresses, please”. Lo incorrecto es usar “each others” como una forma de plural que no existe, ejemplo “Pete and Mary love each other very much”.
  • “Years’ experience”: el inglés busca siempre simplificar y acortar al máximo sus expresiones, tanto es así que frecuentemente olvidan el apóstrofo+letra “s” que denota posesivo pero como la palabra ya termina en “s” -plural de “year”- no se coloca otra “s”. Pero es un error ortográfico obviar el apóstrofo. Para nosotros mejor es escribir “years of experience”, se parece más al castellano, opinamos.
  • “It’s” e “its”: continuamos con el problema de los apóstrofos, en esta oportunidad “it’s” es una contracción de “it is”, en cambio “its” es una forma posesiva. Ejemplos: “It’s easy” o “It is easy”; “The computer help us, its job is impressive!”
  • “A” y “an”: para nosotros está sumamente claro que el artículo -neutro, sin género en inglés- es “a” pero cuando el nombre o pronombre comienza con vocal debe utilizarse “an”, ejemplo: “an apple”. El problema está en las palabras que comienzan con la letra hache que algunas veces no se pronuncia o es “muda” en inglés. Es así que siempre se debe escribir “an honor” y no “a honor”. Hacemos notar de nuevo que la letra hache, dependiendo de la palabra, no de las sílabas, se pronuncia o no; ejemplo “high” (alto, de altura) -se pronuncia-.
  • “Everyday” y “every day”: ambas formas son correctas pero depende del contexto donde se usen. “Everyday” significa, literalmente, “diariamente” que es diferente a “every day”: “cada día”; ejemplo: “He eats pizza every day of his life” (la redundancia es para propósitos didácticos).
  • “Advice” y “advise”: acá de nuevo una letra hace la diferencia, “advice” significa consejo, recomendación mientras que “advise” es un verbo, recomendar, advertir (o informar como “Le digo y le informo…”).

Palabras que incluso a nivel académico son confundidas.

En otro interesante artículo, cuyo título incluye la palabra “stupid” la cual no comparto, no muestra varias palabras que a aún la “gente inteligente” utiliza mal, más sin embargo todo tiene su explicación (y lo siguiente justifica mi desacuerdo con el título del reportaje):

  • “Prostate cancer” y “prostrate cancer”: en castellano tenemos un refrán, “errar es de humanos, rectificar es de sabios” y he aquí que tenemos nuestra palabra dentífrico (“crema de dientes” en habla coloquial) que ocasionalmente escribimos como dentrífico -palabra no reconocida por el D.R.A.E.- pero que no se presta a ningún tipo de confusión, el significado no se desvirtúa para nada. Pero en el caso del inglés vaya que es grave el asunto si agregáis una letra erre extra a “prostate cancer”: en vez de decir “cáncer de próstata” estáis diciendo “cáncer postrado” o “cáncer de acostado boca abajo en el suelo”. Verbigracia: el cáncer nos obliga a postrarnos, es decir, nos debilita y nos quita fuerzas ¡pero no es un tipo de cáncer!
  • “First-come, first-serve” y “First-come, first-served”: acá volvemos a caer en el asunto de la pronunciación de las palabras completas (y que sería facilmente corregible en idioma inglés), generalmente la letra e al final no se pronuncia y lo más extraño es que “ed” pues tampoco, ¡así que de aquí proviene el error común! “First-come, first-serve” significa que el primero en llegar es el que sirve o atiende a los siguientes que llegan (así de parco es el idioma inglés). Pero “first-come, first-served” significa que el primero que llegue es servido o atendido ¡menuda diferencia! Por ello es que ellos allá, en ciertos casos -o siempre-, deberían pronunciar la “ed” (sufijo que indica pasado de los verbos regulares) para mejor comprensión -y escritura-.
  • “Deep-seeded” y “deep-seated”: es similar caso anterior y a pesar de que pronuncian expresamente el sufijo “ed” la confusión proviene de “seed” (semilla, se pronuncia “si-id”) y “to seat” (sentar, se pronuncia “sit”). Acá, pensamos, es la manera de hablar muy rápido la que ocasiona el error: así “deep-seated” significa bien establecido o profundamente asentado, arraigado, “deep-seeded” toma otra interpretación como “semilla sembrada profundamente” o simplemente “sembrada (la semilla, por supuesto, que es lo único ente que se siembra) profundamente” (¡ea, tío, que mola también el castellano el acortamiento del habla!).
  • “Peak” y “peek”: de nuevo la pronunciación, “peak” es pico -de montaña-, cumbre y “peek” significa a golpe de vista, ojeada. Si a ver vamos en castellano solucionamos esto muchas veces con los acentos, como es el caso de “sabana” y “sábana” a fin de diferenciarlos al escribirlos (en este caso el castellano “es fácil”: como se escribe se pronuncia, por cada sílaba).
  • “Piqued my interest”: se traduce como “despertó mi interés” ya que el verbo “to pique” es estimular, avivar. “Peaked my interest” si bien se relaciona como “cumbre” pues no, no es correcto usarlo en esa forma.
  • “I could care less” y “I could not care less”: Ay, las negaciones ¿No nos ha sucedido eso alguna vez? Pues es mejor preguntarnos ¿Nos ha sucedido eso alguna vez? Pues sinceramente el comenzar una pregunta con una negación es muy frecuente en castellano, que no somos avaros en esto de prounciar palabras. Pero consideramos que es un error que debemos corregir (fíjemonos en los matices de nuestra habla: si comenzamos con una negación implícitamente le estamos indicando a nuestro interlocutor o interlocutora que tiene dos opciones, pero es redundante). En el idioma inglés sucede exactamente lo contrario: al usar la frase incorrecta “I could care less” está indicando que aún se preocupa, en lo mínimo por algo (tal vez será para indicar -como en nuestra negación al principio de la pregunta en castellano- que queda algo de piedad o misericordia, que se es algo magnánimo). Lo correcto es decir “I could NOT care less” o “I could’t care less” -no me preocupo en lo mínimo, o me importa menos, me preocupa menos. Preferimos no usar la contracción para dar mejor giro al hablar, enfatiza la negación “I could not care less”. Por cierto, en castellano usaríamos la expresión más poética “me importa un comino”.
  • “Shoo-in” y “shoe-in”: acá en castellano usamos la interjeción “¡chú!” para espantar un perro o un gato por “¡sale!” o “¡fuera!”. En inglés lo comenzaron a utilizar para azuzar a los caballos en las carrera e incluso llegó a ser un verbo que significa -o es algo parecido- a apurar en una dirección. Pero una cosa totalmente distinta es “shoe-in” que significa “meter en un pie en la puerta para evitar que se cierre” y es precisamente eso loq ue hacen los vendedores que van de casa en casa. De nuevo es confundir la gimnasia con la magnesia porque suenan parecido pero se escriben diferente y tienen significados totalmente distintos.
  • “Emigrate to”: de nuevo comenzemos por el castellano: migrar es simplemente trasladarse del lugar donde se habita a otro lugar diferente (vivir, habitar en otro país o reino). Este verbo describe el acto pero no la dirección: “emigrar” es abandonar su propio país para irse al extranjero e “inmigrar” es el caso contrario, una persona que viene de un país extranjero. En inglés sucede lo mismo: “emigrate” significa “inmigrar” y es sinónimo de venir, así que lo correcto es escribir “emigrate from”. El caso opuesto es “inmigrate to” que significa emigrar. Por supuesto aclaramos que “to” signifca “para” o “hacia” y “from” significa “desde” tanto en tiempo como en lugar.
  • “Sleight of hand” y “Slight of hand”: aquí vamos de nuevo con la pronunciación en inglés, ambas iguales, pero significan cosas distintas. “Sleight of hand” se usa para describir la destreza y astucia con las manos de los magos (léase prestidigadores y prestidigitadoras) mientras que “slight” es un insulto de mano -quitarse el guante y cachetear al contrario-, ojito pues.
  • “Hone in”: para resumirlo de una vez, esta combinación de palabras NO existe en el inglés (aunque hay algunos que aún lo dudan). Vamos a intentar explicarlo: “home in” significa alcanzar un objetivo, lograr una meta -por cierto, lo agregamos a nuestra lista de principio- y mucha gente cree que “hone in” es una contractura ¿😒? para ello, nada más lejos de la verdad. “To hone” significa refinar, perfeccionar, así que “hone in” es algo totalmente ilógico (aunque hay algunos que aún lo defienden a capa y espada).
  • “Peace of mind” y “Piece of mind”: lo correcto es la primera expresión que significa calma, serenidad o despreocupación. La segunda significa “pedazo de mente” o pedazo de cerebro. Nos arriesgamos a sugerir que la confusión deriva de otra frase muy particular: “piece of cake” -otra adicional a la lista- y que nosotros también lo relacionamos con el trigo, “pan comido“. En francés se copian del inglés y dicen “c’est du gâteau“.
  • “Whet your appetite” y “Wet your appetite”: positiva es la primera expresión, negativa la segunda. “Wheat” es estimular el apetito y “wet” humedecer el apetito, como véis no tiene lógica en castellano pero ¡momento! a veces solemos decir “está salivando de la alegría” y salivar es humedecer, cuando se tiene apetito se saliva, se humedece la boca, tal vez de allí el error común.
  • “For all intensive purposes”: vamos, no hallamos explicación lógica a esto, debería ser “for all intents and purposes” que a su vez es abreviado de una ley de Inglaterra que rezaba “”to all intents, constructions and purposes” y que se traduce como “oficialmente” o “de manera oficial”. Ah, otra más para la lista de arriba.
  • “One and the same” y “one in the same”: la primera es la correcta y significa uno y otro a la vez, por ejemplo “Melissa was father and mother one and the same” que se traduce como “Melissa fue padre y madre a la vez”. “One in the same” no tiene sentido, es una distorsión.
  • “Case in point”:
  • “Make do” y “make due”: “make do” es una abreviatura de “to make something do well” o “to make something sufficient”. Es por ello que que, incorrectamente, escriben “make due” por “hacer lo debido”. Un ejemplo que degusto y os traigo: “When life gives you lemons, you make do and make lemonade!”.
  • “Due diligence”: nace a partir de una jerga legal, haga las diligencias debidas de concer con quién se está haciendo negocios. Es totalmente diferente a “do diligence” que se puede aplicar a cualquier otro proceso legal, incluyendo el conocer con quien se hace tratos legales.
  • “By and large”: proviene de una expresión naútica de 1706 y significa “en general”. Por otra parte “by in large” no existe ni tiene sentido (aunque tampoco no mucho la expresión original y correcta).

Humor.

Veamos al genial Bill Murray (actor en la película “Cazafantasmas”, entre otros éxitos) anunciando con trabalenguas en su idioma natal inglés los “geniales y novedosos” LASERdiscs (que a la final fueron un fracaso en ventas):

Fuentes consultadas.

En idioma castellano.

En idioma inglés.