De potencia a notación científica

Existen muchas maneras de manejar números «grandes» dependiendo de lo que se quiera hacer con ellos y una manera es escribirlo como una potencia, que ahorra mucho trabajo a la hora de hacer ciertos cálculos, pero que puede llegar a ser confuso cuando se intenta comprender su magnitud si estamos acostumbrado a leer cifras en notación científica cuando se trata de números «grandes».

Escribo «grandes» en comillas porque lo que es grande para un caso puede ser despreciable en otro, pero asumamos que 99^{99}, por ejemplo, es un número «grande».

Esta duda surgió por la necesidad de conocer las cifras más significativas de 2^{3153600000000}, para mí un número gigante, cosa que al final no resultó ser tan compleja y que se resuelve usando \log_{10} y sus propiedades:

x=2^{3153600000000}

\log_{10} x = \log_{10} 2^{3153600000000}

\log_{10} x = 3153600000000 \log_{10} 2

\log_{10} x \approx 949328194325.9310972260

x \approx 10^{949328194325.9310972260}

x \approx 10^{949328194325} 10^{0.9310972260}

x \approx 8.532911199 \cdot 10^{949328194325}

La cantidad de cifras significativas dependerá de la precisión con la que se trabaje, pero definitivamente es mucho más económico usar este método que multiplicar 3153600000000 veces, además ofrece la ventaja de conocer de cuántos dígitos está compuesto nuestro número y así comprender mejor su magnitud frente a otros números grandes de una manera más intuitiva. Así que en general:

a^b = 10^{a \log_{10} b}

a^b = 10^{\left[ a \log_{10} b \right]} 10^{a \log_{10} b - \left[ a \log_{10} b \right]}

Donde \left[ x \right] es la función Parte Entera, siendo \left[ a \log_{10} b \right] + 1 la cantidad de dígitos totales que posee el número.

Así que al final es otra manera de escribir el mismo número, pero todo dependerá de lo que se necesite.

De ñapa dejo una función C que hace los cálculos por nosotros dado a y b e imprime el resultado por pantalla:

#include <math.h>
#include <stdio.h>

void powtosci (const long double a, const long double b) {
 long double intpart = 0;
 long double decpart = modfl(b * log10l(a), &amp;intpart);
 printf("n = %Lf * 10^%.0Lf\n", powl(10.0, decpart), intpart);
}

Integrar LilyPond en LaTeX

\LaTeX es bonito, LilyPond también y más bonito aún es integrar los dos en un mismo documento.

Básicamente es como escribir cualquier documento de \LaTeX pero con extensión .lytex que nos permite usar las instrucciones \lilypond para escribir código de LilyPond directamente y \lilypondfile para invocar un documento .ly externo e integrarlo a nuestro PDF final.

Una vez que nuestro documento está finalizado podemos compilarlo usando primero lilypond-book que prepara un archivo .tex con todas sus dependencias para ser compilado con pdflatex como cualquier documento de \LaTeX.

Y como todo se entiende mejor con un ejemplo completo donde compilaremos el archivo prueba.lytex donde escribiremos código de LilyPond directamente e invocaremos al archivo ejemplo.ly para integrarlo al PDF final:

Archivo preba.lytex:

%Archivo prueba.lytex
\documentclass{article}

\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage[spanish,activeacute]{babel}

\usepackage{xcolor}
\usepackage{hyperref}

\hypersetup{colorlinks=false, pdfborderstyle={/S/U/W .5}}

\title{Prueba \LaTeX\ y LilyPond}
\author{Erick Rincones}
\date{\today}

\begin{document}
\maketitle

\section{Muestra}

Esta es una prueba de \LaTeX y LilyPond para crear un PDF con texto y m'usica,
la instrucci'on \verb+lilypond+ sirve para escribir ejemplos cortos. Puede
usarse dentro de un p'arrafo \lilypond[fragment, relative=2, staffsize=8]{c8
g16 g a8 g r b c4 \bar "|."} aunque para mi no es agradable a la vista y
considero mejor usar la instrucci'on dentro de un bloque \verb+begin+:

\begin[fragment, quote]{lilypond}
\relative c'' {
	\key g \major
	g8 d16 d e8 d r fis g4 \bar "|."
}
\end{lilypond}

Los trozos de m'usica m'as grandes pueden escribirse en un archivo separado e
invocarse con \verb+\lilypondfile+ como este fragmento del Himno Universitario
de la Universidad Central de Venezuela escrito en el archivo \verb+ejemplo.ly+:
\\

\lilypondfile[line-width=4.1\in, noragged-right]{ejemplo.ly}

Se pueden usar m'ultiples opciones para estas instrucciones y est'an muy bien
detalladas en la documentaci'on oficial:
\url{http://lilypond.org/doc/v2.17/Documentation/usage/music-fragment-options}

\section{Compilaci'on}

Para compilar este documento debemos abrir una terminal en el directorio donde
se encuentra el c'odigo de este archivo (\verb+prueba.lytex+) junto con el
ejemplo de LilyPond que se va a invocar (\verb+ejemplo.ly+) y ejecutar las
siguientes instrucciones en orden:

\begin{verbatim}
lilypond-book --output=out --pdf prueba.lytex # Preparacion
cd out                                        # Me muevo a ./out
pdflatex prueba.tex                           # Compilo con LaTeX
\end{verbatim}

La instrucci'on \verb+lilypond-book+ crea muchos archivos para preparar el
\verb+.tex+ final que debe compilarse con \LaTeX. La opci'on \verb+--output=out+
indica que estos archivos deben generarse en el directorio \verb+out+.

Ambas compilaciones generan monta'nas de l'ineas de mensajes, es normal.
\end{document}

Archivo ejemplo.ly (es una lástima que no pueda usar el resaltado de sintaxis de LilyPond):

%Archivo ejemplo.ly
\version "2.18.2"
\pointAndClickOff

%#(set-default-paper-size "letter")

%Encabezado
\header {
	title = "Himno Universitario"
	composer = "E. Castellanos"
	poet = "L. Pastori y T. Calatrava"
	tagline = ""
}

%Tonalidad y tempo
global = {
	\key a \major
	\time 4/4
	\partial 4
}

%Sopranos
soprano = \relative c' {
	\clef "treble"
	\autoBeamOff

	e8. a16 | cis4 gis8. b16 a4 gis8. fis16 | e2 cis4
}

%Contraltos
contralto = \relative c' {
	\clef "treble"
	\autoBeamOff

	e8. e16 | e4 e8. eis16 fis4 cis8. b16 | cis2 a4
}

%Tenor
tenor = \relative c' {
	\clef "G_8"
	\autoBeamOff

	e8. d16 | cis4 cis8. cis16 cis4 a8. a16 | a2 e4
}

%Bajo
bajo = \relative c' {
	\clef "bass"
	\autoBeamOff

	cis8. b16 | a4 a8. gis16 fis4 e8. d16 | a2 a4
}

%Letra
letra = \lyricmode {
	Cam -- pe -- si -- no que~es -- tas en la tie -- rra
}

%Partitura
\score {
	<<
		\new ChoirStaff <<
			\new Staff <<
				\override Staff.InstrumentName.self-alignment-X = #RIGHT
				\set Staff.instrumentName = #"Soprano"
				\global \soprano
				\addlyrics \letra
			>>

			\new Staff <<
				\override Staff.InstrumentName.self-alignment-X = #RIGHT
				\set Staff.instrumentName = #"Contralto"
				\global \contralto
				\addlyrics \letra
			>>

			\new Staff <<
				\override Staff.InstrumentName.self-alignment-X = #RIGHT
				\set Staff.instrumentName = #"Tenor"
				\global \tenor
				\addlyrics \letra
			>>

			\new Staff <<
				\override Staff.InstrumentName.self-alignment-X = #RIGHT
				\set Staff.instrumentName = #"Bajo"
				\global \bajo
				\addlyrics \letra
			>>
		>>
	>>

	\layout {}
	\midi {}
}

Y para compilar se ejecutan las siguientes instrucciones desde una terminal abierta en la carpeta donde se encuentran los dos archivos:

lilypond-book --output=out --pdf prueba.lytex # Preparacion
cd out                                        # Me muevo a ./out
pdflatex prueba.tex                           # Compilo con LaTeX

El PDF resultante se encontrará en ./out/prueba.pdf, haz click aquí para ver y descargar el resultado final. De igual manera dejo una vista previa del documento 😀

prueba-page-001prueba-page-002

Juega Doom en Linux con GZDoom

Desde que tengo memoria he jugado Doom, mi papá tenía un diskette de 3½» que venía en una revista informática con un demo del primer episodio: Knee-Deep in the Dead, y sólo jugaba hasta el nivel E1M3: Toxin Refinery porque me daba miedo (jajaja). Cuando tuve el valor pasé ese primer episodio infinidad de veces, luego jugué la versión para PlayStation, después con GZDoom en Windows y ahora lo sigo jugando en Lubuntu con GZDoom, que realmente fue confuso para mi hacerlo funcionar la primera vez, así que comparto por aquí lo sencillo que es y aclarando los pasos que considero importantes.

Existen varios Source-Ports para jugar Doom en casi cualquier plataforma, pero en esta entrada hablaré de GZDoom, es software libre y ofrece algunas mejoras sobre jugabilidad y gráficos (ZDoom ya está descontinuado).

Aquí ofrezco dos opciones para tener GZDoom funcionando en Linux:

  • Descarga los binarios precompilados para sistemas de 64 bits de la versión 3.1pre desde este link, descomprimir, ejecutar el archivo gzdoom y jugar.
  • Compila tú mismo la última versión disponible de GZDoom y de esta manera podrás actualizarlo cuando desees.

Si elegiste la segunda opción puedes copiar el siguiente bloque de código y guardarlo con cualquier nombre y la terminación .sh, darle permisos de ejecución y ejecutarlo, valga la redundancia, desde el directorio que deseas «instalarlo». También puedes ejecutar cada instrucción en orden en una terminal desde una terminal:

# Instala paquetes necesarios para la compilación
sudo apt-get install -y g++ make zlib1g-dev libsdl1.2-dev libsdl2-dev libjpeg-dev \
nasm tar libbz2-dev libgtk-3-dev cmake git libfluidsynth-dev libgme-dev \
libopenal-dev libmpg123-dev libsndfile1-dev timidity libwildmidi-dev \
libgl1-mesa-dev libglew-dev

# Descarga el código fuente del repositorio remoto
git clone git://github.com/coelckers/gzdoom.git

# Crea la carpeta de compilación y nos movemos a ella
mkdir -pv gzdoom/build
cd gzdoom/build

# Variables para la compilación
a='' && [ "$(uname -m)" = x86_64 ] && a=64
c="$(lscpu -p | grep -v '#' | sort -u -t , -k 2,4 | wc -l)" ; [ "$c" = 0 ] && c=1

# Prepara los archivos para la compilación
cmake .. -DCMAKE_BUILD_TYPE=Release

# Inicia el proceso de compilación
make -j$c

El proceso puede llevarse varios minutos dependiendo del equipo, ten paciencia. Una vez finalizado la ubicación del ejecutable será: ./gzdoom/build/gzdoom, es decir, en la carpeta build dentro del directorio donde se descargó el código fuente y se llama gzdoom. Para más detalles sobre la compilación, visita la página oficial (inglés).

Para jugar necesitas los .WAD que serían los juegos, existen muchísimos que no son solamente Doom, pero los principales son estos:

  • DOOM.WAD
  • DOOM2.WAD
  • PLUTONIA.WAD
  • tnt.wad

Puedes descargarlos desde aquí y pegarlos en el mismo directorio donde compilaste GZDoom o en el directorio ~/.config/gzdoom para que sean reconocidos por la aplicación.

Para actualizar sólo ejecuta las siguientes instrucciones dentro de la carpeta donde descargaste el código de GZDoom:

# Actualiza el código
git pull

# Nos movemos a la carpeta de compilación
cd gzdoom/build

# Variables para la compilación
a='' && [ "$(uname -m)" = x86_64 ] && a=64
c="$(lscpu -p | grep -v '#' | sort -u -t , -k 2,4 | wc -l)" ; [ "$c" = 0 ] && c=1

# Prepara los archivos para la compilación
cmake .. -DCMAKE_BUILD_TYPE=Release

# Inicia el proceso de compilación
make -j$c

Y eso es todo, seguramente yo mismo regresaré a leer esta entrada cuando se me olvide alguna parte. Espero que le sirva a otras personas también y se diviertan tanto como yo lo he hecho con Doom.

Ah, y les dejo un ícono .png que pueden usar si hacen un lanzador a la aplicación 😀

icon

GMP en Windows

Estaba aprendiendo a usar Qt haciendo una aplicación que ofrece dos opciones para calcular términos de la sucesión de Fibonacci, una implementación propia en C y la función mpz_fib_ui de la biblioteca GMP. En Lubuntu todo funcionó perfecto, el problema comenzó cuando intenté probar la aplicación en Windows: no tenía las bibliotecas libgmp y libgmpxx precompiladas.

Como nunca las encontré en Internet me dispuse a compilarlas, cosa que no fue tan trivial. Si las vienes buscando puedes descargarlas aquí y ahorrarte mucho tiempo.

Ahora bien, para compilarlas con MinGW necesitamos tener instalados los siguientes paquetes:

  • msys-base
  • msys-m4
  • mingw32-base
  • mingw32-gcc-g++

Y el código fuente de GMP. La última versión disponible para el momento en que escribo esto es la 6.1.2 y es un paquete .lz que puedes descomprimir con 7zip, pero como sé que es molesto he subido el código fuente comprimido en un .zip aquí. De cualquier modo recomiendo mover la carpeta a la raíz del disco duro, de manera que los archivos se encuentren en  C:\gmp-6.1.2. Por otro lado, supondré que MinGW está instalado en la ubicación por defecto C:\MinGW.

Una vez tenemos todo preparado podemos comenzar:

  1. Todo el proceso se realizará con MSYS, una shell con una colección de herramientas de UNIX, por defecto se encuentra en C:\MinGW\msys\1.0\bin\msys.bat. Podemos iniciarlo desde el explorador haciendo doble click o desde el símbolo del sistema de Windows.
  2. Una vez iniciado MSYS, nos dirigimos a la carpeta donde se encuentra el código fuente de GMP, para nuestro caso sería:
    cd /c/gmp-6.1.2
    
  3. Una vez en el directorio podemos configurar la compilación, para esto debemos escribir:
    ./configure --prefix=/c/gmp-6.1.2/release --build= --enable-cxx --with-gnu-ld
    

    El proceso puede tardar un poco dependiendo del equipo. Las opción --prefix indica que queremos que el resultado de la compilación, las bibliotecas y cabeceras, se guarden en C:\gmp-6.1.2\release y con --build indicamos parámetros de compilación, como --enable-cxx que permite compilar la biblioteca para C++ y --with-gnu-ld que habilita el enlace con ld.
    La configuración anterior genera bibliotecas estáticas, si queremos obtener bibliotecas dinámicas lo indicamos de la siguiente manera:

    ./configure --prefix=/c/gmp-6.1.2/release --build= --enable-cxx --with-gnu-ld --disable-static
    

    Si todo ha salido bien y no hay errores, al final de todo se mostrará un resumen de la configuración.

  4. Una vez configuramos comenzamos la compilación simplemente escribiendo:
    make
    

    Si la configuración tardó, la compilación va a tardar mucho más. Aquí sólo debemos esperar a que se termine la cascada de caracteres.

  5. Finalmente «instalaremos» las bibliotecas de GMP en la ubicación indicada:
    make install
    

    Debemos esperar otra vez a que termine el proceso y deberíamos encontrar dentro de C:\gmp-6.1.2\release tres carpetas:

    • include: con las cabeceras gmp.h y gmpxx.h
    • lib: con las bibliotecas libgmp.a y libgmpxx.a si se han compilado estáticas
    • share\info: documentación

Haciendo un recuento, sólo en tres líneas y con paciencia podemos compilar las librerías:

./configure --prefix=/c/gmp-6.1.2/release --build= --enable-cxx --with-gnu-ld
make
make install

Y eso es todo, algo incómodo y que lleva tiempo pero realmente satisfactorio cuando finalmente se logra y podemos usar el poder de la precisión arbitraria de GMP en nuestras aplicaciones 😀

Conectarse a espacio de trabajo en Codenvy vía SSH

Conectarse a un espacio de trabajo en Codenvy es mucho más sencillo de lo que parece, aunque siempre es bueno dejar claro como se hacen las cosas para evitar confusiones.

Afortunadamente Codenvy nos facilita la información que necesitamos, como la clave privada que se encuentra en la pestaña SSH del espacio de trabajo al que queremos conectarnos. Al hacer click en el botón del porta papeles que está a la derecha se copia la clave privada que se debe pegar y guardar en un archivo de texto plano, yo lo he dejado en ~/.shh/codenvy_key pero puede guardarse en cualquier ubicación con cualquier nombre. Ahora queda indicarle al SSH que se agregará la clave privada, pero antes hay que asegurarse de que la permisología del archivo se encuentre en lectura y escritura sólo para el usuario y en nadie para la ejecución, una vez configurado agregamos la clave privada desde la terminal:

sudo chmod 600 ~/.ssh/codenvy_key # Modifica la permisología
ssh-add ~/.ssh/codenvy_key        # Agrega la clave privada

Y con esto es suficiente para conectarnos al espacio de trabajo, para esto necesitamos la dirección y el puerto. Esta información se encuentra abriendo el espacio de trabajo y haciendo click en la opción SSH del panel Processes (las letras son pequeñas, están a la izquierda del panel). Aquí se despliega las instrucciones para conectarnos dependiendo del sistema operativo, así que en linux basta con ejecutar en la terminal la línea que indica sin la parte que está en corchetes, porque ya hemos agregado la clave privada:

ssh user@node<n>.codenvy.io -p <port>

Donde <n> y <port> es el nodo y el puerto respectivamente, valores que cambian cada ve que se inicia el espacio de trabajo.

A pesar de que me gusta trabajar con la terminal, me parece más cómodo acceder desde el explorador de archivos usando el protocolo SFTP y acceder a los directorios y ficheros como si se encontraran localmente en mi equipo. Para esto basta con escribir sftp://user@node<n>.codenvy.io:<port> en la barra de direcciones.

Siempre hay que recordar que el espacio de trabajo debe estar corriendo, si pasa un tiempo considerable sin actividad se apaga automáticamente y habría que arrancarlo nuevamente para poder conectarse.

Doble indicación de compás con LilyPond

Realmente desconozco el nombre técnico de esto, sucede que he visto algunas partituras, en especial de música venezolana donde la indicación de compás no es un simple 3/4 o 5/8. Lo que he visto con más frecuencia son compases que indican 3/4 y al lado, en paréntesis (6/8).

Para escribir esta entrada lo llamaré doble indicación de compás, aquí dejo un ejemplo por si no se entiende bien lo que intento decir:

2017-06-16_10.48.21

Éste es el famoso joropo de Moleiro que me dispuse a aprender. La partitura la encontré aquí y como me parecía poco legible decidí transcribirla y aprovechando la oportunidad decidí hacerlo con LilyPond, ya que desde hace algún tiempo tenía la intriga de saber como se usaba.

No había escrito la primera nota cuando me encontré con un gran problema; ¡no sabía como escribir esas indicaciones de compás!. Me llevó mucho tiempo saber la manera de hacerlo porque no encontraba ningún lugar donde lo explicara claramente. Finalmente la hallé, LilyPond usa el lenguaje de programación Scheme para ciertas cosas, una de ellas es hacer funciones personalizadas y es justamente eso lo que se necesita para lograr estas dobles indicaciones de compás.

Aquí dejo el código:

\version "2.18.0"
\pointAndClickOff

#(set-default-paper-size "letter")

%Función para doble indicación de compás
#(define ((doubleTimeSignature a b c d) grob)
	(grob-interpret-markup grob
		(markup #:override '(baseline-skip . 1.5)
			#:number (#:line ((#:center-column (a b)) (#:center-column (c d)))))))

%Función para doble indicación de compás con paréntesis
#(define ((doubleTimeSignatureParenthesis a b c d) grob)
	(grob-interpret-markup grob
		(markup #:override '(baseline-skip . 1.5)
			#:number (#:line ((#:center-column (a b)) #:vcenter "(" (#:center-column (c d)) #:vcenter ")" )))))

\header {
	title = "Ejemplo"
	composer = "Erick Rincones"
	tagline = ""
}

music = \relative c' {
	\clef treble
	\key d \minor

	%Uso de la doble indicación de compás
	\override Score.TimeSignature.stencil = #(doubleTimeSignature "3" "8" "6" "16")
	\time 3/8

	\autoBeamOff
	f'16 f8 e16 e8 |
	d d4 |
	cis16 a8 a16 a8 |
	a4. | \bar "|." \break

	%Uso de la doble indicación de compás con paréntesis
	\override Score.TimeSignature.stencil = #(doubleTimeSignatureParenthesis "3" "4" "6" "8")
	\time 3/4

	f8 f4 e8 e4 |
	e d d |
	cis8 a4 a8 a4 |
	a2. | \bar "|."
}

\score {
	\new Staff = "music" \music

	\layout { }
	\midi { }
}

Y el resultado es este:

2017-06-16_21.00.20

Si ya has trabajado con LilyPond es cuestión de copiar y pegar. Aún así trataré de explicar lo mejor que pueda cómo se usa.

En las líneas 7 y 13 se encuentran definidas las funciones para doble indicación de compás, sin paréntesis y con paréntesis respectivamente. No es necesario entender a profundidad qué hacen si no deseas modificarlas, pero básicamente toma cuatro parámetros que son los cuatro números a mostrar y los organiza en forma de dos columnas centradas en una sola línea, la diferencia entre cada función es simplemente los paréntesis.

Una vez definidas nuestras funciones podemos usarlas cuando y como nos plazca. Para escribir el primer sistema se ha usado la función de la indicación de compás sin paréntesis, en la línea 29 se indica que va a reemplazarse la indicación de compás predeterminada que colocaría LilyPond por el formato que indica la función doubleTimeSignature (que es la nuestra) y se escriben los cuatro parámetros, pero en la siguiente línea debe indicarse realmente el compás en que se va a escribir la música para que puedan colocarse las barras de compás y todo lo demás. En este caso bien podemos escribir 3/8 o 6/16 pero yo me he quedado con la primera opción.

Si se desea cambiar de compás el procedimiento es el mismo. En la línea 39 se hace el cambio usando la función doubleTimeSignatureParenthesis, fíjense como el funcionamiento de la indicación de compás es exactamente igual a la que usaría LilyPond por defecto, sólo que ha sido cambiada por el formato que hemos indicado.

Espero que esto sirva a alguien más alguna vez 😀

Configurar teclado XKB

Casi nunca le había prestado atención a la configuración del teclado, hasta que compré una laptop que tiene el teclado en inglés y suceden los conflictos. Cuando configuro el teclado como si estuviera en español latino hay símbolos que simplemente no puedo usar como  < y >, sumamente importante al momento de programar, pero si configuro el teclado en inglés no puedo colocar acentos.

En un sistema con entorno de escritorio se puede configurar el teclado desde una interfaz gráfica, pero en Debian Standard por ejemplo, hay que modificar el archivo de modificación /etc/default/keyboard. Este el archivo modificado en una máquina virtual con Debian Jessie para trabajar con el teclado en inglés y español

# KEYBOARD CONFIGURATION FILE

# Consult the keyboard(5) manual page.

XKBMODEL="pc105"
XKBLAYOUT="latam, us"
XKBVARIANT=""
XKBOPTIONS="grp:shift_caps_toggle"

BACKSPACE="guess"

Las opciones más importantes son XKBLAYOUT que son los idiomas del teclado y XKBOPTIONS que es el atajo en el teclado para cambiar de un idioma a otro. Para este archivo los idiomas son español latino e inglés y el atajo para cambiar de idioma es Shift + Bloq Mayús.

Generalmente no es necesario modificar algo más, pero en el caso que se requiera, en el manual de XKEYBOARD-CONFIG pueden verse el resto de las opciones posibles.

Crear ISO con mkisofs

Lo que más me gusta de Linux es tiene a nuestra disposición muchas herramientas, tantas que a veces ni sabemos que existen.

Algo que generalmente necesito mucho es crear imágenes ISO a partir de archivos que tengo en el equipo, por ejemplo para transferir archivos a una máquina virtual de VirtualBox que no soporte Guest Additions, y una sola instrucción es suficiente para realizar esto gracias a mkisofs:

mkisofs -o  imagen.iso  -allow-limited-size  /carpeta

mkisofs maneja direcciones relativas y las opciones son muy intuitivas:

  • -o: indica el archivo de destino, sólo hay que cambiar imagen.iso por el nombre que desees, siempre con la terminación .iso
  • -allow-limited-size: es necesario sólo si se desea crear archivos mayores a 4GB
  • /carpeta: indica la ruta donde se encuentran los archivos que se van a incluir dentro de la imagen iso.

Existe un montón de opciones más, pero para los mortales como yo, con esto es suficiente.

Los namespace

Cuando comencé a programar en C++ siempre decían: «coloquen using napespace std, aunque eso no es tan recomentable, pero para lo que vamos a usar no importa. Después van a aprender para qué sirve», y era extremadamente desesperante para mí no saber qué era o por qué se colocaba esto.

Efectivamente más adelante aprendí por mi cuenta de qué se trataba y no es ningún misterio, incluso es bonito y ayuda mucho. Lo importante es conocer que es un namespace, y como lo dice su traducción a español es un «espacio con nombre». Su importancia se nota más en proyectos grandes donde trabajan muchos programadores y se usan diferentes archivos fuente, ya que es muy probable que dos personas usen la misma palabra para denotar una clase o una función entonces vienen los namespace a salvarle la vida a todos, simplemente agrupan éstos símbolos (clases, funciones, variables) en «espacios con nombre», así puede haber la misma palabra para identificar varios diferentes pero indicando su namespacese puede referir a uno específicamente.

Resumiendo, es como una versión mejorada y con mayor seguridad que el uso de macros para evitar coincidencias como se hace en C, pero creo que con un ejemplo todo se ve más fácil. Imaginemos que tenemos dos archivos cabecera: variables.h y constantes.h que vamos a usar en el código principal.

//Archivo cabecera: variables.h
namespace variable {
    int x;
    int y;
}
//Archivo cabecera: constantes.h
namespace constante {
    const int x = 1;
    const int z = 2;
}

Vemos que en ambos archivos se encuentran declaradas distintos símbolos con los mismos nombres, pero nótese cómo éstos están dentro de un namespace diferente. Si queremos usar cualquiera de estos símbolos hay que específicar a cuál namespace pertenece y esto es muy sencillo.

//Archivo principal: main.cpp
#include "variables.h"
#include "constantes.h"

int main () {
    int a = constante::z;
    variable::x = a + constante::x;
    variable::y = 21;

    return 0;
}

No está de más decir que los namespace deben tener nombres diferentes y dentro de cada uno no pueden repetirse los mismos símbolos.

Muy bonito, pero ¿qué siginifica using namespace std?

El namespace std es el espacio con nombre estándar y es donde se encuentran las funciones y clases que trae integradas C++. La palabra reservada using incorpora «algo» con lo que vamos a trabajar, esto puede ser todo un namespace completo o sólo una variable. Entonces cuando escribimos using napespace std, el compilador sumirá que estamos trabajando con el espacio global (todo lo que está fuera de cualquier namespace) y el namespace std así que no hay que anteponer std:: por ejemplo antes de cout para imprimir por pantalla.

Nos dicen que no es recomentable o peligroso porque si incluímos namespaces a la ligera puede haber coincidendias donde existan dos símbolos iguales en namespaces diferentes, entonces el compilador no sabrá cuál usar, así en el ejemplo anterior si se escribe using namespace variable, using namespace constante en el código principal y en una expresión se usa cualquiera de los símbolos declarados en ambos namespaces, aparecerá un fastidioso error de compilación. Viendolo de un punto de vista muy estricto es tonto hacer using namespace std porque el namespace pierde sentido: ¿para qué voy a agrupar un conjunto de símbolos si al final se usarán junto al espacio global?.

En fin, es cuestión de gusto, comodidad o forma de trabajo. Como puede verse en este último ejemplo, se puede jugar con las instrucciones de diferentes maneras.

//Archivo principal: main.cpp
#include "variables.h"
#include "constantes.h"
#include <iostream>
using namespace constante;
using variable::y;
using std::endl;

int main () {
    int a = y;
    variable::x = a + z;
    y = 21 - x;

    std::cout << "Valor de a: " << a << endl;
    std::cout << "Valor de variable::x: " << variable::x << endl;
    std::cout << "Valor de variable::y: " << y << endl;
    std::cout << "Valor de constante::x: " << x << endl;
    std::cout << "Valor de constante::z: " << z << endl;

    return 0;
}

Plantilla LaTeX

Me gusta mucho \LaTeX y lo uso cada vez que puedo. Sea lo que sea que vaya a hacer hay un conjunto de paquetes que obligatoriamente incluyo en todos los documentos y es mi plantilla predeterminada para trabajar. A partir de esta comienzo el trabajo y si es necesario agrego los paquetes que me hagan falta.

\documentclass{article}

\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage[spanish,activeacute]{babel}
\usepackage{mathtools}

\title{T\'itulo}
\author{Erick Rincones}
\date{\today}

\begin{document}
\maketitle

Contenido del documento
\end{document}

Los dos primeros paquetes: lmodern y fontenc con la opción T1 mejoran el manejo del archivo PDF final, da soporte a caracteres vectoriales acentuados y ayuda mucho al momento de copiar el texto desde un visor como Adobe Reader.

El tercer paquete indica el idioma en el que se está escribiendo el documento, y tiene una opción muy importante: activeacute, que permite escribir acentos sin la barra invertida y usar únicamente la comilla simple. Así que para usar el caracter á basta con escribir 'a.

Se puede usar el paquete inputec con la opción utf8 que permite el uso de caracteres unicode directamente, es mucho más cómo de escribir pero resulta un problema cuando se abre el código en un sistema distinto de donde fue creado, ya que si no usan la misma página de códigos los caracteres especiales se modifican y es un verdadero dolor de cabeza.

El último paquete que siempre incluyo es mathtools y es lo más bonito de \LaTeX, pues te permite escribir todas esas fórmulas mátematicas con ese formato tan limpio que tanto nos gusta.

Las siguientes opciones sirven para crear el título automáticamente, es bastante intuitivo. Lo único que hay que tener en cuenta es que el la opción activeacute no funciona hasta que se declara el inicio del cuerpo del documento, así que hay que usar la barra invertida para colorcar acentos en cualquiera de estos campos.

Finalmente inicio el cuerpo del documento, uso \maketitle para colocar el título automáticamente y comenzar con la parte divertida: escribir el contenido.