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 :)

sábado, 7 de enero de 2017

Oracle 11g: Contraseña del usuario system ha expirado

Error Ora-28001, System user's password has expired.

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"

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");

}

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', '')

viernes, 2 de septiembre de 2016

Cómo evitar que C++ decore los nombres de las funciones de una dll

Agradezco la ayuda a:
http://stackoverflow.com/q/2804893
http://stackoverflow.com/q/1467144

Mi caso era que estaba compilando una dll en c++ con Visual Studio Express 2013 y encontré que, al intentar invocarla desde otra aplicación, el compilador decoraba los nombres de las funciones.
Para evitarlo, se deben declarar las funciones con extern "C":

En el archivo  .h:

extern "C" __declspec (dllexport) long SomeFunction(int param);

Y en el archivo .cpp respectivo:

extern "C" 
__declspec (dllexport) long SomeFunction(int param)
{
    return _somethingIwantToDo(param);
}


si se está depurando, es mejor dejar la opción de "Generar Información de Depuración" en "Si" o el depurador empezará a protestar:

Esto es mejor dejarlo en "Si".

Al colocar  extern "C" el compilador ya no decora los nombres de las funciones aunque la convención de llamada sea stdcall o cdecl:

 
Eso sí, la convención de llamada de la dll y la aplicación que la invoca debe ser la misma, o el compilador arrojará el error LNK2019 y de paso el LNK1120:


Cómo crear una ventana modal que envíe datos ingresados por el usuario en Java Swing

Agradezco la ayuda a:
http://stackoverflow.com/a/28461883
http://stackoverflow.com/a/4089370

En Netbeans, para poder crear una ventana modal para nuestra aplicación de Swing, se debe crear un nuevo JFrame Form, y en la línea donde se declara la clase:

public class JModalFrame extends javax.swing.JFrame

cambiarla por:

public class JModalFrame extends javax.swing.JDialog

y en el constructor se debe poner:

setModal(true);

Luego de añadir un área de texto, un checkbox y un botón a la ventana modal, el código para poder retornar valores desde esta ventana es:

    Object[] thoseValues;
   
    public Object[] showDialog()
    {
        return thoseValues;
    }
   
    public JModalFrame()
    {
        setModal(true);
        thoseValues = new Object[2];
        initComponents();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)                                        
    {                                            
        thoseValues[0] = jCheckBox1.isSelected();
        thoseValues[1] = jTextArea1.getText();
       
        setModal(false);
        this.setVisible(false);
    }                                       
    


Para abrir la ventana modal, se debe añadir el siguiente código en la ventana principal (en mi caso, es la ventana que está declarada como la clase main en las propiedades del proyecto en Netbeans):

    JModalFrame jMod = new JModalFrame();
    jMod.setVisible(true);
    Object[] thosevalues = jMod.showDialog();

    jMod.dispose();


Se pueden recibir cualquier tipo de valores, yo he elegido un array de objetos.

El proyecto de Netbenas se puede descargar de aquí. Corre en Java 8.

Si se desea que la ventana modal aparezca en la barra de tareas se debe añadir el siugiente código en su constructor:

// http://stackoverflow.com/a/14261194
super(null, java.awt.Dialog.ModalityType.TOOLKIT_MODAL);

lunes, 29 de agosto de 2016

Cómo hacer un Select en un Datatable con campos tipo DateTime

Esta pregunta la hice en StackOverflow en Español, he aquí el resumen:

Tengo un DataTable con dos campos "BirthDay" y "HireDay" del tipo DateTime, y quiero filtrar las filas que correspondan a dos fechas determinadas.
Siguiendo las instrucciones de este enlace armé mi query de la siguiente manera:

DateTime bday = new DateTime(2016, 8, 9);
DateTime hday = new DateTime(2016, 8, 10);

String query =
String.Concat("BirthDay=#", Convert.ToString(bday.Date), "# or HireDay=#", Convert.ToString(bday.Date), "#");
DataRow[] encontrados = miDatatable.Select(query);


Al ejecutar mi aplicación me lanza esta excepción:

Excepción no controlada del tipo 'System.FormatException' en mscorlib.dll
Información adicional: La cadena no se reconoce como DateTime válido. Hay una palabra desconocida al inicio del índice 24.

En cambio, si cambio manualmente el valor de la variable query a:
"BirthDay=#09/08/2016# or HireDay=#10/08/2016#"  
no me tira excepción, pero ya no me devuelve ninguna fila, a pesar de que sí tengo fechas en los campos "BirthDay" y "HireDay" iguales al 9 de agosto del 2016.

La solución me la dio Leandro Tuttini, el formato de fecha debe ser en-US, independientemente de la configuración regional del sistema operativo. La variable query debe armarse de la siguiente forma:

DateTime bday = new DateTime(2016, 8, 9);
DateTime hday = new DateTime(2016, 8, 10);

string query =  string.Format("BirthDay=#{0:MM/dd/yyyy}# or HireDay=#{1:MM/dd/yyyy}#", bday, hday);

DataRow[] encontrados = miDatatable.Select(query);


viernes, 22 de julio de 2016

Cambiando la codificación de un archivo de Python en Python Tools for Visual Studio 2013 Express

Como siempre olvido cómo ponerle la codificación UTF-8 a mis archivos de python he hecho este tutorial. Por defecto el IDE les pone codificación Ansi, sucede que a veces mis comentarios tienen acentos y el intérprete me tira error al ejecutarlos.

1. En la primera línea le ponemos la codificación deseada, en este caso es "# coding=utf-8". La codificación debe ir con el símbolo de numeral para que el intérprete la reconozca:



2. Vamor a Archivo->Guardar como...



3. Elegimos "Guardar con codificación..."



4. Elegimos la codificación "Unicode UTF-8":


De esta forma el intérprete no tirará error al poner comentarios con caracteres internacionales.

martes, 7 de junio de 2016

Detectar si un puerto está abierto en un host específico.

El código original es de Mark Ribaul, yo sólo lo arreglé para testear un puerto específico (probado en Windows 7):


from socket import *
import sys

# http://serverfault.com/a/311580

if __name__ == "__main__":
    fTimeOutSec = 1
    sNetworkAddress = sys.argv[1].split(":")[0]
    aiPort = sys.argv[1].split(":")[1]

    setdefaulttimeout(fTimeOutSec)

    print ("Starting Scan...")
   
    s = socket(AF_INET, SOCK_STREAM)
    result = s.connect_ex((sNetworkAddress, int(aiPort)))

    if (result == 0):
        print ("OPEN: " + sNetworkAddress + ":" + aiPort)

    elif (10035 == result):
        print ("Timeout or inexistent host")
        pass
    else:
        print ("closed: " + sNetworkAddress + ":" + aiPort)

    s.close()

    print ("Scan Completed.")



He puesto el script en un archivo llamado "scan_port.py", y los argumentos que se le pasan son la ip y el puerto separados por dos punto, es decir, de la siguiente manera: "ip:puerto":


Aquí estoy probando con localhost, pero también funciona para ips remotas.

sábado, 21 de mayo de 2016

Error en Visual Studio 2013, no se encontraron exportaciones que coincidieran con la restricción: ContractName

Un día quise abrir mi Visual Studio 2013 Express y me salió una ventana con el siguiente error:

"Error en Visual Studio 2013, no se encontraron exportaciones que coincidieran con la restricción: ContractName".

La solución se encuentra en esta web, pero en mi caso, al usar la versión Express, la carpeta a eliminar está en la ruta "C:\Users\User\AppData\Local\Microsoft\WDExpress\12.0":