Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

viernes, 25 de mayo de 2018

Beamer: Error "Missign $ insert" al dejar líneas en blanco dentro de las etiquetas para ecuaciones

Tengo el siguiente archivo en Latex el cual estaba editando en Texmaker:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Beamer Presentation
% LaTeX Template
% Version 1.0 (10/11/12)
%
% This template has been downloaded from:
% http://www.LaTeXTemplates.com
%
% License:
% CC BY-NC-SA 3.0 (http://creativecommons.org/licenses/by-nc-sa/3.0/)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\documentclass{beamer}
\mode {
\usetheme{Madrid}
}

\usepackage[utf8]{inputenc}
\usepackage{graphicx} % Allows including images
\usepackage{booktabs} % Allows the use of \toprule, \midrule and \bottomrule in tables
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{geometry}

\title[Sample1]{This is a sample Title}
\author{Y0} % Your name
\institute[LOL] % Your institution as it will appear on the bottom of every slide, may be shorthand to save space
{
LOL University \\ % Your institution for the title page
\medskip
\textit{mail@mail.com} % Your email address
}
\date{\today} % Date, can be changed to a custom date

\begin{document}
\begin{frame}
\frametitle{A Title}
Texto texto texto

\[
\frac{\partial u}{\partial t} + \frac{\partial^{2}u}{\partial x^{2}}
\]

\begin{equation}
f_{i} + \sum\limits_{k=k_{min}}^{k=k_{max}} a_k f_{i+k}
\end{equation}

\begin{align}
f_{i} + \sum\limits_{k=k_{min}}^{k=k_{max}} a_k f_{i+k}
\end{align}

\end{frame}
\end{document}


Y mientras lo editaba, de pronto el compilador de latex empezó a protestar con el error "Missign $ insert". Aprentemente el documento no tenían errores. Me tomó buen rato encontrar que se generaba con las líneas en blanco que había dejaado donde latex no las admite.

Para generar el error "Missign $ insert" se deben dejar líneas en blanco en las siguientes secciones (las que contienen ecuaciones):


He aquí el error:



Esto es discutido en los foros de Latex desde hace tiempo, y hasta ahora no parece haber solución más que eliminar todas las líneas en blanco entre las etiquedas que usen modo matemático.

viernes, 20 de abril de 2018

Cómo darle privilegios de sudo a un usuario en Centos 7

Esto es un resumen de 5 páginas web que explicaban cómo darle privilegios de sudo a un usuario con la terminal, a qué grupo añadirlo (no hay grupo "sudo" o "sudoers" en Centos) y cómo trabajar con el visudo, el editor que nos permitirá modificar los privilegios sin que haya condiciones de carrera con otros usuarios logueados.

En Centos, el grupo equivalente al "sudoers" es "wheel". Tengo un usuario llamado "pc" el cual quiero que pueda ejecutar comandos de "sudo", pero en mi instalación de Centos por defecto "pc" no tiene privilegios, y tampoco los tiene el grupo "wheels".

Para empezar a dar privilegios, primero hay que loguearse en la terminal como root con el comando su root, y luego ejecutar visudo:




Una vez dentro del visudo, con las teclas del cursos buscamos la línea donde dice "allows people in group wheel to run all commands", la siguiente línea es la que le da privilegios al grupo "wheel". Si empieza con el caracter #, está comentada y debemos borrarlo:



 Yo prefiero ir hasta el final del archivo para guardar y salir, esto se hace con el comando :wq



Luego se ejecuta el comando usermod -aG wheel pc el cual añadirá el usuario "pc" al grupo wheel:


Y eso es todo! Si el usuario sigue sin poder ejecutar comandos de sudo se debe reiniciar el sistema.
Lo he probado en Centos 7, pero también debería funcionar en Centos 6.

sábado, 31 de marzo de 2018

Generar archivos .pyc en Python para Windows

La pregunta original la hice aquí.

En python 2.7 genero mis archivos .pyc con esta línea:

python -m compileall C:\una_ruta\myscript.py

y hasta me hice un script para compilar todos los archivos .py en una carpeta determinada:

import sys;
import subprocess;
from os import listdir
from os.path import isfile, join

[subprocess.call('python -m compileall ' + p, shell=True) for p in listdir('
D:\una_ruta') if isfile(join('D:\una_ruta', p)) and p.endswith('.py')]

Esto no funciona en Python 2.6. En python 2.6 los genero con:

C:\Python26\python -m py_compile C:\una_ruta\myscript.py

El script para compilar todos los archivos .py en una carpeta determinada sería:

import sys;
import subprocess;
from os import listdir
from os.path import isfile, join

[subprocess.call('C:\Python26\python -m py_compile ' + p, shell=True) for p in listdir('
D:\una_ruta') if isfile(join('D:\una_ruta', p)) and p.endswith('.py')]


En este enlace, explican qué significa Shell=True y en la documentación advierten sobre su uso.

domingo, 28 de enero de 2018

Abrir y pasarle parámetros a una ventana secundaria desde Java swing en Netbeans

Lo que se necesita en esta ocasión es que al presionar un botón de una ventana en Java Swing, se abra una ventana secundaria una sola vez sin importar cuántas veces se presione el botón, que al cerrar sólo la ventana secundaria la ventana pricipal continúe ejecutandose, y que ambas ventanas se cierren y el programa finalice al cerrar la ventana principal. Además tengo que pasarle parámetros desde la ventana principal a la ventana secundaria al abrirse ésta:


Hacerlo es bastante fácil, se deben crear dos ventanas, la principal frmMain y la secundaria frmOther, ambas del tipo JFrame:


En la ventana principal se declara a nivel de clase:

frmOther formOther;

Y en el listener del botón que abre la ventana secundaria se ingresa el siguiente código:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)                                        
{                                            
    if (formOther == null || !formOther.isVisible())
    {
        formOther = new frmOther("Nuevo ", "Título");
        formOther.setVisible(true);
    }
    else
        formOther.setExtendedState(JFrame.NORMAL);
}  


En este caso la ventana secundaria recibe dos parámetros tipo String, pero se puede hacer que reciba cualquier cantidad  y tipo de parámetros, para esto basta sobrecargar el constructor en la clase de la ventana secundaria (en este caso sólo voy a cambiar el título):

public frmOther(String param1, String param2)
{
    initComponents();
    this.setTitle(param1 + param2);
}


Por último, en la propiedad DefaultCloseOperation  de la ventana secundaria se escoge DISPOSE.



Y eso es todo!
El proyecto en Netbeans 8.0.2 se puede descargar de aquí.

martes, 31 de octubre de 2017

Script en Inno Setup no crea accesos directos en el Menú de inicio

Esto me sucedió en Wndows 7 SP1 x64, al querer crear accesos directos a mi aplicación desde su instalador creado en InnoSetup, éstos no aparecían en el menú de inicio. El código en Inno Setup es:

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}"


El motivo me lo dió esta respuesta en StackOverflow:

"Aparentemente, Windows 7 no mostrará las carpetas de inicio si tienes muchas en tu carpeta "All Users", fui a la ruta y borré algunos links a programas que casi no uso y voilá, mi grupo en el menú inicio apareció."

Estúpido Windows 7 me hizo perder una hora por esto...

lunes, 28 de agosto de 2017

Cómo poner la sección "Referencias" en español en Latex

Tengo un archivo tex con la siguiente estructura:

\documentclass[11pt]{article} 
\usepackage{amsfonts} 
\usepackage{amsmath}

\usepackage{amssymb}
\usepackage{graphicx}

\usepackage{geometry}

\usepackage{hyperref}

\usepackage{enumerate}

\setcounter{MaxMatrixCols}{30}

\providecommand{\U}[1]{\protect\rule{.1in}{.1in}}
\providecommand{\U}[1]{\protect\rule{.1in}{.1in}}
\geometry{lmargin=2.0cm,rmargin=1.8cm,headheight=16pt,bmargin=2cm}

\renewcommand{\baselinestretch}{1.1}


\usepackage[utf8]{inputenc}
\newenvironment{proof}[1][Proof]{\noindent\textbf{#1.} }{\ \rule{0.5em}{0.5em}}
\begin{document} 
 

\title{Plan de tesis yay!}
\author{Yo}

\maketitle


\section{Objetivos}
 

Los Objetivos van aquí.
 

\section{Objetivos específicos}
 

\begin{enumerate}[{Objetivo} 1.]
\item Citar \cite{book}.
\item Ya no citar \cite{book}
\end{enumerate}


\begin{thebibliography}{22}

\bibitem{book} A Book

\end{thebibliography}
\end{document}
 
Al compilarlo en TexMaker, resulta esto:

Quiero que la sección "Referencias" aparezca en español. Siguiendo este tutorial, descubrí que en mi caso es muy fácil: basta añadir al preámbulo la siguiente línea:

\usepackage[spanish]{babel}

El resultado es:


Y de paso también arregla el formato de fecha :D

martes, 25 de julio de 2017

Windows: Cómo setear la versión de Java predeterminada (y sin tocar el registro)

Tengo una pc con Windows 7 x64 con Java JDK 7 y Java JDK 8.

Para saber qué versión de Java se usa por defecto se debe abrir la consola (cmd) y ejecutar:

java -version

Cuando instalé Java 8, el instalador seteó el sistema para que por defecto los jars se ejecutaran con Java 8, pero un día necesité probarlos en Java 7. Para cambiar la versión de java predeterminada se debe hacer lo siguiente:

1. Ir a Configuración Avanzada del Sistema -> Variables de Entorno.

2. Ubicar la variable PATH. Antes que nada, Java busca en esta variable la carpeta donde está instalado su runtime. En mi caso, la variable se veía así:

C:\ProgramData\Oracle\Java\javapath;C:\Windows\System32;C:\Program Files\Java\jdk1.8.0_121\bin;

En la carpeta C:\ProgramData\Oracle\Java\javapath; hay 3 simlinks que no se pueden editar y que direccionan a la carpeta de instalación de Java 8. Estos Simlinks se deben cortar y copiar a otra ubicación (esto es para poder restaurarlos después).

3. Se borran las rutas a C:\ProgramData\Oracle\Java\javapath; y al runtime de Java que no se desea, y se añade la ruta del runtime de Java que sí se desea. En mi caso la variable Path queda como:

C:\Windows\System32;C:\Program Files\Java\jdk1.7.0_21\bin;

4. Setear las variables JAVA_HOME y JRE_HOME al runtime de Java deseado:

JRE_HOME: C:\Program Files\Java\jdk1.7.0_21\jre
JAVA_HOME: C:\Program Files\Java\jdk1.7.0_21

Si lo que se desea es redireccionar al JRE y no al JDK sólo hasta cambiar la ruta C:\Program Files\Java\jdk1.7.xxx por C:\Program Files\Java\jre1.7.xxx

Si al ejecutar el comando java -version sigue apareciendo el java anterior a los cambios, basta reiniciar el sistema.

viernes, 23 de junio de 2017

Excepción no controlada del tipo 'System.Configuration.ConfigurationErrorsException' en System.Configuration.dll

Esta excepción me saltó en un proyecto de C# compilado en Visual Studio Express 2013, el cual tiene configurado un un archivo .Settings. Inicialmente Visual Studio me puso el proyecto para .Net 4, yo lo cambié a .Net 3.5, y luego lo volví a cambiar a .Net 4, y luego de vuelta a .Net 3.5
Y cuando intenté depurarlo saltó la excepción:

Excepción no controlada del tipo 'System.Configuration.ConfigurationErrorsException' en System.Configuration.dll

Información adicional: Se ha producido un error al crear el controlador de sección de configuración para userSettings/miApp.Settings1: No se puede cargar el archivo o ensamblado 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' ni una de sus dependencias. El sistema no puede encontrar el archivo especificado.



Luego de rebuscar, mirar y furstrarme un rato, hallé el origen del problema.
El archivo App.Config:


       
Para .Net 4 la versión es 4.0.0.0. Para .Net 3.5 debe ser 2.0.0.0. Sólo debí cambiar a la versión correcta para corregir la excepción.
       

miércoles, 17 de mayo de 2017

Instalar nautilus-open-terminal en Centos 6 y Ubuntu 14.04

Uno de los problemas que tengo con Centos 6 y Ubuntu 14 es que el menú secundario del Nautilus no tiene la opción de ejecutar la terminal en la carpeta que se tiene abierta. Luego de una intensa investigación (5 minutos en google) encontré los comandos para instalar el paquete nautilus-open-terminal. Para no tener que memorizarlos, escribí un par de scripts en python para que los instalaran por mí.

Script para Centos 6:

# coding=utf-8
import subprocess;
import shlex

def main():
    subprocess.call(shlex.split('yum install nautilus-open-terminal'))
    subprocess.call(shlex.split('killall nautilus'))

if __name__ == "__main__":
    main()



Script para Ubuntu 14:

# coding=utf-8
import subprocess;
import shlex

def main():
    subprocess.call(shlex.split('sudo apt-get install nautilus-open-terminal'))
    subprocess.call(shlex.split('killall nautilus'))

if __name__ == "__main__":
    main()


Para ejecutar estos comandos se deben guardar en un archivo con extensión .py, abrir la terminal con un usuario sudo y ejecutar el comando:

python script_para_instalar_open_terminal.py

domingo, 16 de abril de 2017

Error de Lyx: "No se puede encontrar un comando Latex para el caracter '-' "

Estaba copiando el siguiente texto desde un pdf a un documento de Lyx (versión 2.1.4):

αfi−1+fi +αfi+1=bfi+2−2fi+fi−24h 2 +a fi+1−2fi+fi−1 h

y luego de acomodarlo para que lyx pudiera interpretar las ecuaciones:

$$\alpha f'\textsubscript{i−1} + f'\textsubscript{i} +\alpha f'\textsubscript{i+1} = b(f\textsubscript{i+2} − f\textsubscript{i−2})/4h + a(f\textsubscript{i+1}−f\textsubscript{i−1})/2h$$

$$\beta f'\textsubscript{i−2} + \alpha f'\textsubscript{i−1} + f'\textsubscript{i} +\alpha f'\textsubscript{i+1} + \beta f'\textsubscript{i+2} = c(f_{i+3} − f\textsubscript{i−3})/6h + b(f\textsubscript{i+2} − f\textsubscript{i−2})/4h + a(f\textsubscript{i+1}−f\textsubscript{i−1})/2h$$



Lyx me tiraba este error:

Error de Lyx: "No se puede encontrar un comando Latex para el caracter '-' (código 0x)2212".


Agregarle al preámbulo

\usepackage{amsmath}
\usepackage{amssymb}

o cambiar el idioma a español o importar más módulos no solucionaron el problema. La solución la hallé en este link. Al copiar desde el pdf estaba también copiando un guión, no un signo menos. Tuve que reemplazar todos los guiones por los signos menos de mi teclado.
Y descubrí que no es necesario usar \textsubscript, se puede reemplazar con un guíon largo _. Mis ecuaciones finalmente quedan:

$$\alpha f'_{i-1}  + f'_{i} + \alpha f'_{i+1} = b(f_{i+2} - f_{i-2})/4h +a(f_{i+1} - f_{i-1})/2h$$

$$\beta f'_{i-2} + f'_{i-1} + f'_{i} +\alpha f'_{i+1} + \beta f'_{i+2} =c(f_{i+3} - f_{i-3})/6h + b(f_{i+2} - f_{i-2})/4h + a(f_{i+1}-f_{i-1})/2h$$