Blog atrasado con gajes del oficio

Reemplazo De Minúsculas Con Mayúsculas Con Emacs

Para un simple reemplazo de caracteres al principio de una oración, es decir, de minúsculas por mayúsculas, se puede emplear un simple y eficiente método de expresión regular también en Emacs.

Ya existe un modo de capitalization que logra este reemplazo de una cadena de caracteres o cadena de texto como se dice en inglés: string, y aunque tiene un inigualable mérito para este propósito, de igual manera retrasa el ingreso de caracteres., como es de esperar, el retraso o el lapso que esto conlleva, es una desventaja para una óptima funcionalidad.

Digamos por ejemplo que:

foo bar. foo bar. foo bar.

Para modificar la minúscula por una mayúscula:

 M-x replace-regex
 \(\. \w\)
 \,(capitalize \1)

que nos da como resultado:

foo bar. Foo bar. Foo bar.

pero el comienzo de la oración o de la línea no se ha modificado, entonces:

 M-x replace-regex
 \(^\w\)
 \,(capitalize \1)

logra hacer la modificación restante a:

Foo bar. Foo bar. Foo bar

Si deseas hacer la modificación de una vez y por todas, y abreviando por consiguiente las dos expresiones regulares anteriores, utilizarías en este caso el delimitador | antes de la barra oblicua \. Es decir:

 M-x replace-regex
 \(^\w\|\. \w\)
 \,(capitalize \1) 

Reemplaza el original foo bar. foo bar. foo bar. A Foo bar. Foo bar. Foo bar.

Notas

Si por aluna casualidad, Emacs no reconoce y te devuelve como resultado que reemplazó (0) eventos, quizás pudiese tuvieses que palanquear (toggle) case-replace a nulo (nil). Vea esta respuesta en Stackoverflow.

Reemplazar Con Vim. Reemplazos de minúsculas con mayúsculas

O como se dice en Inglés: capitalization, se puede lograr fácilmente en vim mediante el empleo de mayúsculas al comienzo de oraciones a través del uso de una expresión regular o regex, sin la necesidad de utilizar algún que otro script (que puede causar efectos secundarios en el funcionamiento), para lograr el reemplazo de las minúsculas.

En el website de programadores de superuser.com, superuser.com/questions/737130/automatically-capitalize-the-first-letter-of-sentence-in-vim se hace esta misma pregunta para lograr el reemplazo automático de minúsculas por mayúsculas al principio de cada oración.

Una de las repuestas 1 hace énfasis de esto mediante la adición de un unas líneas de script o programa de ejecución.

El problema que esto conlleva, y como uno de los usuarios comentó,

The only problem is this script seems to add a noticeable lag when typing

Es que mientras más extenso sea el documento, más se experimenta el lag o el retraso en el ingreso de caracteres. Es decir, la óptima funcionalidad se pierde parcialmente. Solo es necesario en tener un documento que comprenda un número de ciento y algo líneas, (y esto es sin contar que haya encima de ello algunas que otras líneas de código), para notar la diferencia.

Considero que sin tanta complicación que más tarde nos puede afectar, la mínima utilización de un reemplazo de caracteres mediante una expresión regular, tuviese mejores resultados.

Para cambiar la minúscula por mayúscula sería necesario entonces algo como:

 $ :%s/\.[a-z]/\U&/g

e. g., si el espacio después de la puntuación fue ingresado, no se te olvide cambiar el código encima con el espacio sobrante correspondiente, tal como

 $ :%s/\. [a-z]/\U&/g

y para lograr el intercambio al comienzo de cada línea, entonces

 $ :%s/^[a-z]/\U&/g

reemplaza la minúscula desde el comienzo.

Para reemplazar múltiples patrones de búsqueda, se debe emplear el sufijo e después de la expresión regular con la que se modificaría la búsqueda, separado de una barra vertical | que separe los dos grupos, es decir:

 $ :%s/^[a-z]/\U&/ge | %s/\. [a-z]/\U&/ge

Otras de las maneras de emplear esta expresión regular es mediante la substitución de [a-z] por \w. una búsqueda rápida en :help nos indica que \w equivale a [0-9A-Za-z]

por lo tanto se pudiese emplear algo tal como

 $ :%s/^\w/\U&/ge | %s/\. \w/\U&/ge 

Footnotes

↩︎ Respuesta de usuario de vim para el empleo de un script que reemplace minúscula por mayúscula pero que causa lag en documentos http://superuser.com/a/737155

Modificar Mapa Del Teclado Con Emacs Y Vim

Estos son algunos de los ejemplos que se pueden utilizar a través de los inmensamente populares editores de programación Emacs 1 y Vim 2, para cambiar el mapa del teclado.

Emacs

El altamente configurable y extensible editor de texto Emacs también nos puede ayudar con modificaciones del teclado, o cambiar la localización de las teclas, sin la necesidad de cambiar todo el diseño, y sin la necesidad de tener que utilizar algún teclado en específico.

Primero se crea una función que se le asigna un nombre determinado. En este caso utilizamos el nombre de “backslash”. Posteriormente a esto, se le atribuye el comando insert seguido de kbd y el mapa del registro del teclado que se desea modificar.

En mi caso, encontré conveniente intercambiar las teclas \ por ; y viceversa. Por ejemplo:

(defun backslash ()
  (interactive)
  (insert (kbd "\\")))

(global-set-key (kbd "; " ) 'backslash)

al igual que:

(defun semicolon ()
  (interactive)
  (insert (kbd ";" )))

(global-set-key (kbd "\\" ) 'semicolon)

Como se puede ver en los ejemplos anteriores, después de esto se le asigna global-set-key a la recién nombrada función. Es decir, en el primer caso, la función se le asignó el nombre backslash, y la cual fue directamente entrelazada con el ya mencionado comando global-set-key seguido de la tecla ;.

De esta manera se logra el objetivo deseado. Esto es, que el ingreso de una tecla dada en el mapa del teclado del registro de entrada del sistema operativo, sea interpretado posteriormente, - mediante la nueva asignación que proveyó la función - con el registro del mapa de otra tecla que haya sido predeterminada, dando lugar con ello a que ese ingreso del mapa del teclado, se registre apropiadamente con los resultados de la salida.

En el primer ejemplo, cada vez que la tecla ;sea presionada, la tecla \ tomará precedencia. Y viceversa.

Vim

en el caso de Vim, el editor de texto más utilizado en Unix, y el cual está disponible de fábrica, o en la mayoría de las variaciones de Unix, el modificar el mapa del teclado se obtiene de varias maneras.

Solamente mostraré el comando que lograría esto de la manera más simple y durante el modo de insertar: inoremap, el cual es seguido de la tecla que se desea modificar, con la que tomaría la nueva posición.

Es decir:

 inoremap ; \

lograría lo que en este caso se quisiera. Cada vez que la tecla ; se presione, la \ tomará su lugar.

De la misma manera, cuando se especifica el anterior comando en el fichero de inicialización, conlleva a especificar el mismo comando, es decir inoremap pero en esta ocasión con los símbolos de manera inversa. De otra manera, ambas teclas tendrán asignadas el mismo mapa en el registro del teclado.

Por lo tanto

inoremap \ ; 

sería imprescindible para finalizar la modificación de estas teclas.

Reemplazos en Vim

Estos son algunos de los reemplazos que se pudieran realizar en vim:

:s/\zs/\r/g

will have this string of characters: abcdefghi

tendrá esta cadena de caracteres: abcdefghi

result:

a
b
c
d
e
f
g
h
i

Por otra parte la siguiente ejecución:

:s/\s/\r/g 

will have

esto es una prueba

result:

esto
es
una
prueba

and :s/\n//g

will have something like

a
b
c
d

results:

abcde

:s/\n/ /g

will have something like

esto
es
una
prueba

result: esto es una prueba

por supuesto, se puede ver que en algunos casos se utiliza \n, mientras que en otros se utiliza \r, es necesario recordar que en cada reemplazo y substitución en vim, se logra mediante :s/texto para reemplazar/substituir con.

Primero antes que todo el delimitador de barra oblicua / es la separación de lo que se quiere modificar con lo que se modificaría.

Es decir, por ejemplo, donde texto para reemplazar es la expresión regular que se desea cambiar, o los caracteres del texto que se desean modificar, mientras que substituir con es el nuevo ingreso que tomará lugar.

En este caso, para entender este procedimiento, no hay mejor ayuda en vim, que ir directo a la documentación con :help \n o mediante :h \n para abreviar, y también entender el por qué difiere de :help \r

Creo que una de las mejores respuestas sobre esto, se encuentra en http://stackoverflow.com/a/18961239 que especifica que “in the syntax s/foo/bar, \r and \n have different meanings depending on context.

En nuestro caso sería s/texto para reemplazar/substituir con.

Por lo tanto esto equivaldría a:

En el caso de texto para reemplazar, es decir, s/<texto para reemplazar> antes del segundo delimitador /:
\n sería una newline o un salto de línea.
\r en este caso sería CR que es la tecla Enter, tecla de retorno o de regreso.

En el caso de substituir con, es decir, s/<texto para reemplazar>/<substituir con>, o los caracteres que se encuentren después de la segunda barra /:
\n seria un octeto nulo
\r en este caso es una newline o un salto de línea.

Hugo No Sincroniza Directorio Estatico en Github

Después de realizar varias pruebas donde traté de evaluar algún que otro theme en Hugo, me di cuenta que el problema era más serio que lo pensaba.

Tenía en mente llevar las pruebas con ciertos temas minimalistas, o como se diría en español: simples, que me permitiesen llevar a cabo flexibles modificaciones locales., y de ahí partir con ello.

La mayoría de los temas en Hugo están constituidos por ciertos paquetes de láminas en estilo de cascadas, o con las siglas en inglés por CSS, y al igual que otros pequeños ficheros en Javascript.

Cabe aclarar que la mayoría, por no decir todos, emplean las últimas tecnologías en gráficos que validen la convención estándar establecida por el consorcio W3C.

Les recomiendo a todos aquellos que estén interesados en generadores estáticos del web, que evalúen a Hugo y de ahí decidir si es o no el motor más eficiente y fiable que hace uso de estas últimas tecnologías. Por supuesto que no sería justo si no se menciona otros como hexo, desarrollado en Javascript por ejemplo, que al igual que el primero, son motores que valen la pena en emplearlos en la producción de sitios web, en la elaboración de blogs, al igual que con cualquier otra documentación.

El motor Hugo, fue desarrollado en golang - un lenguaje de programación que fue creado en Google - es uno de los más recientes en este campo de generadores estáticos que ha sido recibido con mucho interés por programadores y otros entusiastas en computación. Pero sobre esto hablaré en otro artículo.

Como dije al principio, en esta ocasión me interesaba más la flexible estructuración del blog que más que nada, mediante la evaluación de algunos de los temas que están disponibles.

Le había hecho algunos que otros cambios a uno de ellos intitulado purehugo y basado mayormente en bootstrapCDN logré llevar a cabo algunos que otros cambios, me mortificaba la idea que no podía omitir la generación de todos los posts en la raíz del servidor. Por mucho que traté de hacer los cambios, la creación de una página que no sería mostrada en la página principal del servidor, era casi imposible. Tampoco quería emplear más tiempo que el necesario en lograr esto.

Decidí entonces en descargar una plantilla temática que lleva de nombre shiori, que fue portado o transferido de la implementación original del tema del mismo nombre por su autor Shusaku Uesugi.

Estaba tratando de implementar en la estructura de la página un tema sencillo y este susodicho tema mostraba llenar los requisitos para ello.

Después de descargarlo en el directorio themes

$ git clone https://github.com/chibicode/hugo-theme-shiori shiori

decidí en ponerlo en práctica

$ hugo server -t shiori 

y el servidor local en el ordenador mostraba sin problemas la paginación correcta, al igual que todos los posts. No intenté en llevar otros cambios de modificación, porque la primera vez que ejecuté hugo new post/test que proseguiría con la creación de un post en el archivo de contenido, un error acerca del fichero archetypes se había generado.

Traté de encontrar más información acerca de ello. Pero la única explicación acerca de esto tenía que ver con la actualización no solo de hugo sino de todas las dependencias de este:

go get -u -v github.com/spf13/hugo
github.com/spf13/hugo (download)
github.com/fsnotify/fsnotify (download)
Fetching https://golang.org/x/sys/unix?go-get=1

El servidor local me mostraba las modificaciones.

Una búsqueda más tarde en Google me refirió a iHugo 0.16-DEV (Jan 2016) fails to sync theme’s static directory on Linux el cual trataba este problema.

Aparentemente una de las dependencias tenía que ser actualizada, y por lo tanto la bandera -u tenía que ser especificada apropiadamente para la instalación del motor Hugo.

Flechas en Gimp

Una de las maneras más fáciles en crear flechas en Gimp, sería con la adición de un plugin al directorio scripts de Gimp.

En el sitio de https://graphicdesign.stackexchange.com/questions/44797/how-do-i-insert-arrows-into-a-picture-in-gimp se puede encontrar más información en cuanto a esto. Solamente mostraré los pasos visuales para lograrlo.

 $cd /directorio-de-gimp/scripts/

Seguido de

 $wget http://registry.gimp.org/files/arrow.scm

or the archived version

 $wget https://web.archive.org/web/20180218220954/http://registry.gimp.org:80/node/20269 

También pudieras hacer uso de una versión modificada del anterior script pero con flechas curvadas.

puedes obtenerlo mediante

 $wget https://web.archive.org/web/20180208191139/http://registry.gimp.org:80/node/28566

Y recomienza el programa Gimp.

Digamos por ejemplo, que seleccionas un nuevo documento. En la caja de herramientas de Gimp (recuerda que si no está visible, siempre puedes activarla a través de la combinación en el teclado de Ctrl y b), podrás ver la nueva inclusión de la ventana de herramienta.

Veamos como funciona con la selección de esta misma caja de herramientas.

caja de herramientas toolbox

El próximo paso sería seleccionar el icono con el que se marcan los dos puntos de la flecha.

clic dos vecs

Asegúrate que el color como se muestra en la figura anterior, esté seleccionado apropiadamente en la caja de herramientas (toolbox).

Una vez que los dos puntos hayan sido marcados, selecciona la barra del menú principal de Herramientas/tools, descendiendo hasta el final y dándole clic a Arrows.

Una vez que le des a Arrows del menú principal de la barra, una ventana que es similar a la que se muestra a continuación te permitirá especificar ciertos valores.

selecciona el menú principal de arrows

Una vez que tengas la ventana abierta, ajusta los valores de porcentajes según el grosor, o el ancho que los ángulos de la flecha debiesen tener cuando se le aplique el color configurado. También puedes especificar otros valores como en rellenar a todo color la punta de la flecha.

Clic ok una vez que los valores sean los acordados.

flecha finalizadai

Git in Six Hundred Words by Mary Rose Cook

Imagine you have a directory called alpha. It contains a file called number.txt that contains the text first.

You run git init to set up alpha as a Git repository.

You run git add number.txt to add number.txt to the index. The index is a list of all the files that Git is keeping track of. It maps filenames to the content of the files. It now has the mapping number.txt -> first. Running the add command has also added a blob object containing first to the Git object database.

(This essay is a companion piece to Gitlet, my implementation of Git in JavaScript.)

Imagine you have a directory called alpha. It contains a file called number.txt that contains the text first.

You run git init to set up alpha as a Git repository.

You run git add number.txt to add number.txt to the index. The index is a list of all the files that Git is keeping track of. It maps filenames to the content of the files. It now has the mapping number.txt -> first. Running the add command has also added a blob object containing first to the Git object database.

You run git commit -m first. This does three things. First, it creates a tree object in the objects database. This object represents the list of items in the top level of the alpha directory. This object has a pointer to the first blob object that was created when you ran git add. Second, it creates a commit object that represents the version of the repository that you have just committed. This includes a pointer to the tree object. Third, it points the master branch at the new commit object.

You run git clone . ../beta. This creates a new directory called beta. It initializes it as a Git repository. It copies the objects in the alpha objects database to the beta objects database. It points the master branch on beta at the commit object that the master branch points at on the alpha repository. It sets the index on beta to mirror the content of the first commit. It updates your files - number.txt - to mirror the index.

You move to the beta repository. You change the content of number.txt to second. You run git add number.txt and git commit -m second. The commit object that is created has a pointer to its parent, the first commit. The commit command points the master branch at the second commit.

You move back to the alpha repository. You run git remote add beta ../beta. This sets the beta repository as a remote repository.

You run git pull beta master.

Under the covers, this runs git fetch beta master. This finds the objects for the second commit and copies them from the beta repository to the alpha repository. It points alpha’s record of beta’s master at the second commit object. It updates FETCH_HEAD to show that the master branch was fetched from the beta repository.

Under the covers, the pull command runs git merge FETCH_HEAD. This reads FETCH_HEAD, which shows that the master branch on the beta repository was the most recently fetched branch. It gets the commit object that alpha’s record of beta’s master is pointing at. This is the second commit. The master branch on alpha is pointing at the first commit, which is the ancestor of the second commit. This means that, to complete the merge, the merge command can just point the master branch at the second commit. The merge command updates the index to mirror the contents of the second commit. It updates the working copy to mirror the index.

You run git branch red. This creates a branch called red that points at the second commit object.

You run git checkout red. Before the checkout, HEAD pointed at the master branch. It now points at the red branch. This makes the red branch the current branch.

You set the content of number.txt to third, run git add numbers.txt and run git commit -m third.

You run git push beta red. This finds the objects for the third commit and copies them from the alpha repository to the beta repository. It points the red branch on the beta repository at the third commit object, and that’s it.

(If you would like to learn about the internals of Git in detail, you can read my essay, Git from the inside out.)

Círculos en Gimp

Esto es solamente un recordatorio para realizar varias modificaciones a cualquier imagen en GNU Gimp.

No soy un usuario de este programa, pero reconozco que como manipulador de gráficos e imágenes, es incomparable.

Hace un tiempo, recuerdo haber leído algo acerca de esto a través del blog de Alvin Alexander que toca sobre la creación de círculos, elipses y demás.

Algunos de los pasos los omitiré, porque algunos son innecesarios.

  • Primero crea una imagen, un nuevo documento, aunque por supuesto, que puedes abrir cualquier otra imagen png, jpeg, jpg, etc.

  • Después en la caja de herramienta, selecciona el elipsis que te servirá para demarcar el trazo.

Selecciona elipse

  • Dibuja el trazo del círculo

dibuja imagen

  • Una vez realizado este círculo, dale a clic al menú de Select, y desciende hasta que te encuentres con el Border (borde).

  • En la nueva ventana que aparece donde te especifica en seleccionar en pixels la dimensión de este borde, incrementa o disminuye estos pixels.

Selecciona el borde del Menú

  • Asegúrate que el color que tienes seleccionado en la caja de herramientas sea el correcto.

  • Clic en el menú de Edit desde la ventana principal de Gimp y selecciona Fill with FG Color

Círculo después de fill with color

Cambia Tu Contraseña en Gmail Y Google

Toda la ayuda que se necesite acerca de GMail, y cualquier otro producto de Google, se puede obtener a través de la página de estos en https://support.google.com/ pero no obstante a ello, enumeraré algunos que otros pasos para recuperar la contraseña o clave, en caso que se haya extraviado o por cualquier otro motivo.

Estas son algunas imágenes que se mostrarán, si tienes el idioma seleccionado como Español, o castellano, en tu navegador.

Example image

Que como se explica en https://support.google.com/mail/answer/41078?hl=es puedes reiniciar tu sesión para restablecer otra.

inicia sesión

Una vez que le des clic te dirigirá hacia un enlace que te preguntará con tres (3) opciones:

inicio de sesión

Acto seguido a ello, seleccionas una de ellas.

Por ejemplo, si seleccionas la primera de estas, porque simplemente se te ha olvidado, te da la opción de ingresar el correo electrónico que normalmente utilizas para el inicio de la sesión.

correo de inicio para gmail

El próximo enlace te preguntará por la última clave que recuerdas.

Le das clic a No lo sé

escribe lo que te recuerdas

Después que ingreses tu correo electrónico, o cualquier otro método de verificación secundario: así sea mediante otro correo electrónico, o mediante SMS de mensaje de texto, que empleaste durante el registro de la cuenta, Google te enviará un enlace, un link, que te permitirá restablecer otra contraseña.

Recuerda en clic Continuar para que el proceso comience, o de lo contrario la recuperación de la contraseña no será posible, según las actuales configuraciones que Google emplea para este proceso, que requiere que se sigan los pasos como se muestra antes que Google te reenvíe otro email que te permita ingresar otra contraseña.

clic continuar

Si no tienes acceso al método de recuperación que especificaste, aún así, Google te permite verificar tu identidad mediante otras preguntas con respuestas que se utilizaron durante el registro de la cuenta.