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.
Códigos de ejemplo para aprender distintas tecnologías, o lo que sucede cuando a una cuarentona se la deja sola con una computadora
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 :)
martes, 25 de julio de 2017
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.
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
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:
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$$
α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}
$$\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$$
sábado, 1 de abril de 2017
System.IO.StreamWriter lanza una System.UnauthorizedAccessException
Estuve testeando el siguiente código:
using (System.IO.StreamWriter file = new System.IO.StreamWriter(Path_to_Folder, true))
{
file.WriteLine("I'm a line to write");
}
Y me lanzaba una System.UnauthorizedAccessException.
Esta excepción no sólo salta al intentar acceder a una carpeta protegida, también sale cuando Path_to_Folder apunta a una carpeta, no a un archivo. El código correcto es:
using (System.IO.StreamWriter file = new System.IO.StreamWriter((Path.Combine(Path_to_Folder, "a_file"), true))
{
file.WriteLine("I'm a line to write");
}
using (System.IO.StreamWriter file = new System.IO.StreamWriter(Path_to_Folder, true))
{
file.WriteLine("I'm a line to write");
}
Y me lanzaba una System.UnauthorizedAccessException.
Esta excepción no sólo salta al intentar acceder a una carpeta protegida, también sale cuando Path_to_Folder apunta a una carpeta, no a un archivo. El código correcto es:
using (System.IO.StreamWriter file = new System.IO.StreamWriter((Path.Combine(Path_to_Folder, "a_file"), true))
{
file.WriteLine("I'm a line to write");
}
sábado, 11 de febrero de 2017
Diferencias de la función map entre Python 2.7 y Python 3.4
Tengo el siguiente código que elimina los duplicados en una lista:
list1 = [1, 1, 1, 3, 3, 3, 56, 6, 6, 6, 7]
list2 = []
map(lambda x: not x in list2 and list2.append(x), list1)
print(list2)
list2 = []
[list2.append(c) for c in list1 if c not in list2]
print(list2)
list2 = []
for c in list1:
if c not in list2:
list2.append(c)
print(list2)
En Python 2.7 imprime:
[1, 3, 56, 6, 7]
[1, 3, 56, 6, 7]
[1, 3, 56, 6, 7]
En Python 3.4 imprime:
[]
[1, 3, 56, 6, 7]
[1, 3, 56, 6, 7]
La función map no devuelve una lista en Python 3.4, devuelve un iterable el cual (al igual que los Enumerables en C#) no produce resultados hasta que se consume. Si se quieren los resultados de la función map en una lista en Python 3.4, se debe hacer:
list(map(lambda x: not x in list2 and list2.append(x), list1))
Más información en la pregunta que hice en StackOverflow:
http://es.stackoverflow.com/a/47861 en español
http://stackoverflow.com/a/42043141 en inglés
list1 = [1, 1, 1, 3, 3, 3, 56, 6, 6, 6, 7]
list2 = []
map(lambda x: not x in list2 and list2.append(x), list1)
print(list2)
list2 = []
[list2.append(c) for c in list1 if c not in list2]
print(list2)
list2 = []
for c in list1:
if c not in list2:
list2.append(c)
print(list2)
En Python 2.7 imprime:
[1, 3, 56, 6, 7]
[1, 3, 56, 6, 7]
[1, 3, 56, 6, 7]
En Python 3.4 imprime:
[]
[1, 3, 56, 6, 7]
[1, 3, 56, 6, 7]
La función map no devuelve una lista en Python 3.4, devuelve un iterable el cual (al igual que los Enumerables en C#) no produce resultados hasta que se consume. Si se quieren los resultados de la función map en una lista en Python 3.4, se debe hacer:
list(map(lambda x: not x in list2 and list2.append(x), list1))
Más información en la pregunta que hice en StackOverflow:
http://es.stackoverflow.com/a/47861 en español
http://stackoverflow.com/a/42043141 en inglés
sábado, 7 de enero de 2017
Oracle 11g: Contraseña del usuario system ha expirado
Por defecto, Oracle le pone fecha de expiración a las contraseñas de los usuarios, incluyendo al usuario system. Para poder cambiar la contraseña hay que seguir las instrucciones de esta respuesta en StackOverflow, pero le falta un paso: ingresar el comando connect al inicio, esto hará que el Oracle nos pida cambiar la contraseña:
Y eso es todo!
sábado, 10 de diciembre de 2016
Reemplazando subcadenas dentro de archivos de texto con Python
Sucede que tenía varios archivos de Inno Setup Script en una carpeta, los cuales apuntaban a archivos en otra carpeta que correspondían a los instaladores de distintas versiones de una aplicación (e incluso distintas versiones del mismo instalador), por lo que las rutas a los archivos dentro de los scripts eran rutas absolutas. Un día, al actualizar los códigos fuente y los compilados tuve que ponerlos en una nueva carpeta, y esto significada actualizar todas las rutas absolutas en los scripts de Inno Setup.
El siguiente ejemplo muestra cómo se ven mis scripts de Inno Setup, en la realidad incluyen muchos muchos más archivos (tomado de los ejemplos que vienen con el Inno Setup):
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
Compression=lzma2
SolidCompression=yes
OutputDir=D:\Generated Installers\
[Files]
Source: "D:\compiled_2014\MyProg.exe"; DestDir: "{app}"
Source: "D:\compiled_2014\MyProg.chm"; DestDir: "{app}"
Source: "D:\compiled_2014\Readme.txt"; DestDir: "{app}"; Flags: isreadme
[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Para evitar tener que hacer el cambio de rutas a mano, me creé este script en Python:
import os
import sys
iss = [c for c in os.listdir(sys.path[0]) if ".iss" in c]
for i in iss:
fopen = open(i,'r')
fwrite = []
flines = fopen.readlines()
fopen.close()
for line in flines:
fwrite.append(line.replace("D:\compiled_2014", "F:\compiled_Octubre_2016"))
fopen = open(i,'w')
fopen.writelines(fwrite)
fopen.close()
Lo que hace este script en Python es reemplazar la ruta antigua (en este ejemplo "D:\compiled_2014") por la nueva ruta "F:\compiled_Octubre_2016" de todos los archivos .iss que encuentre en la misma carpeta donde está ubicado.
Finalmente, el script en Inno Setup queda así:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
Compression=lzma2
SolidCompression=yes
OutputDir=D:\Generated Installers\
[Files]
Source: "F:\compiled_Octubre_2016\MyProg.exe"; DestDir: "{app}"
Source: "F:\compiled_Octubre_2016\MyProg.chm"; DestDir: "{app}"
Source: "F:\compiled_Octubre_2016\Readme.txt"; DestDir: "{app}"; Flags: isreadme
[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
El siguiente ejemplo muestra cómo se ven mis scripts de Inno Setup, en la realidad incluyen muchos muchos más archivos (tomado de los ejemplos que vienen con el Inno Setup):
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
Compression=lzma2
SolidCompression=yes
OutputDir=D:\Generated Installers\
[Files]
Source: "D:\compiled_2014\MyProg.exe"; DestDir: "{app}"
Source: "D:\compiled_2014\MyProg.chm"; DestDir: "{app}"
Source: "D:\compiled_2014\Readme.txt"; DestDir: "{app}"; Flags: isreadme
[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Para evitar tener que hacer el cambio de rutas a mano, me creé este script en Python:
import os
import sys
iss = [c for c in os.listdir(sys.path[0]) if ".iss" in c]
for i in iss:
fopen = open(i,'r')
fwrite = []
flines = fopen.readlines()
fopen.close()
for line in flines:
fwrite.append(line.replace("D:\compiled_2014", "F:\compiled_Octubre_2016"))
fopen = open(i,'w')
fopen.writelines(fwrite)
fopen.close()
Lo que hace este script en Python es reemplazar la ruta antigua (en este ejemplo "D:\compiled_2014") por la nueva ruta "F:\compiled_Octubre_2016" de todos los archivos .iss que encuentre en la misma carpeta donde está ubicado.
Finalmente, el script en Inno Setup queda así:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
Compression=lzma2
SolidCompression=yes
OutputDir=D:\Generated Installers\
[Files]
Source: "F:\compiled_Octubre_2016\MyProg.exe"; DestDir: "{app}"
Source: "F:\compiled_Octubre_2016\MyProg.chm"; DestDir: "{app}"
Source: "F:\compiled_Octubre_2016\Readme.txt"; DestDir: "{app}"; Flags: isreadme
[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
lunes, 28 de noviembre de 2016
Imprimir caracteres en consola con Visual C++
Al crear una aplicación de consola con Visual C++ Express encontré que no es tan intuituvo como creí (hay que importar más librerías de las que pensé, especialmente si se trabaja con arreglos de caracteres que se convierten a string). Al final, éste es el código que funcionó:
#include "stdafx.h"
#include <iostream>
#include<ostream >
#include <string >
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char* chararr = new unsigned char[256];
// ... asigno valores al array de caracteres...
string str;
str.assign((char*)chararr);
cout << "Look, I'm writting string values";
cout << str << "\n";
cout << "Look, I'm writting hexadecimal values";
for (unsigned long i = 0; i < 256; i++)
printf("%02X ", chararr[i]);
printf("\n");
}
#include "stdafx.h"
#include <iostream>
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char* chararr = new unsigned char[256];
// ... asigno valores al array de caracteres...
string str;
str.assign((char*)chararr);
cout << "Look, I'm writting string values";
cout << str << "\n";
cout << "Look, I'm writting hexadecimal values";
for (unsigned long i = 0; i < 256; i++)
printf("%02X ", chararr[i]);
printf("\n");
}
Etiquetas:
.Net Visual Studio,
C++,
Visual C++
martes, 25 de octubre de 2016
Cómo obtener información de la distro de Linux con Python 2.7
El siguiente código muestra en pantalla información sobre la distro de linux y la versión de java instalada en caso de existir:
import platform
import subprocess
print platform.architecture()
print platform.linux_distribution()
ret = subprocess.call('java -version', shell = True)
A continuación está lo que me imprimieron algunas distros:
centos 7 x64 por defecto:
('64bit', 'ELF')
('centos', '7.1.1503', 'Core')
java version "1.7.0_91"
OpenJDK Runtime Environment (rhel-2.6.2.1.el7_1-x86_64 u91-b00)
OpenJDK 64-Bit Server VM (build 24.91-b01, mixed mode)
Centos 6 x64 con Oracle Java 8:
('64bit', 'ELF')
('centos', '6.5', 'Final')
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
Ubuntu 14 x32 con Oracle Java 8:
('32bit', 'ELF')
('Ubuntu', '14.04', 'trusty')
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) Server VM (build 25.65-b01, mixed mode)
Linux Mint 17 x32 por defecto:
('32bit', 'ELF')
('LinuxMint', '17.2', 'rafaela')
java version "1.7.0_79"
OpenJDK Runtime Environment (IcedTea 2.5.5) (7u79-2.5.5-0ubuntu0.14.04.2)
OpenJDK Server VM (build 24.79-b02, mixed mode)
Codingground webpage ide:
('64bit', '')
('Fedora', '23', 'Twenty Three')
openjdk version "1.8.0_72"
OpenJDK Runtime Environment (build 1.8.0_72-b15)
OpenJDK 64-Bit Server VM (build 25.72-b15, mixed mode)
Ideone webpage ide:
('32bit', '')
('debian', 'stretch/sid', '')
import platform
import subprocess
print platform.architecture()
print platform.linux_distribution()
ret = subprocess.call('java -version', shell = True)
A continuación está lo que me imprimieron algunas distros:
centos 7 x64 por defecto:
('64bit', 'ELF')
('centos', '7.1.1503', 'Core')
java version "1.7.0_91"
OpenJDK Runtime Environment (rhel-2.6.2.1.el7_1-x86_64 u91-b00)
OpenJDK 64-Bit Server VM (build 24.91-b01, mixed mode)
Centos 6 x64 con Oracle Java 8:
('64bit', 'ELF')
('centos', '6.5', 'Final')
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
Ubuntu 14 x32 con Oracle Java 8:
('32bit', 'ELF')
('Ubuntu', '14.04', 'trusty')
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) Server VM (build 25.65-b01, mixed mode)
Linux Mint 17 x32 por defecto:
('32bit', 'ELF')
('LinuxMint', '17.2', 'rafaela')
java version "1.7.0_79"
OpenJDK Runtime Environment (IcedTea 2.5.5) (7u79-2.5.5-0ubuntu0.14.04.2)
OpenJDK Server VM (build 24.79-b02, mixed mode)
Codingground webpage ide:
('64bit', '')
('Fedora', '23', 'Twenty Three')
openjdk version "1.8.0_72"
OpenJDK Runtime Environment (build 1.8.0_72-b15)
OpenJDK 64-Bit Server VM (build 25.72-b15, mixed mode)
Ideone webpage ide:
('32bit', '')
('debian', 'stretch/sid', '')
Suscribirse a:
Entradas (Atom)




